当前位置: 首页 > Linux

pcl的FPFH注册

时间:2023-04-06 03:32:31 Linux

什么是fpfh特征快速点云直方图(fpfh)特征的数学描述这里就不介绍了,大家可以查看fpfh。也可以查看PCL官网的说明。中文版可以直接搜索pclChinafpfh。主程序还是一堆头文件(当然很多头文件这里用不到,可以自己删除)#include#include#include#include#include#include#include#include#include#include#include#include//包含omp对于fpfh加速计算(多核并行计算)#include#include//去除特征错误对应#include//随机采样一致性去除#include#includepointcloud;typedefpcl::PointCloud点法线l;typedefpcl::PointCloudfpfhFeature;为了使用fpfp特征匹配,声明一个计算fpfh特征点的函数:fpfhFeature::Ptrcompute_fpfh_feature(pointcloud::Ptrinput_cloud,pcl::search::KdTree::Ptrtree){//法向量pointnormal::Ptrpoint_normal(newpointnormal);pcl::NormalEstimationest_normal;est_normal.setInputCloud(input_cloud);est_normal.setSearchMethod(树);est_normal.setKSearch(10);est_normal.compute(*point_normal);//fpfh估计fpfhFeature::Ptrfpfh(newfpfhFeature);//pcl::FPFHEstimationest_target_fpfh;pcl::FPFHEStimationOMPest_fpfh;est_fpfh.setNumberOfThreads(4);//指定4核计算//pcl::search::KdTree::Ptrtree4(newpcl::search::KdTree());est_fpfh.set输入云(输入云);est_fpfh.setInputNormals(point_normal);est_fpfh.setSearchMethod(树);est_fpfh.setKSearch(10);est_fpfh.compute(*fpfh);返回fpfh;计算点集的法向量(法向量是点云的一个很重要的特征,应该单独处理,这里只是为了方便,少写两行代码,封装在FPFH特征的计算中),根据计算FPFH特征和计算fpfh特征的时候,相邻点集的个数不容易取的太大,否则会导致计算量的增加,第二个会进行计算fpfh的无意义(和其他特征计算一样,太大的邻点集无法反映局部特征)。主函数数:intmain(intargc,char**argv){if(argc<3){cout<<"请输入两个点云"<::Ptr树(新的pcl::search::KdTree());fpfhFeature::Ptrsource_fpfh=compute_fpfh_feature(source,tree);fpfhFeature::Ptrtarget_fpfh=compute_fpfh_feature(target,tree);//对齐(占用了大部分时间)pcl::SampleConsensusInitialAlignmentsac_ia;sac_ia.setInputSource(来源);sac_ia.setSourceFeatures(source_fpfh);sac_ia.setInputTarget(目标);sac_ia.setTargetFeatures(target_fpfh);pointcloud::Ptr对齐(新点云);//sac_ia.setNumberOfSamples(20);//设置每次迭代计算使用的样本数(可以保存),可以节省时间sac_ia.setCorrespondenceRandomness(6);//设置计算协方差时选择多少个邻居点,值越大,辅助防御差异越准确,但计算效率越低。(可以保存)sac_ia.align(*align);结束=时钟();cout<<"计算时间为:"<view(newpcl::visualization::PCLVisualizer("fpfhtest"));诠释v1;诠释v2;查看->createViewPort(0,0.0,0.5,1.0,v1);查看->createViewPort(0.5,0.0,1.0,1.0,v2);view->setBackgroundColor(0,0,0,v1);查看->setBackgroundColor(0.05,0,0,v2);pcl::visualization::PointCloudColorHandlerCustomsources_cloud_color(source,250,0,0);view->addPointCloud(source,sources_cloud_color,"sources_cloud_v1",v1);pcl::visualization::PointCloudColorHandlerCustomtarget_cloud_颜色(目标,0,250,0);view->addPointCloud(target,target_cloud_color,"target_cloud_v1",v1);view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"sources_cloud_v1");pcl::visualization::PointCloudColorHandlerCustomaligend_cloud_color(final,255,0,0);view->addPointCloud(align,aligend_cloud_color,"aligend_cloud_v2",v2);view->addPointCloud(target,target_cloud_color,"target_cloud_v2",v2);view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,4,"aligend_cloud_v2");view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2,"target_cloud_v2");//view->addCorrespondences(source,target,*cru_correspondences,"correspondence",v1);//添加显示对应点对while(!view->wasStopped()){//view->旋转();查看->旋转一次(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}pcl::io::savePCDFile("crou_output.pcd",*align);//pcl::io::savePCDFile("final_align.pcd",*final);return0;}使用FPFH特征配准,效果不错,但是计算效率很低,特别是对于大规模的点云数据。对原始点云进行简化,对简化后的数据进行配准计算,将得到的配准参数应用到原始点云中,提高计算效率。体素网格简化主程序://pcl::ApproximateVoxelGridapproximate_voxel_grid;pcl::VoxelGridapproximate_voxel_grid;approximate_voxel_grid.setLeafSize(0.5,0.5,0.5);//网格边缘长。这里的值越大,越精简(剩下的数据少)pointcloud::Ptrsource(newpointcloud);pointcloud::Ptrsample_sources(新点云);approximate_voxel_grid.setInputCloud(来源);approximate_voxel_grid.filter(*sample_source);cout<<"sourcevoxelgridFiltecloudsizeis"<size()<类;第二,pcl::VoxelGrid类。可以看出,第二个比第一个更“近似”,这意味着第二个在某些情况下比第一个更准确。原因是:第一种方法是用体素网格的中心(长方体的中心)来代替原来的点,而第二种方法是对体素网格中的所有点进行平均,用期望的平均点来替换原来的点集可视化在上面的主程序中,已经包含了可视化功能。更多可视化可以看我的博客pcl可视化。在这里,我将详细谈谈如何添加对应点对的可视化功能。要可视化对应关系,首先需要计算对应关系。本文以注册为例:pcl::registration::CorrespondenceEstimationcrude_cor_est;boost::shared_ptrcru_correspondences(新的pcl::Correspondences);crude_cor_est.setInputSource(source_fpfh);crude_cor_est.setInputTarget(target_fpfh);//crude_cor_est.determineCorrespondences(cru_correspondences);crude_cor_est.determineReciprocalCorrespondences(*cru_correspondences);cout<<"原始大小为:"<size()<