锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

NormalEstimation法向量估计理论和代码---PCL源码笔记

时间:2023-07-23 11:37:00 300kg传感器accu

NormalEstimation

确定表面法线的问题与估计临近点拟合表面的相切面法线的问题相似,因此,转换后成为最小二乘法平面拟合的问题。估计表面法线的解决方案成为分析协方差矩阵的特征向量和特征值(或PCA-主成分析),协方差矩阵来自查询点近邻元素创建。最大主要成分是投影到某个方向后方差最大的方向(信息量最大的方向);法向量是投影到某个方向后信息量最小的方向,需要PCA将点云投影到特征值最小的方向。

这里有几个概念:

  • 平面的定义和点到直线的距离
  • 最小二乘法和主成分分析(PCA)
  • 协方差矩阵及其特征向量和特征值

法向量求解步骤

目标平面可以是一个点 x x x法向量 n ? \vec{n} n 还有一点 p i ∈ P k p_i \in P^k piPk 平面距离为:
d i = ( p i ? x ) ? n ? d_i = (p_i - x) \cdot \vec{n} di=(pix)n

即取平面上一点,平面外一点的到平面的距离,就是这两点组成的向量在法向量上面的投影。

如果点到平面的距离为0,即 d i = 0 d_i = 0 di=0,我们就可以求出平面的法向量了。因此通过以下步骤:

  1. 求所有点的质心 p k p^k pk
    x = p ˉ = 1 k ⋅ ∑ i = 1 k p i x = \bar{p} = \frac{1}{k} \cdot \sum_{i=1}^k p_i x=pˉ=k1i=1kpi

  2. 计算质心 p k p^k pk的协方差矩阵 C ∈ R 3 × 3 C \in \R^{3 \times 3} CR3×3,及其特征向量和特征值
    C = 1 k ∑ i = 1 k ϵ ⋅ ( p i − p ˉ ) ⋅ ( p i − p ˉ ) T , C ⋅ v j ⃗ = λ j ⋅ v j ⃗ , j ∈ { 0 , 1 , 2 } C = \frac{1}{k} \sum_{i=1}^k \epsilon \cdot (p_i - \bar{p}) \cdot (p_i - \bar{p})^T, C\cdot \vec{v_j} = \lambda_j \cdot \vec{v_j}, j\in \{0, 1, 2\} C=k1i=1kϵ(pipˉ)(pipˉ)T,Cvj =λjvj ,j{ 0,1,2}

    其中 ϵ \epsilon ϵ通常为1。 C C C是对称和半正定矩阵且它的特征值是实数 λ j ∈ R \lambda_j \in \R λjR。特征向量 v j ⃗ \vec{v_j} vj 形成了orthogonal frame, 相对应于质心 p k p^k pk的主成分(principal components)。 如果 0 ≤ λ 0 ≤ λ 1 ≤ λ 2 0 \leq \lambda_0 \leq \lambda_1 \leq \lambda_2 0λ0λ1λ2最小特征值 λ 0 \lambda_0 λ0的特征向量 v 0 ⃗ \vec{v_0} v0 就是法向量 + n ⃗ = { n x , n y , n z } + \vec{n} = \{n_x, n_y, n_z\} +n ={ nx,ny,nz}或者 − n ⃗ - \vec{n} n 的近似。 或者, n ⃗ \vec{n} n 可以在球坐标系下用 ϕ , θ \phi, \theta ϕ,θ表示:
    ϕ = arctan ⁡ ( n z n y ) , θ = arctan ⁡ ( n y 2 + n z 2 ) n x \phi = \arctan (\frac{n_z}{n_y}) , \theta = \arctan \frac{\sqrt{(n_y^2+n_z^2)}}{n_x} ϕ=arctan(nynz),θ=arctannx(ny2+nz2)

    可以看到,通过主成分分析法(PCA)来计算它的方向具有二异性,无法对整个点云数据集的法向方向进行一致性定向。 如下图所示:

    在这里插入图片描述

  3. 计算法向与视点
    解决这个问题的办法就是使用视点 V p V_p Vp。对所有法线 n i ⃗ \vec{n_i} ni 定向只需要使它们一致朝向视点的方向,满足下面的方程式:
    n i ⃗ ⋅ ( V p − p i ) > 0 \vec{n_i} \cdot (V_p - p_i) > 0 ni (Vppi)>0

PCL法向量估计

先来看看PCL法向量估计的模板。通常包含以下步骤:

  • 设置输入点云,及其索引方法
  • 设置临近点的半径
  • 计算法向量
#include 
#include 
 
{ 
        
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

  ... read, pass in or create a point cloud ...

  // Create the normal estimation class, and pass the input dataset to it
  pcl 

相关文章