PCL 寻找点云对应点对关系(Registration_CorrespondenceEstimation)

注意:本示例为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;
}

4.结果展示

PCL中,可以使用`pcl::registration::TransformationEstimationSVD`类中的`estimateRigidTransformation`方法进行点云匹配,并使用`pcl::registration::CorrespondenceEstimation`类中的`determineReciprocalCorrespondences`方法计算匹配点对。根据匹配点对,可以使用以下代码计算匹配准确率: ```cpp #include <pcl/registration/transformation_estimation_svd.h> #include <pcl/registration/correspondence_estimation.h> // 假设我们有两个点云A和B,需要找到它们之间的对应关系 pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA(new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB(new pcl::PointCloud<pcl::PointXYZ>); // ... 从文件或传感器中读取点云数据,将数据存储到cloudA和cloudB中 ... // 使用SVD算法进行点云匹配 pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ> svd; Eigen::Matrix4f transform; svd.estimateRigidTransformation(*cloudA, *cloudB, transform); // 计算匹配点对 pcl::registration::CorrespondenceEstimation<pcl::PointXYZ, pcl::PointXYZ> est; est.setInputSource(cloudA); est.setInputTarget(cloudB); pcl::Correspondences correspondences; est.determineReciprocalCorrespondences(correspondences); // 计算匹配准确率 int TP = 0, FP = 0; for (int i = 0; i < correspondences.size(); ++i) { int idx1 = correspondences[i].indexQuery; int idx2 = correspondences[i].indexMatch; float dist = (cloudA->points[idx1].getVector4fMap() - cloudB->points[idx2].getVector4fMap() * transform).norm(); if (dist < threshold) // 阈值为允许的匹配误差范围 ++TP; else ++FP; } float accuracy = (float)TP / (TP + FP); std::cout << "匹配准确率:" << accuracy << std::endl; ``` 需要注意的是,这里使用的是直接计算点之间的距离来判断匹配准确性,因此需要设置一个允许的匹配误差范围`threshold`,只有当匹配距离小于该阈值时才认为是正确匹配点对。同时,我们也可以根据具体需求,对匹配准确率的计算方法进行更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值