PCL RANSAC去除地面点云+可视化

RANSAC分割点云地面部分+可视化

win10操作系统PCL1.8.1+vs2015

程序主要用分割算法将地面点云和目标点云分割成两个部分然后输出目标点云,然后再可视化彩色点云的过程。可自行修改迭代次数和阙值,就是那个500和0.05,代码我自己跑过了,能用,那个阙值0.05自行修改。

以下是源码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;

void detectObjectsOnCloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud, pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud_filtered)
{
	if (cloud->size() > 0)
	{
		//------------------------------------------PCL分割框架--------------------------------------------------------   
		//创建分割时所需要的模型系数对象,coefficients及存储内点的点索引集合对象inliers
		pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
		pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
		// 创建分割对象
		pcl::SACSegmentation<pcl::PointXYZRGB> seg;
		// 可选择配置,设置模型系数需要优化
		seg.setOptimizeCoefficients(true);
		// 必要的配置,设置分割的模型类型,所用的随机参数估计方法,距离阀值,输入点云
		seg.setModelType(pcl::SACMODEL_PLANE);//设置模型类型
		seg.setMethodType(pcl::SAC_RANSAC);//设置随机采样一致性方法类型
		seg.setMaxIterations(500);//最大迭代次数
		seg.setDistanceThreshold(0.005);//设定距离阀值,距离阀值决定了点被认为是局内点是必须满足的条件
		seg.setInputCloud(cloud);//输入所需要分割的点云对象
		//引发分割实现,存储分割结果到点几何inliers及存储平面模型的系数coefficients
		seg.segment(*inliers, *coefficients);
		//---------------------------------------------------------------------------------------------------------------
		if (inliers->indices.size() == 0)
		{
			cout << "error! Could not found any inliers!" << endl;
		}
		// extract ground
		// 从点云中抽取分割的处在平面上的点集
		pcl::ExtractIndices<pcl::PointXYZRGB> extractor;//点提取对象
		extractor.setInputCloud(cloud);
		extractor.setIndices(inliers);
		extractor.setNegative(true);
		extractor.filter(*cloud_filtered);
		// vise-versa, remove the ground not just extract the ground
		// just setNegative to be true
		cout << "filter done." << endl;
	}
	else
	{
		cout << "no data!" << endl;
	}
}

int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);

	// Fill in the cloud data
	pcl::PCDReader reader;//PCD文件读取对象
	// Replace the path below with the path where you saved your file
	reader.read<pcl::PointXYZRGB>("5.21.pcd", *cloud);//“”内内容修改成你想分割的点云的文件名
	detectObjectsOnCloud(cloud, cloud_filtered);//执行上面定义的分割函数
	/*pcl::PCDWriter writer;
	writer.write<pcl::PointXYZ>("pointcloud_files/000000_filtered.pcd", *cloud_filtered, false);*///和下面一行一样都是保存分割后点云的
	pcl::io::savePCDFile("1cloud.pcd", *cloud_filtered);
	cout << "Point cloud saved." << endl;
	//---------------------------------------------------------PCL可视化-----------------------------------------------
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("cloud show"));
	int v1 = 0;
	int v2 = 1;

	viewer->createViewPort(0, 0, 0.5, 1, v1);
	viewer->createViewPort(0.5, 0, 1, 1, v2);
	viewer->setBackgroundColor(0, 0, 0, v1);
	viewer->setBackgroundColor(0, 0, 0, v2);

	pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
	viewer->addPointCloud(cloud, "cloud", v1);
	viewer->addPointCloud(cloud_filtered, "want cloud", v2);
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(10000));
	}
	return (0);
}

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
pcd雷达点云数据的处理和障碍物识别是计算机视觉领域的一个重要应用方向。下面我将为你介绍一种基于Python和PCL(Point Cloud Library)库的点云数据障碍物识别方法,并可视化并标出障碍物。 1. 安装PCL库 PCL是一个通用的点云数据处理库,使用它可以很方便地对点云数据进行处理和分析。安装PCL库可以参考官方文档:https://pointclouds.org/downloads/ 2. 读取pcd文件 在Python中,我们可以使用PCL库中的`pcl.io.loadPCDFile()`函数读取pcd文件。读取后的点云数据存储在`pcl.PointCloud`对象中,可以通过`to_array()`方法将其转换为NumPy数组。 ```python import pcl cloud = pcl.PointCloud() pcl.io.loadPCDFile("example.pcd", cloud) points = cloud.to_array() ``` 3. 点云滤波 点云滤波可以去除噪声和离群点,以提高后续障碍物识别的准确性。这里我们使用统计滤波器进行滤波,可以通过设置滤波器的均值、标准差等参数来控制滤波效果。 ```python # 创建统计滤波器 filter = cloud.make_statistical_outlier_filter() # 设置滤波器参数 filter.set_mean_k(50) # 设置每个点的邻居数量 filter.set_std_dev_mul_thresh(1.0) # 设置标准差倍数 # 执行滤波 cloud_filtered = filter.filter() points_filtered = cloud_filtered.to_array() ``` 4. 点云分割 点云分割可以将点云数据分成若干个部分,每个部分代表一个障碍物。这里我们使用基于平面模型的分割算法,将地面和障碍物分开。 ```python # 创建分割器 seg = cloud_filtered.make_segmenter() seg.set_optimize_coefficients(True) # 优化平面模型系数 seg.set_model_type(pcl.SACMODEL_PLANE) # 设置模型类型为平面 seg.set_method_type(pcl.SAC_RANSAC) # 设置随机采样一致性算法 seg.set_distance_threshold(0.01) # 设置距离阈值 # 执行分割 inliers, coefficients = seg.segment() ``` 5. 可视化障碍物 障碍物识别完成后,我们可以使用Matplotlib库将障碍物可视化,并标出各个障碍物的位置和大小。 ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 绘制原始点云 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(points[:,0], points[:,1], points[:,2], s=0.1) # 绘制障碍物 for i in range(len(coefficients)): mask = inliers == i obstacle = points_filtered[mask] ax.scatter(obstacle[:,0], obstacle[:,1], obstacle[:,2], s=1) plt.show() ``` 至此,我们完成了基于Python和PCL库的pcd雷达点云数据障碍物识别、可视化并标出障碍物的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值