PCL 获得两片空间对齐点云的差距

说明:

本篇博客的目的是利用PCLclass pcl::SegmentDifferences< PointT >类来获得两片空间对齐点云的差异,可以用来分割出空间中突然多出来的某些点云。
所用的配置 VS2015+PCL1.8.1+kinectV2

代码如下:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/progressive_morphological_filter.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/segmentation/segment_differences.h>
#include <pcl/kdtree/kdtree.h>
using namespace std;

typedef pcl::PointXYZRGB PointType;

int main(int argc, char** argv)
{
	pcl::PointCloud<PointType>::Ptr cloud1(new pcl::PointCloud<PointType>);   //用于最初始读取文件
	pcl::PointCloud<PointType>::Ptr cloud2(new pcl::PointCloud<PointType>);   //用于最初始读取文件
					
	pcl::PointCloud<PointType>::Ptr cloud_different(new pcl::PointCloud<PointType>);  //用来存储两片点云之间的差异
	pcl::SegmentDifferences<PointType> seg;  //创建分割对象(使用曲面法线进行平面分割的类)
	pcl::search::KdTree<PointType>::Ptr tree(new pcl::search::KdTree<PointType>());

	if (pcl::io::loadPCDFile<PointType>("D:/diffenent_f1.pcd", *cloud1) == -1) //* load the file
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd \n");
		return (-1);
	}
	if (pcl::io::loadPCDFile<PointType>("D:/diffenent_b1.pcd", *cloud2) == -1) //* load the file
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd \n");
		return (-1);
	}

	seg.setSearchMethod(tree);//设置搜索时所用的搜索机制
	seg.setDistanceThreshold(0.0004);//设置两组点云中的对应点之间允许的距离上限
	seg.setInputCloud(cloud2);
	seg.setTargetCloud(cloud1);//设置与setinputcloud中给的点云进行比较的一组点云
	seg.segment(*cloud_different);//得到两组点云之间的差异
	cout << "segment success" << endl;

	//可视化
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_orig(new pcl::visualization::PCLVisualizer("3D Viewer front"));
	viewer_orig->addPointCloud<PointType>(cloud_different, "cloud different - Original picture");//可视化差异点云
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_orig1(new pcl::visualization::PCLVisualizer("3D Viewer behind"));
	viewer_orig1->addPointCloud<PointType>(cloud1, "cloud1 - Original picture");//可视化变化之前的点云
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_orig2(new pcl::visualization::PCLVisualizer("3D Viewer different"));
	viewer_orig2->addPointCloud<PointType>(cloud2, "cloud2 - Original picture");//可视化变化之后的点云
	while (!viewer_orig1->wasStopped())
	{
		viewer_orig1->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	system("pause");
	return 0;
}

运行结果

点云1cloud1
cloud2
cloud2
在这里插入图片描述
cloud_different

说明

代码中已经给了详细的注释,有一个要说明的问题是,这个代码的运行速度在我的电脑上比较慢,需要一分多钟,而在老师电脑上需要几十秒,我想说的是,不要运行程序的时候等了会儿看不到结果出来就以为错了。还有,这个运行速度确实有些慢,不知道是代码自身的原因还是因为什么,可能压缩一下点云会好一点,欢迎大家留言交流。

需要上面代码所用到的数据集的朋友可以私聊我 qq:3038079997
  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值