点云 | 求异(附C++源码)
Posted 从0到1的点云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云 | 求异(附C++源码)相关的知识,希望对你有一定的参考价值。
前段时间,介绍了点云求异的一种思路,但那样做,不够精确,需要事先对点云进行相关的操作,结果准确度很依赖于配准精度。
今天介绍另外一种求异的思路,利用PCL的八叉树,直接对点云求异
思路如下:假设需要寻找点云中a,b点云的不同部分,我们首先建立a,b的八叉树,求异的精确度取决于你设置的八叉树的分辨率,一般来讲,分辨率越低,代表你的八叉树最后的叶子空间越小,结果也就越精确。但太小可能会导致相反效果,会使得结果跟b本身的数据量很接近,达不到效果。
然后比较a,b的树结构,对于a,b树结构不同的部分,就是我们要求的点云相异的点。
好在这一过程PCL中已经有函数了,我们只需要组织一下就能应用了。
//函数用来生成随机点
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++源码)的主要内容,如果未能解决你的问题,请参考以下文章