点云 | 求异(附C++源码)

Posted 从0到1的点云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云 | 求异(附C++源码)相关的知识,希望对你有一定的参考价值。

前段时间,介绍了点云求异的一种思路,但那样做,不够精确,需要事先对点云进行相关的操作,结果准确度很依赖于配准精度。

今天介绍另外一种求异的思路,利用PCL的八叉树,直接对点云求异


思路如下:假设需要寻找点云中a,b点云的不同部分,我们首先建立a,b的八叉树,求异的精确度取决于你设置的八叉树的分辨率,一般来讲,分辨率越低,代表你的八叉树最后的叶子空间越小,结果也就越精确。但太小可能会导致相反效果,会使得结果跟b本身的数据量很接近,达不到效果。

然后比较a,b的树结构,对于a,b树结构不同的部分,就是我们要求的点云相异的点。


好在这一过程PCL中已经有函数了,我们只需要组织一下就能应用了。

#include <iostream>#include <pcl/point_cloud.h>#include <pcl/octree/octree.h>#include <vector>#include <ctime>//函数用来生成随机点void random_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud, int number){ srand((unsigned int)time(NULL)); (*cloud).height = 1;//random cloud flag (*cloud).width= number; (*cloud).points.resize(((*cloud).height)*((*cloud).width)); for (size_t i = 0; i < (*cloud).points.size(); i++) { (*cloud).points[i].x = 64.0f*rand() / (RAND_MAX + 1.0F); (*cloud).points[i].y = 64.0f*rand() / (RAND_MAX + 1.0F); (*cloud).points[i].z = 64.0f*rand() / (RAND_MAX + 1.0F); }}


int main(){ float resolution = 32.0f; pcl::octree::OctreePointCloudChangeDetector<pcl::PointXYZ> octree(resolution); pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA(new pcl::PointCloud<pcl::PointXYZ>); random_cloud(cloudA, 128); pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB(new pcl::PointCloud<pcl::PointXYZ>); random_cloud(cloudB, 5000); octree.setInputCloud(cloudA); octree.addPointsFromInputCloud();  octree.switchBuffers();//点云交换缓冲区,但a点云仍在八叉树内 octree.setInputCloud(cloudB); octree.addPointsFromInputCloud(); std::vector<int> new_point_index; octree.getPointIndicesFromNewVoxels(new_point_index); if (new_point_index.empty()!=0)    std::cout << "vector no points!"<<std::endl;; return 0;}

以上求得的是b-a的操作,即b相对于a增加的点号被保存在new_point_index里,实际上,并不能求得b相对a减少的点,若需要这样我们可以把程序的顺序颠倒一下,去求a-b的操作,两个综合起来就是相异部分了。

参考书籍:PCL点云库从入门到精通


以上是关于点云 | 求异(附C++源码)的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 实现点云累计-坐标系转换-目标范围点云提取(附代码与代码注释)

求出点云法向量有啥作用

基于C++的通讯录管理系统|附源码

点云数据集汇总整理(匠心之作,附官方下载地址)

点云数据集汇总整理(匠心之作,附官方下载地址)

点云数据集汇总整理(匠心之作,附官方下载地址)