4PCS、Super4PCS简介

目录

一、前言

二、4PCS简介

2.1 计算比例因子

2.2 寻找对应的一致全等四点

2.3 寻找最优全等四点对

三、Super4PCS简介

3.1 排除无效点

3.2 在一定范围内找匹配对

四、总结

4.1 代码

4.2 实验结果展示


一、前言

        和前面的PFH和FPFH一样,super4PCS也是在4PCS的基础上进行了改良,4PCS和super4PCS都是通过找出目标点云和原始点云中对应的两组点进行旋转平移求解出T,然后在众多的候选T中选择一组最大重合的T,具有随机性。4PCS和super4PCS通过对应的同一平面四点组仿射不变性去找。该方法适用于重叠区域较小或者重叠区域发生较大变化场景点云配准。

二、4PCS简介

        给定两个点云P,Q,首先在点云Q中随机选择3个点,再根据点云P,Q的重叠比例选择距离3个点足够远的第四个近似共面点组成共面四点基B。根据仿射不变比从点云P中提取出所有在一定距离d内可能与B相符合的4点集合U,计算B和U的变换矩阵。

2.1 计算比例因子

        计算四点的比例因子r1,r2,两比例因子在点云旋转和平移变换中具有仿射不变性,同时就是依靠他的仿射不变性,对点云进行配准。这是比例因子计算方法:
                                    r1 = ||a − e|| /|| a − b||
                                    r2 = ||c − e|| /|| c − d||

2.2 寻找对应的一致全等四点

        计算所有Q中两点云的交点坐标,e1约等于e2表示寻找到对应的一致全等四点。
对于Q中的每对点 q1, q2,计算两个中间点:
                                    e1 = q1 + r1(q2 - q1)
                                    e2 = q1 + r2(q2 - q1) 

        在图中,q1和q4的连线的中间点与q3和q5的连线的中间点相交,说明找到了对应的一致全等四点,将找到的所以对应的一致全等四点组成一个集合。

2.3 寻找最优全等四点对

        在全等四点集中寻找最优全等四点对(即计算旋转和平移的参数),根据最优全等四点对计算两个点云的变换矩阵。然后运用到全局点云转化,完成粗配准。

        任何两对点,如果它们的中间点(一个由 r1 得到,另一个由 r2 得到)重合。选定四个特征点后,算法会计算它们之间的相对关系,如距离和角度。然后,在另一个点云中寻找与这四个特征点具有类似关系的点组。通过找到匹配的点组,算法可以估计点云之间的变换矩阵,从而实现点云的配准。

三、Super4PCS简介

3.1 排除无效点

        记录两直线相交的角度,在点集中寻找匹配时,额外计算两条直线相交的角度是否在一定范围内,从而排除一些无效的匹配。

3.2 在一定范围内找匹配对

        类似于在球面上画圆,以P中的一个点为球心,以原来在Q中找到的两条线段的长度为半径去画球,在球面内的点是满足要求的。

四、总结

4.1 代码

        注意代码中,导入的是带法向量的点云。同时此代码需要用cmake配置环境。

#include <iostream>
#include <pcl/registration/ia_fpcs.h>
#include <gr/algorithms/match4pcsBase.h>
#include <gr/algorithms/FunctorSuper4pcs.h>
#include <pcl/registration/super4pcs.h>
#include <gr/algorithms/match4pcsBase.h>
#include <gr/algorithms/FunctorSuper4pcs.h>
#include <pcl/registration/super4pcs.h>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/registration/ia_kfpcs.h>
#include <time.h>
#include <boost/thread/thread.hpp>
#include <pcl/console/time.h>   // 控制台计算时间
#include <fstream>

using namespace std;

