- 平面分割实例
- 具体细节都在注释
- pcd文件在我发布的资源里 不用C币
#include <iostream>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h> //基于索引从点云中提取部分点云
#include <pcl/segmentation/sac_segmentation.h> //基于采样一致性分割的类的头文件
#include <pcl/ModelCoefficients.h>
#include <pcl/sample_consensus/method_types.h> //随机参数估计方法头文件
#include <pcl/sample_consensus/model_types.h> //模型定义头文
/*
* 基于
* 随机采样一致性
* 平面分割
* 2021.12.12 - guozi
*/
int main() {
/*
* 载入点云
*/
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("learn29.pcd", *cloud);
std::cout << "载入的点云大小 size = " << cloud->size() << std::endl;
/*
* 分割模型
*/
//采样一致性的分割
pcl::SACSegmentation<pcl::PointXYZ> seg;
//分割所产生的两个对象:储存模型参数 和 储存点的索引
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
//优化模型系数
seg.setOptimizeCoefficients(true);
//进行参数设置 :输入,模型,方法,阈值(距离平面方程这个距离以内的点会被选中)。
seg.setInputCloud(cloud);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.01);
//分割
//inliers中存放的是分割中选中的点的索引
//coefficients存放的是该分割模型的参数 就是一个平面方程
seg.segment(*inliers, *coefficients);
std::cout << "得到的平面大小 size = " << inliers->indices.size();
/*
* 将平面存放到点云cloud_plane中
* 将其他部分存放到cloud_other中
*/
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_plane(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_other(new pcl::PointCloud<pcl::PointXYZ>);
//按索引提取的对象 参数设置
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(inliers);
//提取平面
extract.setNegative(false); // true = 提取索引外的点 false = 提取索引内的点;
extract.filter(*cloud_plane);
//提取其他
extract.setNegative(true);
extract.filter(*cloud_other);
/*
* 可视化
*/
pcl::visualization::PCLVisualizer viewer("viewer");
//分别将两个点云放在同一个视窗中用不同的颜色可视化
//平面用红色表示
viewer.addPointCloud(cloud_plane, "cloud_plane");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 255, 0, 0, "cloud_plane");
//其他用蓝色表示
viewer.addPointCloud(cloud_other, "cloud_other");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 255, "cloud_other");
viewer.spin();
return 0;
}