点云处理技术之PCL滤波器——参数化模型(投影点云,pcl::ProjectInliers)
Posted 非晚非晚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云处理技术之PCL滤波器——参数化模型(投影点云,pcl::ProjectInliers)相关的知识,希望对你有一定的参考价值。
参数化模型就是设定一个函数模型,将输入的点云投影至函数模型上,例如ax + by + cz + d = 0,从而达到点云过滤的形式(其实点云的大小并不会发生改变
)。
下列代码提取的是XY平面内的点云,所以a=b=d=0,c=1。
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/filters/project_inliers.h>
#include <pcl/io/pcd_io.h>
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>);
// Fill in the cloud data
cloud->width = 5;
cloud->height = 1;
cloud->points.resize(cloud->width * cloud->height);
// for (auto &point : *cloud)
//
// point.x = 1024 * rand() / (RAND_MAX + 1.0f);
// point.y = 1024 * rand() / (RAND_MAX + 1.0f);
// point.z = 1024 * rand() / (RAND_MAX + 1.0f);
//
pcl::PCDReader reader;
reader.read("../../pcd/rabbit.pcd", *cloud); // 读取pcd文件,相对路径(相对于可执行文件的位置)
std::cerr << "Cloud before projection: " << cloud->points.size()<< std::endl;
// for (const auto &point : *cloud)
// std::cerr << " " << point.x << " "
// << point.y << " "
// << point.z << std::endl;
// Create a set of planar coefficients with X=Y=0,Z=1
//使用ax+by+cz+d=0*面模型,其中 a=b=d=0,c=1 也就是XY平面
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
coefficients->values.resize(4);
coefficients->values[0] = coefficients->values[1] = 0;
coefficients->values[2] = 1.0;
coefficients->values[3] = 0;
// Create the filtering object
pcl::ProjectInliers<pcl::PointXYZ> proj; //创建投影滤波对象
proj.setModelType(pcl::SACMODEL_PLANE); //设置投影模型,这里是平面模型
proj.setInputCloud(cloud); //输入点云
proj.setModelCoefficients(coefficients); //加入系数
proj.filter(*cloud_projected); //存储结果
pcl::PCDWriter writer; //保存pcd文件
writer.write<pcl::PointXYZ>("../../pcd/project_inliers.pcd", *cloud_projected, false);
std::cerr << "Cloud after projection: " <<cloud_projected->points.size()<< std::endl;
// for (const auto &point : *cloud_projected)
// std::cerr << " " << point.x << " "
// << point.y << " "
// << point.z << std::endl;
return (0);
输出结果如下,点云的个数并没有发生改变。
Cloud before projection: 35947
Cloud after projection: 35947
原始点云显示如下,它是一个3维点云组成的兔子。
使用参数化投影后,是一个平面点云组成的兔子。
参考:https://pcl.readthedocs.io/projects/tutorials/en/latest/project_inliers.html#project-inliers
以上是关于点云处理技术之PCL滤波器——参数化模型(投影点云,pcl::ProjectInliers)的主要内容,如果未能解决你的问题,请参考以下文章
点云处理技术之PCL滤波器——体素滤波器(pcl::VoxelGrid)
点云处理技术之PCL滤波器——提取索引的点云(pcl::ExtractIndices)
点云处理技术之PCL滤波器——直通滤波器(pcl::PassThrough)
点云处理技术之PCL滤波器——离群点滤波(statisticalOutlierRemovalConditionalRemoval 和RadiusOutlinerRemoval)