二维ICP配准

article/2025/8/4 23:14:34

二维ICP配准

  • 1. 理论
    • 1.1 ICP算法
    • 1.2 目标函数
    • 1.3 简化目标函数
    • 1.4 变换矩阵求解
  • 2. Python实现
    • 2.1 导入模块
    • 2.2. 定义相关函数
      • 2.2.1 求解二维点间距函数
      • 2.2.2 求解二维点距离点集最近点函数
      • 2.2.3 求解二维点集间平均距离函数
    • 2.3. 定义ICP_2D
    • 2.4. 定义点云
    • 2.5. ICP 配准


1. 理论


1.1 ICP算法

ICP算法本质上是基于最小二乘法的最优配准方法

重复进行选择对应关系点对, 计算最优刚体变换[R, T]
直到满足正确配准的收敛精度要求

即目的就是要找到待配准点云数据与参考云数据之间的旋转矩阵R和平移矩阵 T
使得两点数据之间满足某种度量准则下的最优匹配


1.2 目标函数

假设两帧点云A与B,将A 称为参考点云(也就是目标点云),把 B 称为源点云
在机器人定位的时候,A就为地图上的点云,B为设备感知的点云

如何定义两个点云匹配误差呢
一般定义所有最近点的欧式距离平方和为目标函数
在这里插入图片描述
平时要先去噪点,这里忽略


1.3 简化目标函数

上式存在两个变量,比较难处理
这时可通过归一化,就可先 不考虑平移矩阵 T
在这里插入图片描述
那么目标函数则为:
在这里插入图片描述

分解目标函数可得:
在这里插入图片描述
即使函数G最大即可
在这里插入图片描述


1.4 变换矩阵求解

现在取旋转矩阵R和平移矩阵 T
在这里插入图片描述
则函数G:
在这里插入图片描述

对函数G进行 theta 求极值,且令其为0,则有

只要求出:

就可以求出旋转角 theta
求出theta即可得到旋转矩阵R

再根据旋转矩阵R,求平移矩阵 T
在这里插入图片描述
然后不断迭代,至人为目标距离足够小即可


2. Python实现


2.1 导入模块

import numpy as np
import math# 不以科学计数显示
np.set_printoptions(suppress=True)

2.2. 定义相关函数


2.2.1 求解二维点间距函数

def GetDistOfPoints2D(p1, p2):'''求出两个点的距离'''return math.sqrt(math.pow(p2[0] - p1[0], 2) + math.pow(p2[1] - p1[1], 2))

2.2.2 求解二维点距离点集最近点函数

def GetClosestID(p, p_set):'''在p_set点集中找到距p最近点的id'''id = 0min = float("inf")  # 初始化取最大值for i in range(p_set.shape[1]):dist = GetDistOfPoints2D(p, p_set[:, i])if dist < min:id = imin = distreturn id

2.2.3 求解二维点集间平均距离函数

def GetDistOf2DPointsSet(set1, set2):'''求两个点集之间的平均点距'''loss = 0for i in range(set1.shape[1]):id = GetClosestID(set1[:, i], set2)dist = GetDistOfPoints2D(set1[:, i], set2[:, id])loss += distreturn loss/set1.shape[1]

2.3. 定义ICP_2D

def ICP_2D(targetPoints, sourcePoints):'''二维 ICP 配准算法'''A = targetPoints  # A是目标点云(地图值)B = sourcePoints  # B是源点云(感知值)# 初始化迭代参数iteration_times = 0  # 迭代次数dist_now = 1  # A,B两点集之间初始化距离dist_improve = 1  # A,B两点集之间初始化距离提升dist_before = GetDistOf2DPointsSet(A, B)  # A,B两点集之间距离# 初始化 R,TR = np.identity(2)T = np.zeros((2, 1))# 均一化点云A_mean = np.mean(A, axis=1).reshape((2, 1))A_ = A - A_mean# 迭代次数小于10并且距离大于0.01时,继续迭代while iteration_times < 10 and dist_now > 0.01:# 均一化点云B_mean = np.mean(B, axis=1).reshape((2, 1))B_ = B - B_mean# t_nume表示角度公式中的分子 t_deno表示分母t_nume, t_deno = 0, 0# 对源点云B中每个点进行循环for i in range(B_.shape[1]):j = GetClosestID(B_[:, i], A_)  # 找到距离最近的目标点云A点idt_nume += A_[1][j] * B_[0][i] - A_[0][j] * B_[1][i]  # 获得求和公式,分子的一项t_deno += A_[0][j] * B_[0][i] + A_[1][j] * B_[1][i]  # 获得求和公式,分母的一项# 计算旋转弧度θtheta = math.atan2(t_nume, t_deno)# 由旋转弧度θ得到旋转矩阵Rdelta_R = np.array([[math.cos(theta), -math.sin(theta)], [math.sin(theta), math.cos(theta)]])# 计算平移矩阵Tdelta_T = A_mean - np.matmul(delta_R, B_mean)# 更新最新的点云B = np.matmul(delta_R, B) + delta_T# 更新旋转矩阵R和平移矩阵TR = np.matmul(delta_R, R)T = np.matmul(delta_R, T) + delta_T# 更新迭代iteration_times += 1  # 迭代次数+1dist_now = GetDistOf2DPointsSet(A, B)  # 更新两个点云之间的距离dist_improve = dist_before - dist_now  # 计算这一次迭代两个点云之间缩短的距离dist_before = dist_now  # 将"现在距离"赋值给"以前距离"# 打印迭代次数、损失距离、损失提升print("迭代:第{}次,距离:{:.2f},缩短:{:.2f}".format(iteration_times, dist_now, dist_improve))return R, T

