欢迎点云相关产学研的学者和团体加入我们。
本小节将学习如何将点投影到一个参数化模型上(例如平面或球等)。参数化模型通过一组参数来设定,对于平面来说,使用其等式形式ax+by+cz+d=0,在PCL中有特意存储常见模型系数的数据结构。
首先,在PCL(Point Cloud Learning)中国协助发行的书[1]提供光盘的第8章例4文件夹中,打开名为project_inliers.cpp的代码文件。
下面解析打开源代码的关键语句。我们先声明了ModelCoefficients结构和ProjectInliers滤波器对应头文件。
#include// 模型系数定义头文件
#include// 投影滤波类头文件
随后我们创建了点云结构,填充了相应的的值,并将其内容打印出来。
cloud->width=5;
cloud->height=1;
cloud->points.resize(cloud->width*cloud->height);
for(size_t i=0;i<cloud->points.size();++i)
{
cloud->points[i].x=1024*rand()/(RAND_MAX+1.0f);
cloud->points[i].y=1024*rand()/(RAND_MAX+1.0f);
cloud->points[i].z=1024*rand()/(RAND_MAX+1.0f);
}
std::cerr<<"Cloud before projection: "<<std::endl;
for(size_t i=0;i<cloud->points.size();++i)
std::cerr<<" "<<cloud->points[i].x<<" "
<<cloud->points[i].y<<" "
<<cloud->points[i].z<<std::endl;
填充ModelCoefficients的值,本例中我们使用一个ax+by+cz+d=0的平面模型,其中a=b=d=0,c=1,换句话说,也就是X-Y平面,用户可以任意定义PCL中支持的模型圆球、圆柱、锥形等进行投影滤波。
//定义模型系数对象,并填充对应的数据
pcl::ModelCoefficients::Ptrcoefficients(new pcl::ModelCoefficients());
coefficients->values.resize(4);
coefficients->values[0]=coefficients->values[1]=0;
coefficients->values[2]=1.0;
coefficients->values[3]=0;
创建了ProjectInliers对象,并使用刚才定义好的ModelCoefficients作为投影对象的模型参数。
pcl::ProjectInliers<pcl::PointXYZ> proj; //创建投影滤波对象
proj.setModelType(pcl::SACMODEL_PLANE); //设置对象对应的投影模型
proj.setInputCloud(cloud); //设置输入点云
proj.setModelCoefficients(coefficients); //设置模型对应的系数
proj.filter(*cloud_projected); //执行投影滤波存储结果cloud_projected
最后我们打印出投影后的云。
std::cerr<<"Cloud after projection: "<<std::endl;
for(size_t i=0;i<cloud_projected->points.size();++i)
std::cerr<<" "<<cloud_projected->points[i].x<<" "
<<cloud_projected->points[i].y<<" "
<<cloud_projected->points[i].z<<std::endl;
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:
...>project_inliers.exe
你会看到如图1所示类似的结果,投影前的z轴都不为0,是随机产生的值,投影之后,打印结果表明,xy没有改变,z都变为0,符合程序的逻辑,该投影滤波类输入为点云和投影模型,输出为投影到模型上之后的点云。
图1 点云投影到平面示例运行结果
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社 2012-10