社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

汇总!三维点云配准算法,包括4PCS、K-4PCS、SAC-IA、ICP、PCA、深度学习方法等

3DCV • 1 年前 • 434 次点击  

1 什么是点云配准

点云配准指的是输入两幅点云 Ps (source) 和 Pt (target),输出一个变换矩阵T(即旋转R和平移t)使得 T(Ps)和Pt的重合程度尽可能高。我们可以把点云想象成由无数个三维点组成的云彩,而点云配准就是要把这些云彩按照它们实际的位置和姿态拼接在一起,就像把多个拼图拼接在一起,最终形成一个完整的三维模型。粗配准(Coarse Registration)在两幅点云之间的变换完全未知的情况下进行较为粗糙的配准,目的主要是为精配准提供较好的变换初值。精配准(Fine Registration)精配准是给定一个初始变换,进一步优化得到更精确的变换。粗配准和精配准流程如下图所示:

2 常见的配准算法

2.1 4PCS配准

1 原理

并非全共线的共面四点a,b,c,d,定义了两个独立的比率r1和r2,其在仿射变化中是不变且唯一的。现在给定一个具有n个点的点集Q,以及两个由点P得到的仿射不变的比率r1,r2,对每一对点q1,q2⊂ Q,计算他们的中间点:若任意两对这样的点,一对由 r1计算得到的中间点和另一对由 r2计算得到的中间点在允许范围内一致,那么可以认为这两对点可能是 P中基础点的仿射对应点。将四点转化应用到全局点云转化,计算点云的匹配重叠度,若达到设置的阈值,则完成点云粗配准。2 核心代码

pcl::registration::FPCSInitialAlignment<:pointxyz> fpcs;
fpcs.setInputSource(source_cloud);  // 源点云
fpcs.setInputTarget(target_cloud);  // 目标点云
fpcs.setApproxOverlap(0.7);         // 设置源和目标之间的近似重叠度。
fpcs.setDelta(0.01);                // 设置常数因子delta,用于对内部计算的参数进行加权。
fpcs.setNumberOfSamples(100);       // 设置验证配准效果时要使用的采样点数量

2.2 K-4PCS配准

1 步骤

K-4PCS方法主要分为两个步骤: 

(1)利用VoxelGrid滤波器对点云Q进行下采样,然后使用标准方法进行3D关键点检测。

(2)通过4PCS算法使用关键点集合而非原始点云进行数据的匹配,降低了搜索点集的规模,提高了运算效率

2 核心代码

pcl::registration::KFPCSInitialAlignment<:pointxyz> kfpcs;
kfpcs.setInputSource(source);  // 源点云
kfpcs.setInputTarget(target);  // 目标点云
kfpcs.setApproxOverlap(0.7);   // 源和目标之间的近似重叠。
kfpcs.setLambda(0.5);          // 平移矩阵的加权系数。
kfpcs.setDelta(0.002, false);  // 配准后源点云和目标点云之间的距离
kfpcs.setNumberOfThreads(6);   // OpenMP多线程加速的线程数
kfpcs.setNumberOfSamples(200); // 配准时要使用的随机采样点数量
pcl::PointCloud<:pointxyz>::Ptr kpcs(new pcl::PointCloud<:pointxyz>);
kfpcs.align(*kpcs);

2.3 SAC-IA配准

1 步骤SAC-IA配准的实现流程: 

①分别计算源点云和目标点云的FPFH特征描述子

②基于FPFH特征描述子对两个点云中的点进行匹配;

③随机选择 n (n >= 3) 对匹配点; 

④求解该匹配情况下的旋转与平移矩阵;

⑤计算此时对应的误差;重复步骤3-5,直到满足条件,将最小误差对应的旋转和位移作为最终结果。

2 核心代码

pcl::SampleConsensusInitialAlignment<:pointxyz> sac_ia;
sac_ia.setInputSource(source);
sac_ia.setSourceFeatures(source_fpfh);
sac_ia.setInputTarget(target);
sac_ia.setTargetFeatures(target_fpfh);
sac_ia.setMinSampleDistance(0.1);//设置样本之间的最小距离
sac_ia.setCorrespondenceRandomness(6); //在选择随机特征对应时,设置要使用的邻居的数量;
pointcloud::Ptr align(new pointcloud);
sac_ia.align(*align);

2.4 主成分分析法(PCA)配准

1 原理

主要利用点云数据的主轴方向进行配准。首先计算两组点云的协方差矩阵,根据协方差矩阵计算主要的特征分量,即点云数据的主轴方向,然后再通过主轴方向求出旋转矩阵,计算两组点云中心坐标的便移直接求出平移向量。

2 核心代码

void ComputeEigenVectorPCA(const pcl::PointCloud<:pointxyz>::Ptr& cloud, Eigen::Vector4f& pcaCentroid, Eigen::Matrix3f& eigenVectorsPCA)
{
 pcl::compute3DCentroid(*cloud, pcaCentroid);
 Eigen::Matrix3f covariance;
 pcl::computeCovarianceMatrixNormalized(*cloud, pcaCentroid, covariance);
 Eigen::SelfAdjointEigenSolver<:matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);
 eigenVectorsPCA = eigen_solver.eigenvectors();
}

2.5 ICP配准

1 原理

ICP算法的核心是最小化一个目标函数,实际上就是所有对应点之间的欧式距离的平方和2 步骤

①寻找对应点:我们在有初值的情况下,假设用初始的变换矩阵对source cloud进行变换,将变换后的点云与target cloud进行比较,只要两个点云距离小于一定阈值,我们就认为这两个点就是对应点。

