计算点云中每个点的法线?

时间:2013-04-24 14:57:18

标签: c++ math normals point-clouds

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

编辑* 我有一系列点(x,y,z)形成一个点云(称为A),它形成一个半球的形状。我还有另一个点云(称为B),我在其中安装了一个表面,形成了另一个适合A内部的半球。我想测量这些表面彼此相距多远的长度,所以我的计划是将射线从A中的每个点投射到表面B并测量到该点的交点。我希望这个解释能让我的问题更清楚。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

你有一个网格,以便你知道一个点连接到哪个其他本地点?

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

答案 1 :(得分:0)

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

  2. 如果两个网格是任意的,那么我能想到的最好的算法是首先将两个点云放在同一个八叉树中。从这里,您可以迭代网格A中的每个点并找到网格B中的最近点。“两个网格之间的最小距离”是迭代后2点之间找到的最小距离。

  3. 2的替代方案只是蛮力迭代所有点:

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

答案 2 :(得分:0)

我用Python开发了code,它将计算点云的每个点的法线。您可以使其适应C ++。

-基本上,您是根据您的点附近的k个点来计算单值分解。

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

-然后采用方差较小的方向(与最小特征值关联的特征向量)。该特征向量是通过k点(包括P点)的平面的法线。最后,对点云的每个点重复此操作。