计算点云中每个点的法线

Computing normals at each point in a point-cloud?

本文关键字:计算      更新时间:2023-10-16

我有一系列的点形成一个点云。我需要计算每个点的法向量然后从这个点向法向量的方向投射一条射线。在这种情况下,我需要用什么公式来计算法向量呢?

编辑*我有一系列的点(x, y, z)形成了一个点云(称为a),它形成了一个半球体的形状。我还有另一个点云(叫它B),我在它上面放了一个表面,形成了另一个半球体,它可以放在a里面。我想测量这些表面彼此之间的距离,所以我的计划是从a中的每个点投射一束射线到表面B,然后测量与该点的交点。我希望这个解释能使我的问题更清楚。

谢谢你的帮助!

您是否有一个网格,以便您知道一个点连接到哪些其他局部点?

在这种情况下,该点的法线是在该点相遇的每对线之间的叉积的平均值(即归一化为1的单位向量)。

我用Python开发了一个代码,它将计算点云每个点的法线。你可以把它改编成c++。

-基本上你从你的点附近的k个点计算单值分解。

它将为您提供有关方差在何处较大和较小的信息。

-然后取方差较小的方向(与最小特征值相关的特征向量)。这个特征向量是通过你的k点(包括你的点P)的平面的法线。最后,对点云的每个点重复这个。

  1. 能否建立两个网格之间的对应关系?也就是说,对于网格A中的每一个点,由于平移/缩放/旋转,在网格B中有一个对应的点在不同的位置。如果是这样,那么您可以使用Procustes Analysis来查找两个云之间的最佳平移/缩放/旋转转换矩阵。在OP提供的示例中,缩放矩阵可以显示两个网格之间的距离。

  2. 如果两个网格是任意的,那么我能想到的最好的算法是首先将两个点云放在同一个oct-tree中。从这里开始,你可以遍历网格A中的每个点,并找到网格b中最近的点。"两个网格之间的最小距离"是迭代后两个点之间的最小距离。

2的替代方法是简单的暴力迭代所有的点:

double min=BIG_NUMBER;
for(Point a : meshA)
   for(Point b : meshB)
       if(dist(a,b)<min) min=dist(a,b);