PCL点云:点云分割_采样一致性分割_平面分割_实例1

  • 平面分割实例
  • 具体细节都在注释
  • 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;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

おすすめ

転載: blog.csdn.net/weixin_42585456/article/details/121886498