点云中每个点的欧氏距离

euclidean distance for each point in a point cloud

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

"sign" 的最后一位来自 this 论文。我添加它是因为我想知道我的点是在另一个点云的内部还是外部。 (我收到了来自 STL 文件的点云,它们代表了表面)

由于我正在处理大约 200.000 到 3.000.000 点的相当大的点云,计算需要一段时间,我想知道是否有人可以建议优化我的代码。 也许它可以被矢量化,但我没有看到它。
欢迎您提出所有建议。提前感谢您的宝贵时间和帮助。

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

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

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

我相信以下内容对签名有效,但您应该验证结果。可能需要根据矩阵形状略微调整。

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

另一种选择是使用 KdTree's. This is also the approach of PCL

使用这种方法,您基本上可以从参考点云创建一个 KdTree,然后对每个点执行 最近邻搜索来自查询点云。

这种方法比蛮力方法快很多。