②R、T优化:有了对应点之后,我们就可以用对应点对旋转R与平移T进行估计。这里R和T中只有6个自由度,而我们的对应点数量是庞大的。因此,我们可以采用最小二乘等方法求解最优的旋转平移矩阵,一个数值优化问题。

③迭代:我们优化得到了一个新的R与T,导致了一些点转换后的位置发生变化,一些对应点也相应的发生了变化。因此,我们又回到了步骤②中的寻找对应点方法。②③步骤不停迭代进行,直到满足一些迭代终止条件,如R、T的变化量小于一定值,或者上述目标函数的变化小于一定值,或者对应点不再变化等。

3 核心代码

icp.setInputSource(source);            // 源点云
icp.setInputTarget(target);            // 目标点云
icp.setTransformationEpsilon(1e-10);   // 为终止条件设置最小转换差异
icp.setMaxCorrespondenceDistance(1);  // 设置对应点对之间的最大距离(此值对配准结果影响较大)。
icp.setEuclideanFitnessEpsilon(0.05);  // 设置收敛条件是均方误差和小于阈值, 停止迭代;
icp.setMaximumIterations(35);           // 最大迭代次数
pcl::PointCloud<:pointxyz>::Ptr icp_cloud(new pcl::PointCloud<:pointxyz>);
icp.align(*icp_cloud);

3 深度学习的配准算法

①PointNetLK (Deep ICP) 是基于 PointNet的改进版ICP算法。PointNet被用来提取点云的全局特征,然后使用牛顿法迭代近似相似性变换参数,并且使用这个过程中估计的点对映射来更新权重。 

②Deep Closest Point (DCP) 基于深度神经网络的点云配准算法,它先通过PointNet提取特征,然后计算每个点在目标点云中的最近邻点,并计算这两个点之间的距离。之后,它将这些信息传递到一个形状编码器来学习在两个点云之间寻找最优配准关系,并输出变换矩阵使得两个点云重合。

③PRNet PRNet是基于 PointNet++ 的点云配准算法。它的主要思想是将两个点云投射到一个球面上,然后计算在这个球面上的卷积特征。卷积完成后,PRNet使用粗配准阶段进行初始配准,再使用 RANSAC 进行细配准,最终输出配准矩阵。 

④PPFNet PPFNet是基于局部点对特征(PPF)的点云配准算法,使用神经网络学习点对之间的相对变换,并输出变换矩阵使得两个点云对齐。这个算法使用卷积神经网络对点云进行编码,并学习 PPF 匹配关系的特征,并使用训练过的网络对新的点云对进行配准。

3D视觉交流群

大家好,群里会第一时间发布3D计算机视觉方向的最前沿论文解读和交流分享,主要方向有:

视觉SLAM、激光SLAMORB-SLAMVins-FusionLOAM/LeGo-LOAMcartographerVIO、语义SLAM、滤波算法、多传感器融合、多传感器标定、MSCKF、动态SLAM MOT SLAMNeRF-SLAMFAST-LIOLVI-SAMLIO-SAM、事件相机、GPS/RTK/UWB/IMU/码盘/TOFiToFdToF)、激光雷达、气压计、毫米波雷达、RGB-D相机、超声波等、机器人导航、相机标定、立体匹配、三维点云、结构光(面/线/散斑)、机械臂抓取(2D/3D)、2D缺陷检测、3D缺陷检测、6D位姿估计、相位偏折术、Halcon、光场重建、摄影测量、阵列相机、偏振三维测量、光度立体视觉、激光雷达、NeRF、多视图几何、OpenMVSMVSNetcolmap、纹理贴图、深度估计、Transformer、毫米波/激光雷达/视觉摄像头传感器、多传感器标定、多传感器融合、自动驾驶综合群等、目标检测、3D目标检测、路径规划、轨迹预测、3D点云、3D点云分割、模型部署、车道线检测、Occupancy、目标跟踪、四旋翼建模、无人机飞控、求职、硬件选型、视觉产品落地、最新论文、3D视觉最新产品等综合交流群。

添加微信: dddvision,备注:研究方向+学校/公司+昵称(如3D点云+清华+小草莓), 小助理会拉你入群。

▲长按扫码添加助理

3D视觉学习圈子

我们的3D视觉学习圈子「3D视觉从入门到精通」知识星球、6000+成员交流学习。星球依托于微信公众号「3D视觉工坊」、「计算机视觉工坊」、「3DCV」,包括:独家秘制课程;项目对接;3D视觉学习路线总结;最新顶会论文&代码;3D视觉行业最新模组;3D视觉源码汇总;书籍推荐;编程基础&学习工具;实战项目&作业;求职招聘&面经&面试题等等。想了解3D视觉或者入行3D视觉方向欢迎您扫码加入我们的学习圈子知识星球。

▲长按扫码加入星球

3D视觉学习平台

我们的3D视觉学习平台包含:面结构光高阶项目实战、机器人规划控制、MVSNet三维重建、四旋翼无人机、论文方法论、LinuxdTOF、面结构光三维重建、线结构光三维重建、三维视觉C++、车载标定、机器人3D激光SLAM、LOAM-SLAMIMU-GPS-SLAMVINS-SLAM、室内室外激光SLAM、TransformerTransformer、相机标定、ROS2、点云、open3d、3D缺陷检测、机械臂抓取、单目深度估计、3D目标检测、colmap三维重建等等。

▲长按扫码学习

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/166059
 
434 次点击