我想计算一个点云中的每个点与第二个点云中所有其他点之间的最小欧氏距离
我的点云分别命名为pc1和pc2。Np是每个点的法向量的矩阵。
如果我使用以下代码:
dist = zeros(size(pc2,1),1);
sign = zeros(size(pc2,1),1);
for i = 1:size(pc2,1)
d = (pc1(:,1)-pc2(i,1)).^2 + (pc1(:,2)-pc2(i,2)).^2 + (pc1(:,3) - pc2(i,3)).^2;
[d, ind] = min(d);
dist(i,1) = sqrt(d);
sign(i,1) = Np(ind,:)*(pc2(i,:)-pc1(ind,:))';
end
最后一个带"符号"的部分来自本文。我添加它是因为我想知道我的点是在另一个点云的内部还是外部。(我从STL文件中收到了点云,它们表示曲面(
由于我使用的是大约200.000到3.000.000点的较大点云,计算需要一段时间,我想知道是否有人可以建议对我的代码进行优化。也许它可以矢量化,但我没有看到。
欢迎您的所有建议。提前感谢您的时间和帮助。
编辑:只是为了清除。我的点云矩阵中的每一行都是一个点。第一列是x-,第二列是y-,第三列是z-值。
您当然可以以矢量化的形式执行此操作,使用pdist2
和min
,如下所示。
dmat = pdist2(pc1, pc2);
[dist, ind] = min(dmat);
我相信以下对签名有效,但你应该验证结果。可能需要根据矩阵形状进行微调。
sign = sum(Np(ind,:).*(pc2-pc1(ind,:)), 2);
另一种选择是使用KdTree的。这也是PCL的方法。
使用这种方法,基本上可以从参考点云中创建KdTree,然后对查询点云中的每个点执行最近邻搜索。
这种方法将比暴力方法快很多。