2.4. 定义点云

# 目标点云(地图上的数据)
a = np.array([[1, 2, 2], [1, 2, 3]])# 设置转换量
c_theta = math.radians(30)  # 逆时针旋转30° 求解R旋转角度应为顺时针旋转30°
c_r = np.array([[math.cos(c_theta), -math.sin(c_theta)], [math.sin(c_theta), math.cos(c_theta)]])
c_t = np.array([[6], [-0.6]])  # 偏移(6,-0.6) 求解T应为(-6,0.6)# 源点云(假设检测到的数据)
b = np.matmul(c_r, a + c_t)# ICP 配准
r, t = ICP_2D(a, b)# 源点云(假设检测到的数据)
b = np.matmul(c_r, a + c_t)

2.5. ICP 配准

# ICP 配准
r, t = ICP_2D(a, b)# 显示参数
print("A:\n", a)
print("\nB:\n", b)
print("\nR:\n", r)
print("\nT:\n", t)
print("\nNew B:\n", np.matmul(r, b) + t)
input("\n输入任意键退出")# 迭代:第1次,距离:0.00,缩短:4.62
# A:
#  [[1 2 2]
#  [1 2 3]]# B:
#  [[5.86217783 6.22820323 5.72820323]
#  [3.84641016 5.21243557 6.07846097]]# R:
#  [[ 0.8660254  0.5      ]
#  [-0.5        0.8660254]]# T:
#  [[-6. ]
#  [ 0.6]]# New B:
#  [[1. 2. 2.]
#  [1. 2. 3.]]# 输入任意键退出

完整代码:
CSDN
Github


谢谢


http://chatgpt.dhexx.cn/article/jxAogtfK.shtml

相关文章

CloudCompare——实现点云由粗到精的配准

目录 1.粗配准2.精配准3.合并点云4.去除重叠点5.附&#xff1a;手算配准精度5.1 精确选取同名点5.2 计算配准误差 6.相关链接 1.粗配准 使用Tools-> Registration -> Align (point pairs picking)工具手动选取匹配点对。此工具允许用户通过在两个实体中拾取至少三个等效点…

图像配准综述

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自 | 新机器视觉 Image registration 图像配准 图像配准与相关 图像处理研究领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合针对同一对象在不同…

PCL教程-点云配准之成对逐步配准(两两配准)

原文链接&#xff1a;How to incrementally register pairs of cloudshttps://pcl.readthedocs.io/projects/tutorials/en/latest/pairwise_incremental_registration.html#pairwise-incremental-registrationhttps://pcl.readthedocs.io/projects/tutorials/en/latest/pairwis…

图像配准学习小结 (一)

图像配准学习小结 &#xff08;一&#xff09; 一、含义和意义 图像配准是找到一组变换参数&#xff0c;使得变换后的待配准图像与原始图像之间的相似度达到最高&#xff0c;目的在于将同一场景的不同图像转换到同样的坐标系中。待配准图像与原图像可能存在时间、捕获方式、角…

图像配准概述

图像配准在医学图像领域是一项重要的技术&#xff0c;在许多的临床诊断中&#xff0c;为了分析患者的状况&#xff0c;常常需要采集患者的扫描影像&#xff0c;例如&#xff0c;X线、MRI、CT和超声&#xff0c;这些扫描影像可以对患者的诊断提供依据&#xff0c;然而&#xff0…

基于MATLAB的医学图像配准算法仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB程序 四、仿真结论分析 五、算法相关应用 六、参考文献 一、理论基础 其中h表示二维空间坐标变换&#xff0c;g表示灰度或辐射变换&#xff0c;描述因传感器类型的不同或辐射变形所引入的图像变换…

图像配准简介

