PCL点云处理之基于octree的点云空间变化检测(四十五)
前言
一、空间变化检测?
- 前言
- 一、空间变化检测?
- 二、使用步骤
- 1.代码
- 2.效果
- 总结
比如树木生长或者新建设施,都会引起点云的空间变化,如新增。
octree是一种用于管理稀疏3D数据的树状数据结构,学习如何利用octree实现用于多个无序点云之间的空间变化检测,这些点云可能在尺寸、分辨率、密度和点顺序等方面有所差异。通过递归地比较octree的树结构,可以鉴定出由octree产生的体素组成之间的区别所代表的空间变化
二、使用步骤 1.代码
#include
//这头文件直接全垒上来算了,省的麻烦
#include //标准C++库中的输入输出
#include //PCD文件的读写
#include //点类型定义
#include //点云类定义
#include //KD-Tree搜索
/*common模块*/
#include //标准的C以及C++类,是其他common 函数的父类;getMinMax3D()函数所需头文件,获得点云三维坐标的最值
#include //定义了标准的C接口的角度计算函数
#include //定义了中心点的估算以及协方差矩阵的计算
#include //定义标准的C接口用于计算距离
#include //定义了一些文件帮助写或者读方面的功能。
#include //定义一些随机点云生成的函数
#include //定义一些基本的几何功能的函数
#include //定义了线与线相交的函数
#include //定义了标准的C方法计算矩阵的正则化
#include //定义了时间计算的函数
/*surface模块*/
#include //最小二乘平滑处理
#include //创建凹多边形
#include //贪婪投影三角化算法
#include
/*feature模块*/
#include //法线特征估计
#include //法线特征估计加速
#include //PFH特征估计
#include //FPFH特征估计
#include //FPFH特征估计加速
#include //VFH特征估计
#include //NARF特征估计
#include //边界提取
#include
/*registration模块*/
#include //ICP配准
#include //非线性ICP配准
#include //NDT配准
#include //变换矩阵
#include //sac-ia类头文件
#include //直方图配准
#include //特征的错误对应关系去除
#include //随机采样一致性去除
/*filters模块*/
#include //滤波相关头文件
#include //滤波相关类头文件
#include //滤波相关类头文件,点云投影
#include //索引提取
#include //基于体素网格化的滤波
#include //体素网格过滤器滤波
#include //统计离群点
/*segmentation模块*/
#include //采样一致性模型
#include //随机参数估计方法
#include //模型定义
#include //基于采样一致性分割
#include //区域生长头文件
#include //基于颜色的区域生长
#include //超体聚类
#include //基于凹凸性分割
/*visualization模块*/
#include //CloudViewer类可视化
#include
#include
/*range_image模块*/
#include //深度图像相关
#include
/*Eigen模块*/
#include
#include
/*console模块*/
#include
#include
#include
#include //IO相关头文件
#include //boost指针相关头文件
#include //点表示相关头文件
#include //OpenNI数据流获取类相关头文件
//这里有重复的自己删一删把
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace Eigen;
int main(int argc, char** argv) {
//octree 变化检测器
float resolution = 0.1f;//八叉树体素分辨率
pcl::octree::OctreePointCloudChangeDetector octree(resolution);//创建检测类的对象
//创建点云容器
pcl::PointCloud::Ptr cloud1(new pcl::PointCloud);//待检测点云1
pcl::PointCloud::Ptr cloud2(new pcl::PointCloud);//待检测点云2
pcl::PointCloud::Ptr cloud12_bianhua(new pcl::PointCloud);//发生变化的点云12,这里应该是2中新增的点云
//加载点云
pcl::io::loadPCDFile("D:\\shuju\\c1.pcd", *cloud1);
pcl::io::loadPCDFile("D:\\shuju\\c2.pcd", *cloud2);
//构建八叉树
octree.setInputCloud(cloud1);//输入点云cloud1
octree.addPointsFromInputCloud();//点云cloud1构建八叉树
octree.switchBuffers();//交换八叉树缓存,但是cloud1对应的八叉树结构仍在内存中
octree.setInputCloud(cloud2);//输入点云cloud2
octree.addPointsFromInputCloud();//点云cloud2构建八叉树
//变化点云输出
std::vector newPointIdxVector;//存储新加点的索引
octree.getPointIndicesFromNewVoxels(newPointIdxVector);//获取新增点的索引
//将新增点按照索引从cloud2中取出,放到cloud12_bianhua中
for (size_t i = 0; i push_back(cloud2->points[newPointIdxVector[i]]);
}
//保存文件
pcl::io::savePCDFileASCII("result.pcd", *cloud12_bianhua);//将计算结果存放到result.pcd
std::cout setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud1_cloud");//PCL_VISUALIZER_POINT_SIZE点大小设置,
viewer2->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 1, 1, "cloud1_cloud"); //PCL_VISUALIZER_COLOR颜色设置 RGB
boost::shared_ptr viewer(new pcl::visualization::PCLVisualizer("点云变化12")); //创建视窗对象,定义标题栏名称“3D Viewer”
viewer->addPointCloud(cloud2, "cloud2_cloud"); //将点云添加到视窗对象中,并定义对应的ID“original_cloud”
//用于改变显示点云的尺寸,可以利用该方法控制点云在视窗中的显示方法,1设置显示点云大小
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud2_cloud");//PCL_VISUALIZER_POINT_SIZE点大小设置,
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 1, 1, "cloud2_cloud"); //PCL_VISUALIZER_COLOR颜色设置 RGB
viewer->addPointCloud(cloud12_bianhua, "cloud12_bianhua_cloud"); //将点云添加到视窗对象中,并定义对应的ID“original_cloud”
//用于改变显示点云的尺寸,可以利用该方法控制点云在视窗中的显示方法,1设置显示点云大小
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "cloud12_bianhua_cloud");//PCL_VISUALIZER_POINT_SIZE点大小设置,
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0.5, "cloud12_bianhua_cloud"); //PCL_VISUALIZER_COLOR颜色设置 RGB
//防止显示窗口一闪而过
while (!viewer1->wasStopped())
{
viewer1->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
while (!viewer2->wasStopped())
{
viewer2->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
system("pause");
return 0;
}
2.效果
cloud1 cloud2
cloud变化的点 红色,2相对1新增的点
只能检测出点云2相对于点云1新增的点。减少的点就检测不到了