参数化模型投影,可以将一个点云投影到一个参数模型上,如平面、球面等,参数化模型通过一组参数来设定,对于平面来说,ax+by+cz=0
12.1 代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/filters/project_inliers.h>
#if 1
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);
// 填入点云数据
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;
// 创建一个系数为Z=0的平面 ax+by+cz+d=0
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients()); // 定义模型对象,并填充对应数据
coefficients->values.resize(4);//创建4个元素
coefficients->values[0] = coefficients->values[1] = 0;//a=b=0
coefficients->values[2] = 1.0;//c=1
coefficients->values[3] = 0;//d=0 --->故z=0
pcl::ProjectInliers<pcl::PointXYZ> proj; // 创建投影滤波对象
proj.setModelType(pcl::SACMODEL_PLANE); // 设置对象对应的投影模型,本次代码使用的是面的所以是SACMODEL_PLANE
proj.setInputCloud(cloud); // 设置输入点云
proj.setModelCoefficients(coefficients); // 设置模型对应的系数
proj.filter(*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;
return (0);
}
#endif