图像配准在目标检测、模型重建、运动估计、特征匹配,肿瘤检测、病变定位、血管造影、地质勘探、航空侦察等领域都有广泛的应用。 每一种配准方法通常都针对某个具体问题而设计的,众多方法中,唯一的共性就是每个配准问题最终都要在变换空间中寻找一种最有的变换,这种变换能…

基于深度学习的单模医学图像配准综述(附VoxelMorph配准实例)

本文是基于深度学习的单模态医学图像配准的综述&#xff0c;除了介绍配准任务、配准过程之外&#xff0c;还会从实际操作出发&#xff0c;以经典的VoxelMorph为例做详细介绍。如果有什么讲的不清楚的地方欢迎大家留言讨论&#xff0c;如果有什么错误的地方&#xff0c;也恳请大…

图像配准

1、定义 维基百科上的定义&#xff1a;图像配准与相关是图像处理研究领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合针对同一对象在不同条件下获取的图像&#xff0c;例如图像会来自不同的采集设备&#xff0c;取自不同的时间&#xff0c;不同的拍摄视角等等…

【Image Registration】图像配准综述

文章目录 一、图像配准定义二、图像配准应用场景2.1 医学图像领域2.2 其他领域 三、图像配准分类四、图像配准过程4.1 特征检测&#xff08;Feature detection&#xff09;4.2 特征匹配&#xff08;Feature matching&#xff09;4.2.1 基于区域的方法&#xff08;Area-based me…

计算机视觉 什么是图像配准?

一、图像配准概述 图像配准是叠加两个或多个来自不同来源、在不同时间和角度拍摄的图像的过程。图像配准过程是一种自动或手动操作,它试图发现两张照片之间的匹配点并在空间上对齐它们以最小化所需的误差,即两幅图像之间的统一邻近度测量。医学、遥感和计算机视觉都使用图像配…

1.图像配准简述

1.图像配准&#xff1a;作为图像融合的一个预处理步骤&#xff0c;图像配准是对两幅图像&#xff0c;通过寻找一种空间变换把一幅图像映射到另一幅图像&#xff0c;使得两图中对应于空间同一位置的点一一对应起来&#xff0c;从而达到信息融合的目的。 2.原理&#xff1a; 3.分…

机器视觉(九):图像配准

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

【图像处理】什么是图像配准?

一、图像配准概述 图像配准是叠加两个或多个来自不同来源、在不同时间和角度拍摄的图像的过程。图像配准过程是一种自动或手动操作&#xff0c;它试图发现两张照片之间的匹配点并在空间上对齐它们以最小化所需的误差&#xff0c;即两幅图像之间的统一邻近度测量。医学、遥感和计…

图解矩阵的秩

1.图解矩阵的秩 1.图解矩阵的秩1.1 满秩矩阵1.2 非满秩矩阵1.3 零矩阵1.4 秩的性质1.4.1 满秩矩阵复合的性质1.4.2 一般矩阵复合的性质 1.图解矩阵的秩 笔记来源于&#xff1a;《马同学图解线性代数》 详细过程&#xff1a; 1.1 满秩矩阵 1.2 非满秩矩阵 1.3 零矩阵 1.4 秩…

java 矩阵求秩_线性代数精华3——矩阵的初等变换与矩阵的秩

矩阵的初等变换这个概念可能在很多人听来有些陌生&#xff0c;但其实我们早在初中的解多元方程组的时候就用过它。只不过在课本当中&#xff0c;这种方法叫做消元法。我们先来看一个课本里的例子&#xff1a; 假设我们要解这个方程&#xff0c;怎么做呢&#xff1f; 首先&#…

矩阵秩的定义和相关结论汇总

秩的定义&#xff1a;对于矩阵&#xff0c;以下陈述为真。&#xff08;如果&#xff0c;则用共轭转置替换下述转置&#xff09; rank(A)矩阵A经过行初等变换&#xff0c;所得行阶梯形矩阵的非零行数rank(A)矩阵A经过行初等变换&#xff0c;所得行阶梯形矩阵的主元数rank(A)矩阵…

秩为1的矩阵的性质总结

网上东拼西凑找到的&#xff0c;只能用手抄下来&#xff0c;方便自己复习看&#x1f440;。有什么不对的还希望大家指出&#xff01;

秩一矩阵的优良性质

前言&#xff1a;仅个人小记 秩一矩阵非常漂亮的五个性质&#xff1a; &#xff08;1&#xff09;秩一矩阵一定能够拆解为两个列向量 a ⃗ \vec{a} a &#xff0c; b ⃗ \vec{b} b 矩阵乘积的形式&#xff0c;具体为 A a ⃗ b ⃗ T A\vec{a}{\vec{b}}^{T} Aa b T这种形式 &…