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

  • Post author:
  • Post category:其他




说明:

本篇博客的目的是利用

PCL



class 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;
}



运行结果

点云1
cloud1

cloud2

cloud2

在这里插入图片描述

cloud_different



说明

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



需要上面代码所用到的数据集的朋友可以私聊我 qq:3038079997



版权声明:本文为qq_43622114原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。