PCL自动求解平面法向量参数化表示

参考:

https://blog.csdn.net/u011021773/article/details/78247657

通常我们需要估计平面的方向,这就需要用到法线了,法线就是指垂直平面的线。

PCL中有自动求出法线的方法,我们来看一看,

首先假设我们有一个平面的点云cloud_xyz

要求出法线首先我们先定义一个法线估计的对象ne

pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;

然后把要求的平面点云传给他

ne.setInputCloud (cloud_xyz);

这个方法求出cloud_xyz上每个点的法线方向,他是根据每个点附近的点云组成的平面求出的,所以我们需要设置一个半径,用来估计附近多大的范围取点来算平面,

ne.setRadiusSearch (0.05);

最后定义一个normal的对象来接受计算出来的法线

pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

计算并把结果保存在cloud_normals里
ne.compute (*cloud_normals);
这时算出来的法线就在这个对象里了,他里面的元素是和点云一一对应的,我们要访问每个点的法线方向,可以这样

for(int ix=0;ix<cloud_normals->points.size();ix++)
{
if(isnan(cloud_normals->points[ix].normal_x)||
isnan(cloud_normals->points[ix].normal_y)||
isnan(cloud_normals->points[ix].normal_z))
{
continue;
}
}

这里的isnan是判断法线是否为nan,因为如果一个点周围找不到足够的点计算平面,则法线中会赋值为nan,如果需要直接当作数字来用的同学们一定要注意这一点,使用我这种方法来判断。normal_x就是法线的x方向了,y z同理。然后PCL算出的法线是不知道正方向的,所以这点需要人为去判断正负。最后平面的法向量是各个点法向量和的平均。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容