您当前的位置: 首页 > 

点云学徒

暂无认证

  • 4浏览

    0关注

    76博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

PCL点云处理之无序点云的空间变化检测octree(四十五)

点云学徒 发布时间:2022-01-09 20:44:55 ,浏览量:4

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新增的点。减少的点就检测不到了

关注
打赏
1658151620
查看更多评论
立即登录/注册

微信扫码登录

0.0377s