PCL 基于法线信息查找匹配点对

一、概述

  PCL中的 pcl::registration::CorrespondenceEstimationNormalShooting函数用于计算目标点云中与输入点云的法向量具有最小距离的对应点。在估算点对应关系时,主要使用点云中的法向量信息,特别是法向量方向,来估算点云之间的对应关系。它在点对应时通过法向量信息,提高配准的精度,尤其在具有曲率或复杂几何形状的点云上效果显著。

二、代码

#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_normal_shooting.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>);			// 目标点云
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("lamp.pcd", *source) == -1 ||
		pcl::io::loadPCDFile<pcl::PointXYZ>("lamp1.pcd", *target) == -1)
	{
		PCL_ERROR("Couldn't read the PCD files!\n");
		return -1;
	}

	// 基于法线信息寻找对应点对
	pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
	ne.setNumberOfThreads(8);
	ne.setInputCloud(source);
	ne.setSearchMethod(tree);
	ne.setKSearch(50);
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	ne.compute(*normals);
	// 获取匹配点对
	pcl::registration::CorrespondenceEstimationNormalShooting<pcl::PointXYZ, pcl::PointXYZ, pcl::Normal> registration;
	registration.setInputSource(source);
	registration.setSourceNormals(normals);		// 设置源点云法线
	registration.setInputTarget(target);		// 设置目标点云
	registration.setKSearch(50);				// 设置邻域搜索的点个数
	pcl::Correspondences correspondences;
	registration.determineCorrespondences(correspondences, 1.5);// 对应点结果和匹配点之间的最短距离

	// 输出结果到渲染窗口可视化
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("CorrespondenceEstimationNormalShooting"));
	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;
}

三、结果

在这里插入图片描述

PCL中,可以使用`pcl::registration::CorrespondenceEstimation`类实现基于汉明距离的特征匹配,并获取匹配对。下面是一个简单的C++代码示例,用于计算两个云之间的汉明距离特征匹配,并获取匹配对: ```cpp #include <pcl/point_cloud.h> #include <pcl/features/pfh.h> #include <pcl/search/kdtree.h> #include <pcl/registration/correspondence_estimation.h> typedef pcl::PFHSignature125 FeatureT; typedef pcl::PointCloud<FeatureT> FeatureCloudT; int main() { // 加载云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("cloud1.pcd", *cloud1); pcl::io::loadPCDFile("cloud2.pcd", *cloud2); // 计算云的PFH描述子 pcl::PFHEstimation<pcl::PointXYZ, pcl::Normal, FeatureT> estimator; pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>); pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); tree->setInputCloud(cloud1); estimator.setInputCloud(cloud1); estimator.setInputNormals(normals); estimator.setSearchMethod(tree); FeatureCloudT::Ptr cloud1_features(new FeatureCloudT); estimator.compute(*cloud1_features); // 定义特征匹配pcl::registration::CorrespondenceEstimation<FeatureT, FeatureT> matcher; matcher.setInputSource(cloud1_features); matcher.setInputTarget(cloud2_features); pcl::CorrespondencesPtr correspondences(new pcl::Correspondences); // 设置匹配参数 matcher.setSearchMethodTarget(tree); matcher.setKSearch(10); // 执行特征匹配 matcher.determineReciprocalCorrespondences(*correspondences); // 获取匹配对 for (auto& correspondence : *correspondences) { int index1 = correspondence.index_query; int index2 = correspondence.index_match; // TODO: 处理匹配对 } return 0; } ``` 在上述代码中,首先使用`pcl::PFHEstimation`类计算云的PFH描述子,然后使用`pcl::registration::CorrespondenceEstimation`类进行特征匹配,并获取匹配对。其中,`determineReciprocalCorrespondences`函数返回匹配结果,保存在`correspondences`指针中。可以使用`index_query`和`index_match`成员变量获取匹配对的索引。 需要注意的是,在实际应用中,通常需要对汉明距离进行归一化处理,以便将其转换为相似度分数。可以使用`pcl::registration::CorrespondenceEstimation`类的`setEuclideanFitnessEpsilon`函数设置匹配器的归一化距离阈值,以控制匹配精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值