说明:
本篇博客的目的是利用
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;
}
运行结果
cloud1
cloud2
cloud_different
说明
代码中已经给了详细的注释,有一个要说明的问题是,这个代码的运行速度在我的电脑上比较慢,需要一分多钟,而在老师电脑上需要几十秒,我想说的是,不要运行程序的时候等了会儿看不到结果出来就以为错了。还有,这个运行速度确实有些慢,不知道是代码自身的原因还是因为什么,可能压缩一下点云会好一点,欢迎大家留言交流。
需要上面代码所用到的数据集的朋友可以私聊我 qq:3038079997
版权声明:本文为qq_43622114原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。