int main(int argc, char** argv)
{
	pcl::console::TicToc time;
	// -----------------加载目标点云---------------------
	pcl::PointCloud<pcl::PointNormal>::Ptr target_cloud(new pcl::PointCloud<pcl::PointNormal>);
	if (pcl::io::loadPLYFile<pcl::PointNormal>("C:\\Users\\Administrator\\Desktop\\data2\\target.ply", *target_cloud) == -1)
	{
		PCL_ERROR("读取目标点云失败 \n");
		return (-1);
	}
	cout << "从目标点云中读取 " << target_cloud->size() << " 个点" << endl;

	// ------------------加载源点云---------------------
	pcl::PointCloud<pcl::PointNormal>::Ptr source_cloud(new pcl::PointCloud<pcl::PointNormal>);
	if (pcl::io::loadPLYFile<pcl::PointNormal>("C:\\Users\\Administrator\\Desktop\\data2\\source.ply", *source_cloud) == -1)
	{
		PCL_ERROR("读取源标点云失败 \n");
		return (-1);
	}
	cout << "从源点云中读取 " << source_cloud->size() << " 个点" << endl;
	time.tic();
	//--------------初始化S4PCS配准对象-------------------
	pcl::Super4PCS<pcl::PointNormal, pcl::PointNormal>s4pcs;
	s4pcs.setInputSource(source_cloud);  // 源点云
	s4pcs.setInputTarget(target_cloud);  // 目标点云
	s4pcs.setOverlap(0.3);         // 设置源和目标之间的近似重叠度。0.7
	s4pcs.setDelta(1.5);                // 设置常数因子delta,用于对内部计算的参数进行加权。
	s4pcs.setMaxTimeSeconds(500);  // 设置最大计算时间(以秒为单位)。
	s4pcs.setSampleSize(5000);       // 设置验证配准效果时要使用的采样点数量 200 1000 5000
	pcl::PointCloud<pcl::PointNormal>::Ptr pcs(new pcl::PointCloud<pcl::PointNormal>);
	s4pcs.align(*pcs);                   // 计算变换矩阵

	double overlap = s4pcs.getOverlap(); // 假设存在一个名为 getOverlap 的方法用于获取重叠度
	cout << "Overlap value: " << overlap << endl;

	cout << "s4pcs配准用时: " << time.toc() / 1000 << " s" << endl;
	cout << "得分:" << s4pcs.getFitnessScore() << endl;
	cout << "变换矩阵:\n" << s4pcs.getFinalTransformation() << endl;
	std::ofstream outputFile("C:\\Users\\Administrator\\Desktop\\RT.txt");
	if (outputFile.is_open())
	{
		outputFile << s4pcs.getFinalTransformation() << std::endl;
		outputFile.close();
	}
	else
	{
		std::cerr << "Failed to open output file" << std::endl;
		return -1;
	}
	// 使用创建的变换对为输入点云进行变换
	//pcl::PointCloud<pcl::PointXYZ>::Ptr source_tr(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::transformPointCloud(*source_cloud, *pcs, s4pcs.getFinalTransformation());
	//pcl::transformPointCloud(*source_cloud, *source_tr, s4pcs.getFinalTransformation());
	// 保存转换后的源点云作为最终的变换输出
	/*pcl::io::savePLYFileASCII("D:\\Multi-View Registration\\Multi-View Registration\\data\\U3M_1\\data_2\\Super4pcs_trans.ply", *pcs);*/

	// 初始化点云可视化对象
	boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("显示点云"));
	viewer->setBackgroundColor(0, 0, 0);  //设置背景颜色为黑色

	// 对目标点云着色可视化 (red).
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointNormal>target_color(target_cloud, 255, 0, 0);
	viewer->addPointCloud<pcl::PointNormal>(target_cloud, target_color, "target cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "target cloud");
	// 对源点云着色可视化 (blue).
	//pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>input_color(source_cloud, 0, 0, 255);
	//viewer->addPointCloud<pcl::PointXYZ>(source_cloud, input_color, "input cloud");
	//viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "input cloud");
	// 对转换后的源点云着色 (green)可视化.
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointNormal>output_color(pcs, 0, 255, 0);
	viewer->addPointCloud<pcl::PointNormal>(pcs, output_color, "output cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "output cloud");
	// 等待直到可视化窗口关闭
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(1000));
	}

	return (0);
}

4.2 实验结果展示

