博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com
PCL系列
- PCL系列——读入PCD格式文件操作
- PCL系列——将点云数据写入PCD格式文件
- PCL系列——拼接两个点云
- PCL系列——从深度图像(RangeImage)中提取NARF关键点
- PCL系列——如何可视化深度图像
- PCL系列——如何使用迭代最近点法(ICP)配准
- PCL系列——如何逐渐地配准一对点云
- PCL系列——三维重构之泊松重构
- PCL系列——三维重构之贪婪三角投影算法
- PCL系列——三维重构之移动立方体算法
- PCL系列——平面模型分割
说明
代码
#include <iostream>
#include <pcl/ModelCoefficients.h> //模型系数
#include <pcl/io/pcd_io.h> //输入输出
#include <pcl/point_types.h> //点云(类型)
#include <pcl/sample_consensus/method_types.h> //随机样本一致性算法 方法类型
#include <pcl/sample_consensus/model_types.h> //随机样本一致性算法 模型类型
#include <pcl/segmentation/sac_segmentation.h> //随机样本一致性算法 分割方法
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ> cloud; //创建点云对象,用于存储点云数据
//填充点云数据
cloud.width = 15;
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 = 1.0;
}
//设置几个局外点
cloud.points[0].z = 2.0;
cloud.points[3].z = -2.0;
cloud.points[6].z = 4.0;
//显示点云数量和坐标信息
std::cerr << "Point cloud data: " << cloud.points.size () <<" points" << 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;
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); //存储输出的模型的系数
pcl::PointIndices::Ptr inliers (new pcl::PointIndices); //存储内点,使用的点
//创建分割对象
pcl::SACSegmentation<pcl::PointXYZ> seg;
//可选设置
seg.setOptimizeCoefficients (true);
//必须设置
seg.setModelType (pcl::SACMODEL_PLANE); //设置模型类型,检测平面
seg.setMethodType (pcl::SAC_RANSAC); //设置方法【聚类或随机样本一致性】
seg.setDistanceThreshold (0.01);
seg.setInputCloud (cloud.makeShared ());
seg.segment (*inliers, *coefficients); //分割操作
if (inliers->indices.size () == 0)//根据内点数量,判断是否成功
{
PCL_ERROR ("Could not estimate a planar model for the given dataset.");
return (-1);
}
//显示模型的系数
std::cerr << "Model coefficients: " << coefficients->values[0] << " "
<<coefficients->values[1] << " "
<<coefficients->values[2] << " "
<<coefficients->values[3] <<std::endl;
//显示估计平面模型过程中使用的内点
std::cerr << "Model inliers: " << inliers->indices.size () << std::endl;
for (size_t i = 0; i < inliers->indices.size (); ++i)
std::cerr << inliers->indices[i] << " " <<cloud.points[inliers->indices[i]].x << " "
<<cloud.points[inliers->indices[i]].y << " "
<<cloud.points[inliers->indices[i]].z << std::endl;
return (0);
}
运行结果
参考
《点云库PCL学习教程》 14章