当前位置: 首页 > news >正文

Python实现点云PCA配准——粗配准

        本节我们来介绍PCA(主成分分析)算法进行点云配准,这是一种经典的统计降维与特征提取工具,在三维点云处理中常被用来完成“粗配准”。其核心思想是:先把两个待对齐的点云各自进行主成分分解,获得各自的“主轴”,然后只需把源点云的主轴旋转-平移到与目标云的主轴重合,即可实现初步对齐。具体流程可概括为五步:

        1. 计算质心:求出点云中所有点的几何中心。  
2. 去质心:把每个点坐标减去质心,使点云以原点为中心。  
3. 协方差矩阵:在中心化后的点云上计算 3×3 协方差矩阵。  
4. 特征分解:对协方差矩阵做特征值分解,得到三个特征向量,即为点云的三个主方向(主轴)。  
5. 轴对齐:构造旋转矩阵和平移向量,将源云的主轴依次对应到目标云的主轴,完成粗配准。

        由于 PCA 只依赖一阶矩和二阶矩,计算量小、对噪声有一定鲁棒性,因此常被用作以下场景的“第一步”:

        • 初始配准:在运行 ICP 等精细配准算法前,用 PCA 给出良好初值,可显著减少迭代次数并避免局部极小。  
• 姿态估计:机器人或视觉系统可通过 PCA 快速估计物体或场景的大致朝向。  
• 多视角拼接:把不同视角拍到的点云先用 PCA 粗略对齐,为后续精细拼接提供初始解。

本次使用的数据依然我们的老朋友——兔砸!显示如下:

一、PCA配准程序

from __future__ import annotationsimport copy
import logging
from typing import Tupleimport numpy as np
import open3d as o3dlogging.basicConfig(level=logging.INFO, format="[%(levelname)s] %(message)s")# ------------------------------------------------------------------------------
# 工具函数
# ------------------------------------------------------------------------------
def estimate_covariances(pcd: o3d.geometry.PointCloud,search_param: o3d.geometry.KDTreeSearchParamHybrid,
) -> Tuple[np.ndarray, np.ndarray]:"""返回点云质心与 3×3 协方差矩阵"""center, cov = pcd.compute_mean_and_covariance()return np.asarray(center), np.asarray(cov)def pca_registration(source: o3d.geometry.PointCloud,target: o3d.geometry.PointCloud,
) -> o3d.geometry.PointCloud:"""使用 PCA 对齐两个点云的主轴,再用 Kabsch 精细对齐返回 : 配准后的 source 点云(拷贝)"""# 1. 计算质心与主轴方向c_src, cov_src = estimate_covariances(source, o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))c_tgt, cov_tgt = estimate_covariances(target, o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))_, eig_src = np.linalg.eigh(cov_src)_, eig_tgt = np.linalg.eigh(cov_tgt)# 2. 粗略对齐:让 source 的主轴与 target 对齐R0 = eig_tgt @ eig_src.Tt0 = c_tgt - R0 @ c_srcT0 = np.eye(4)T0[:3, :3] = R0T0[:3, 3] = t0# 3. 变换T_total = T0src_coarse = copy.deepcopy(source).transform(T0)logging.info("PCA配准矩阵:\n%s", T_total)return src_coarse# ------------------------------------------------------------------------------
# 主程序
# ------------------------------------------------------------------------------
def main() -> None:np.random.seed(42)# 1. 读入源点云source = o3d.io.read_point_cloud("E:/CSDN/规则点云/bunny.pcd")# 2. 生成目标点云:平移 + 高斯噪声target = copy.deepcopy(source)t_noise = np.array([0.10, 0.15, 0.20])target.translate(t_noise, relative=True)points = np.asarray(target.points)noise = np.random.normal(0, 0.001, points.shape)points += noisetarget.points = o3d.utility.Vector3dVector(points)# 3. 可视化原始source.paint_uniform_color([1, 0, 0])target.paint_uniform_color([0, 1, 0])o3d.visualization.draw_geometries([source, target],window_name="原始点云",width=1024,height=768,)# 4. 配准registered = pca_registration(source, target)# 5. 可视化结果o3d.visualization.draw_geometries([registered, target],window_name="PCA配准点云",width=1024,height=768,)if __name__ == "__main__":main()

二、PCA配准结果

        可以看出,前两次的兔砸数据也能很好的配准。但是此次有一点进行了改进,就是对原始点云和目标点云进行了KD-tree处理,所以运行起来会很快。总的来说此次配准还不错,不过要说几种配准方法的优劣,还需进一步结合数据分析。

就酱,下次见^-^

http://www.dtcms.com/a/321630.html

相关文章:

  • 三种经典寻路算法对比
  • 微服务的好与坏
  • kafak
  • 经常问的14000
  • HTML5 Web Workers 深度剖析:助力网页性能飞速提升
  • imx6ull-驱动开发篇14——原子操作
  • FFmpeg 视频旋转信息处理:3.4 vs 7.0.2
  • 开发避坑指南(22):Vue3响应式编程中this绑定机制与解决方案
  • C++ 部署LSTM(.onnx)
  • 大模型中的核心参数temperature 您知道是什么东东吗?
  • KEIL 环境下 printf 导致程序无法执行的解决方案
  • GPT5评测对比与使用
  • 2025年城市建设与智慧交通国际会议(ICUCIT 2025)
  • OpenAI重磅开源回归!GPT-OSS-120B/20B登陆星辰MaaS
  • 【长度最小的子数组】
  • C++ 红黑树实现详解:理论+代码+图解
  • 主流多模态大模型使用总结
  • GPT-5测评:AI新纪元的开启还是炒作?
  • 【SpringBoot】01 基础入门-SpringBoot2:从核心技术到响应式编程
  • Jenkins自动化构建部署Java、Web前后端项目
  • 使用Python将中文语音翻译成英语音频
  • 达梦DISQL执行SQL和SQL脚本
  • 医疗数据中台架构实战:Java实现高可用、低耦合的数据治理方案
  • 30人大型视频会议设备清单
  • 零基础小白如何使用QGIS制作研究区地形区位图教程
  • 参数服务器 server and client
  • 一文可视化分析2025年6月计算机视觉顶刊IJCV前沿热点
  • 满足高性能AI服务器的企业SSD有哪些?三星PM1743与Solidigm PS1010
  • Ⅹ—6.计算机二级综合题27---30套
  • 研发流程管理经验分享