点云中每个点的欧式距离

时间:2018-12-05 18:34:03

标签: matlab point-clouds euclidean-distance

我想计算一个点云中每个点与第二个点云中所有其他点之间的最小欧氏距离。
我的点云分别命名为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

带有“符号”的最后一位来自this论文。我添加它是因为我想知道我的点在另一个点云之内还是之外。 (我从STL文件中收到了点云,它们代表了表面)

由于我正在处理大约200.000至3.000.000点的较大点云,因此计算需要一段时间,我想知道是否有人可以建议对我的代码进行优化。 也许可以将其矢量化,但我看不到。
欢迎您提出所有建议。预先感谢您的时间和帮助。

编辑:只是为了澄清。我的点云矩阵中的每一行都是一个点。第一列是x-,第二列是y-,第三列是z值。

2 个答案:

答案 0 :(得分:1)

您当然可以矢量化的形式进行操作,如下所示使用pdist2min

dmat = pdist2(pc1, pc2);
[dist, ind] = min(dmat);

我相信以下内容适用于签名,但是您应该验证结果。可能必须根据矩阵形状稍作调整。

sign = sum(Np(ind,:).*(pc2-pc1(ind,:)), 2);

答案 1 :(得分:0)

另一种替代方法是使用KdTree。这也是PCL的方法。

使用这种方法,您基本上是从参考点云创建 KdTree ,然后对查询点云中的每个点进行最近邻居搜索

这种方法比暴力方法要快得多。