<think>好的,用户想了解Super4PCS算法在点云配准中的实现和应用。首先,我需要回顾一下相关的引用内容,确保回答准确。引用1提到Super4PCS通过采样和匹配点云数据实现粗配准。引用2和3则补充了算法改进的关键技术和开源库的信息。 首先,我应该从算法的基础开始解释,比如它是如何基于4PCS改进的。然后,分步骤说明实现过程,包括采样、基元提取、一致性验证等。这里需要结合引用中的关键技术,比如分层采样、优化基元提取和高效验证。 接下来,应用场景部分需要涵盖三维重建、机器人导航等领域,引用中的例子如三维扫描模型对齐和自动驾驶的环境感知可以作为例子。此外,用户可能关心如何实际使用这个算法,所以需要提到PCL库中的具体模块,如pcl::Super4PCS,并给出简单的代码示例,这能帮助用户快速上手。 在注意事项部分,要强调参数调整和噪声处理,这在实际应用中很重要。引用中提到的大规模场景和效率问题也应该在这里提到,确保用户了解适用场景和潜在挑战。 生成相关问题时,需要覆盖算法原理、优化、对比、参数调整、应用案例和挑战,这样用户可以根据兴趣进一步探索。同时,确保所有数学公式正确使用LaTeX格式,比如基元提取的相似性度量可能需要用到公式,但当前问题中没有涉及具体数学表达式,所以暂时不需要添加。 最后,检查回答结构是否清晰,是否符合用户的要求,确保引用正确标注,比如引用[^1]和[^2]。确认没有使用任何Markdown格式,语言自然口语化,分步骤说明让用户容易理解。</think>### Super4PCS算法实现点云配准的步骤 Super4PCS算法是一种基于四点一致性集合(4-Point Congruent Sets, 4PCS)的高效点云配准方法,主要用于粗配准。其核心思想是通过寻找两组点云中几何特征相似的四点基元(coplanar 4-point bases)来估计刚体变换参数。以下是其实现步骤: 1. **点云采样** 对输入的两组点云(源点云$P$和目标点云$Q$)进行随机采样,减少计算量。采样时采用分层策略,优先选择几何特征显著的点(如曲率较高的区域)[^2]。 2. **基元提取与匹配** 在源点云$P$中随机选择一个四点基元$B_p$(四个共面点),并计算其边长比例、对角线长度等几何特征。在目标点云$Q$中搜索所有与$B_p$几何特征一致的四点基元集合$\{B_q\}$[^3]。 3. **一致性验证** 对每个候选基元对$(B_p, B_q)$,计算其对应的刚体变换矩阵$T$(旋转矩阵$R$和平移向量$t$)。通过统计验证(如哈希加速)筛选出最优变换,使得变换后的点云与目标点云的重叠区域最大化。 4. **迭代优化** 重复上述步骤多次,选择重叠度最高的变换矩阵作为最终配准结果。若未达到预设阈值,则调整采样策略或参数后重新迭代。 --- ### 应用场景 1. **三维重建**:将多个扫描视角的点云对齐,生成完整模型。 2. **机器人导航**:实时匹配传感器数据与地图,定位机器人位置[^2]。 3. **自动驾驶**:通过LiDAR点云配准实现环境感知与障碍物跟踪。 --- ### 代码示例(基于PCL库) ```cpp #include <pcl/registration/super4pcs.h> // 初始化Super4PCS配准对象 pcl::Super4PCS<PointT> super4pcs; super4pcs.setInputSource(source_cloud); super4pcs.setInputTarget(target_cloud); // 设置参数(重叠度、采样数等) super4pcs.setOverlap(0.8); super4pcs.setNumberOfSamples(200); // 执行配准并获取变换矩阵 Eigen::Matrix4f transformation; super4pcs.align(transformation); ``` --- ### 注意事项 - **参数调优**:重叠度(`overlap`)、采样数(`samples`)等参数需根据场景调整。 - **噪声处理**:对含噪声的点云需预处理(如滤波)以提高配准鲁棒性。 - **效率与精度平衡**:可通过限制最大迭代次数或降低采样密度加速计算。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值