PCL教程指南-估计点云法向量

PCL教程指南-Estimating Surface Normals in a PointCloud(估计点云法向量)

  • 官方原文档
  • 点云法向指每个点的法向量,它是基于各点所在邻域范围内估计而出,常用方法如最小二乘估计邻域平面进而求出法向量,PCA求解邻域协方差最小特征向量等。具体详细原理另行查询。
  • 文档代码注释与接口扩展
#include 
#include 

{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

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

  //法向估计类(此处泛型指应用位置XYZ坐标的数据求解出法向量坐标结果)
  pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
  ne.setInputCloud (cloud);

  // 创建Kdtree对象
  // 以Kdtree形式组织输入的数据,以便内部查询各点邻域
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
  ne.setSearchMethod (tree);

  // 输出集,pcl::Normal法向点类型即保存法向量的XYZ坐标,其中0-2个分量为XYZ坐标,第3个分量为曲率
  pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

  // 设置各点查询的邻域范围
  ne.setRadiusSearch (0.03);

  // 计算法向量
  ne.compute (*cloud_normals);

  // cloud_normals->size () should have the same size as the input cloud->size ()*
}

接口扩展

  • 文档中法向求解方法,继承自pcl::Feature类,他利用输入的点云和组织的方式即Kdtree进行特征求解,即PCA方法求法向的方式,需要注意的是邻域不满足条件的将无法计算法向会被设置为NAN,所以计算法向后后续处理要考虑NAN情况及时过滤
  • 除此之外,法向估计类还提供了预设点的估计平面和法向方法,根据参数不同有两种重载方法,具体方法及参数说明如下:

bool pcl::NormalEstimation< PointInT, PointOutT >::computePointNormal	(	
const pcl::PointCloud< PointInT > & 	cloud,//输入 点云
const std::vector< int > & 	indices,//输入 需要计算的点的索引
Eigen::Vector4f & 	plane_parameters,//输出 平面参数
float & 	curvature //输出 曲率 \[ \lambda_0 / (\lambda_0 + \lambda_1 + \lambda_2) \]
)	
bool pcl::NormalEstimation< PointInT, PointOutT >::computePointNormal	(	
const pcl::PointCloud< PointInT > & 	cloud,
const std::vector< int > & 	indices,
float & 	nx,//输出 法向x
float & 	ny,//输出 法向y
float & 	nz,//输出 法向z
float & 	curvature//曲率 
)	
  • 法向朝向,可以通过设置视点来控制,可以利用传感器原点或自定义。默认使用传感器原点

源码扩展

  • 通过对源码解读,发现法向估计方法不只在法向估计类中实现,并且在pcl命名空间下可独立使用,归属于特征模块,即pcl::computePointNormal参数和上述相同。
  • 源码中计算时发现两个常用的封装好的方法,如下:
方法 作用
pcl::computeMeanAndCovarianceMatrix 计算平均值和协方差矩阵( #include
pcl::solvePlaneParameters 可根据协方差矩阵计算平面参数或法向量(#include > )

你可能感兴趣的:(点云处理,pcl)