注意:本示例为PCL中寻找对应点对的基础方法,无需输入法向量或者直方图等其他特征,直接输入点云就可计算。
1.原理
PCL源代码中没有相关论文名称,也没有某种算法的关键字。无从查找原理。所以本示例不介绍原理。
但本方法在点对匹配中较常用。
2.关键函数
(1)本类类名
pcl::registration::CorrespondenceEstimation<pcl::PointXYZ, pcl::PointXYZ, pcl::Normal> registration;
3.代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/registration/correspondence_estimation.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
int main()
{
/****************寻找对应点对********************/
pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>); // 源点云
pcl::PointCloud<pcl::PointXYZ>::Ptr target(new pcl::PointCloud<pcl::PointXYZ>); // 目标点云
pcl::io::loadPCDFile("D:/code/csdn/data/plane.pcd", *source);
pcl::io::loadPCDFile("D:/code/csdn/data/plane1.pcd", *target);
// 寻找对应点对
pcl::registration::CorrespondenceEstimation<pcl::PointXYZ, pcl::PointXYZ, pcl::Normal> registration;
registration.setInputSource(source);
registration.setInputTarget(target); // 设置目标点云
pcl::Correspondences correspondences;
registration.determineCorrespondences(correspondences, 5); // 对应点结果和匹配点之间的最短距离
/****************展示********************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("CorrespondenceEstimationBackProjection"));
viewer->addPointCloud<pcl::PointXYZ>(source, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(source, 0, 255, 0), "source");
viewer->addPointCloud<pcl::PointXYZ>(target, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(target, 255, 0, 0), "target");
viewer->addCorrespondences<pcl::PointXYZ>(source, target, correspondences, "correspondence");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}