【机器人-基础知识】标定 - 相机内参求解原理(单应性矩阵、内参约束方程)

server/2025/3/16 20:56:20/

1. 求解目标:内参

从世界坐标系到像素坐标系的齐次坐标形式:
s [ u v 1 ] = K [ R t ] [ X w Y w Z w 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \, [\, R \quad t \,] \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} s uv1 =K[Rt] XwYwZw1
其中 s s s 是尺度因子,内参矩阵 K K K 为:
K = [ f x 0 c x 0 f y c y 0 0 1 ] K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K= fx000fy0cxcy1

2. 单应性矩阵

参考大佬的详细文章:https://zhuanlan.zhihu.com/p/74597564

2.1. 单应性矩阵的定义

单应性矩阵(Homography Matrix)是一个平面映射到另一个平面的映射矩阵,即将一个平面上的点映射到另一个平面上。

2.2. 透视变换矩阵(或称单应性变换矩阵

在这里插入图片描述

  1. 刚体变换:平移+旋转,只改变物体位置,不改变物体形状。
  2. 仿射变换:改变物体位置和形状,但是原来平行的边依然平行。
  3. 透视变换(也称投影变换):彻底改变物体位置和形状

3 × 3 3\times3 3×3 的透视(或称单应性)变换矩阵 H H H

H = ( A t v T 1 ) = ( h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 1 ) H = \begin{pmatrix} A & t \\ v^T & 1 \end{pmatrix}= \begin{pmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & 1 \end{pmatrix} H=(AvTt1)= h11h21h31h12h22h32h13h231
其中:

  1. 仿射部分(Affine Component):

    • 线性变换( 2 × 2 2\times2 2×2 部分 A A A): 这部分包含旋转、缩放和剪切。
      A = ( h 11 h 12 h 21 h 22 ) A = \begin{pmatrix} h_{11} & h_{12} \\ h_{21} & h_{22} \end{pmatrix} A=(h11h21h12h22)

    • 平移( 2 × 1 2\times1 2×1 向量 t t t): H H H 的第一、二行第三列构成了平移分量。
      t = ( h 13 h 23 ) t = \begin{pmatrix} h_{13} \\ h_{23} \end{pmatrix} t=(h13h23)

  2. 透视(项目)部分(Projective Component):
    如果 v T = [ h 31 , h 32 ] v^T=[h_{31},\,h_{32}] vT=[h31,h32] 不为零,则会引入额外的除法操作(透视除法):

    • 变换后,一个点 ( x , y , 1 ) (x,\,y,\,1) (x,y,1) 会变为 ( x ′ , y ′ , w ′ ) (x',\,y',\,w') (x,y,w),最后映射到实际图像坐标为 ( x ′ w ′ , y ′ w ′ ) \left(\frac{x'}{w'},\,\frac{y'}{w'}\right) (wx,wy)
      如果 v T = [ h 31 , h 32 ] v^T=[h_{31},\,h_{32}] vT=[h31,h32] 为零,则 w ′ w' w为1,没有透视效果。

当观察角度改变或相机位置不在正前方时,物体会出现远处变小、近处变大的效果。矩阵 h 31 h_{31} h31 h 32 h_{32} h32 控制了这种“深度依赖性”的变化,最终通过除以 w = h 31 x + h 32 y + 1 w = h_{31}x + h_{32}y + 1 w=h31x+h32y+1 实现非线性映射,使得平行线汇聚于消失点。

2.3. 单应性矩阵的求解

在这里插入图片描述
不是很恰当的描述:世界坐标系z=0的平面上图形(图中书籍),从左右两个视角(两个图像平面)观察,得到两个图像平面上的两个不同图像。
在这里插入图片描述
在这里插入图片描述
求解一个包含 𝑛个未知数的方程组,理论上至少需要 𝑛个独立的方程。所以,为了求解单应性矩阵里的8个未知数,需要8个独立方程。1次图像变换的每组匹配点(2个点)对应2个方程,因此需要4个点的坐标变换关系。

3. 相机内参计算

  1. 从单应性矩阵得到约束条件(约束公式)

对于一个固定平面(如棋盘格所在的平面),我们有:

s [ u v 1 ] = K [ r 1 r 2 t ] [ X Y 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K [r_1 \quad r_2 \quad t] \begin{bmatrix} X \\ Y \\ 1 \end{bmatrix} s uv1 =K[r1r2t] XY1

由于棋盘格位于 Z = 0 Z=0 Z=0 的平面上,我们可以定义一个 单应性矩阵 H H H

H = K [ r 1 r 2 t ] H = K [r_1 \quad r_2 \quad t] H=K[r1r2t]

其中:

  • K K K 是相机内参矩阵

    K = [ f x γ u 0 0 f y v 0 0 0 1 ] K = \begin{bmatrix} f_x & \gamma & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix} K= fx00γfy0u0v01

  • [ r 1 r 2 t ] [r_1 \quad r_2 \quad t] [r1r2t] 是外参矩阵(旋转矩阵前两列 r 1 , r 2 r_1, r_2 r1,r2 以及平移 t t t)。

单应性矩阵 H H H 的每一列分别是 K K K 乘以旋转和平移矩阵的各列:

h 1 = K r 1 , h 2 = K r 2 , h 3 = K t h_1 = K r_1, \quad h_2 = K r_2, \quad h_3 = K t h1=Kr1,h2=Kr2,h3=Kt

由于旋转矩阵的列向量满足 正交性约束*(正交等范数):

r 1 T r 2 = 0 , ∥ r 1 ∥ = ∥ r 2 ∥ r_1^T r_2 = 0, \quad \|r_1\| = \|r_2\| r1Tr2=0,r1=r2

将其转换到单应性矩阵表示,我们得到:

h 1 T K − T K − 1 h 2 = 0 h_1^T K^{-T} K^{-1} h_2 = 0 h1TKTK1h2=0
h 1 T K − T K − 1 h 1 = h 2 T K − T K − 1 h 2 ( h 1 T K − T K − 1 h 1 − h 2 T K − T K − 1 h 2 = 0 ) h_1^T K^{-T} K^{-1} h_1 = h_2^T K^{-T} K^{-1} h_2\\ (h_1^T K^{-T} K^{-1} h_1 - h_2^T K^{-T} K^{-1} h_2 = 0) h1TKTK1h1=h2TKTK1h2(h1TKTK1h1h2TKTK1h2=0)

定义 B = K − T K − 1 B = K^{-T} K^{-1} B=KTK1 为对称矩阵,即:

B = [ B 11 B 12 B 13 B 12 B 22 B 23 B 13 B 23 B 33 ] B = \begin{bmatrix} B_{11} & B_{12} & B_{13} \\ B_{12} & B_{22} & B_{23} \\ B_{13} & B_{23} & B_{33} \end{bmatrix} B= B11B12B13B12B22B23B13B23B33


h 1 = [ h 11 h 21 h 31 ] , h 2 = [ h 12 h 22 h 32 ] , h_1 = \begin{bmatrix} h_{11}\\ h_{21}\\ h_{31} \end{bmatrix},\quad h_2 = \begin{bmatrix} h_{12}\\ h_{22}\\ h_{32} \end{bmatrix}, h1= h11h21h31 ,h2= h12h22h32 ,

将上述方程展开,可以得到:

  • 正交约束展开:
    h 1 x h 2 x B 11 + ( h 1 x h 2 y + h 1 y h 2 x ) B 12 + h 1 y h 2 y B 22 + ( h 1 x h 2 z + h 1 z h 2 x ) B 13 + ( h 1 y h 2 z + h 1 z h 2 y ) B 23 + h 1 z h 2 z B 33 = 0 h_{1x} h_{2x} B_{11} + (h_{1x} h_{2y} + h_{1y} h_{2x}) B_{12} + h_{1y} h_{2y} B_{22} + (h_{1x} h_{2z} + h_{1z} h_{2x}) B_{13} + (h_{1y} h_{2z} + h_{1z} h_{2y}) B_{23} + h_{1z} h_{2z} B_{33} = 0 h1xh2xB11+(h1xh2y+h1yh2x)B12+h1yh2yB22+(h1xh2z+h1zh2x)B13+(h1yh2z+h1zh2y)B23+h1zh2zB33=0
  • 等范数约束展开:
    ( h 11 2 − h 12 2 ) B 11 + 2 ( h 11 h 21 − h 12 h 22 ) B 12 + ( h 21 2 − h 22 2 ) B 22 + 2 ( h 11 h 31 − h 12 h 32 ) B 13 + 2 ( h 21 h 31 − h 22 h 32 ) B 23 + ( h 31 2 − h 32 2 ) B 33 = 0. (h_{11}^2 - h_{12}^2)B_{11} + 2(h_{11}h_{21} - h_{12}h_{22})B_{12} + (h_{21}^2 - h_{22}^2)B_{22} + 2(h_{11}h_{31} - h_{12}h_{32})B_{13} + 2(h_{21}h_{31} - h_{22}h_{32})B_{23} + (h_{31}^2 - h_{32}^2)B_{33} = 0. (h112h122)B11+2(h11h21h12h22)B12+(h212h222)B22+2(h11h31h12h32)B13+2(h21h31h22h32)B23+(h312h322)B33=0.
  1. 求解定义的 B B B
    定义的 B = K − T K − 1 B = K^{-T}K^{-1} B=KTK1 是一个对称 3 × 3 3\times3 3×3 矩阵,它有 6 个独立的参数(例如 B 11 , B 12 , B 22 , B 13 , B 23 , B 33 B_{11}, B_{12}, B_{22}, B_{13}, B_{23}, B_{33} B11,B12,B22,B13,B23,B33)。

    每幅图像能提供 2 个线性方程。
    由于 B B B 有 6 个未知数,所以至少需要 3 幅图像(提供共 6 个方程)才能构造出足够的独立约束来求解 B B B
    实际应用中,为了提高解的鲁棒性和精度,通常会采集更多图像,将所有方程叠加后使用最小二乘法求解。

  2. 分解出相机内参 K K K

  • Cholesky 分解(或称为“科列斯基分解”)
    是一种将对称正定矩阵分解为下三角矩阵与其转置乘积的方法。
    形式上,对于一个对称正定矩阵 A A A,可以分解为
    A = L L T , A = L\,L^T, A=LLT,
    其中 L L L 是下三角矩阵。如果需要得到一个上三角因子,也可以写为
    A = R T R , A = R^T R, A=RTR,
    其中 R R R 是上三角矩阵,并且通常要求对角线元素为正。

  • 分解得到内参矩阵
    B = K − T K − 1 ⟹ B − 1 = K K T . B = K^{-T}K^{-1} \quad \Longrightarrow \quad B^{-1} = K\,K^T. B=KTK1B1=KKT.

由于 B − 1 B^{-1} B1 是对称正定的,我们可以对 B − 1 B^{-1} B1 进行 Cholesky 分解,得到一个下三角矩阵 L L L 满足

B − 1 = L L T . B^{-1} = L\,L^T. B1=LLT.

若希望获得一个上三角矩阵 K K K(内参矩阵通常约定为上三角形式),可以令

K = L T . K = L^T. K=LT.

这样,我们就通过 Cholesky 分解间接得到内参矩阵 K K K


http://www.ppmy.cn/server/175519.html

相关文章

YOLO11 使用入门

YOLO12 使用入门 1. 源码下载2. 权重下载3. 环境配置4. 例程测试4.1. 目标检测4.1.1. 源文件 model4.1.2. 结果Results4.1.3. 边界框 Boxes 2.2. 图像分割4.2.1. 推理 model.predict4.2.2. 掩码 Masks 1. 源码下载 之前介绍了《目标检测 YOLOv5 使用入门》 现在是 2024.12.2…

零基础上手Python数据分析 (4):Python数据结构精讲 - 列表、元组、字典、集合

写在前面 回顾一下,在之前的博客中,我们学习了 Python 的基本数据类型(数值、字符串、布尔值)和核心语法(运算符、变量、流程控制、函数、模块)。 现在,我们已经掌握了 Python 编程的基础知识。 接下来,我们将进入数据分析的关键环节: 数据组织。 在数据分析中,数据…

C++的名称空间

C++的名称空间(namespace)是一种用于组织代码、防止命名冲突的机制。以下是名称空间的详细说明和使用建议: 1. 名称空间的定义 使用namespace关键字定义,内部可包含变量、函数、类等: namespace MyNamespace {int a;void func() {} }2. 访问方式 作用域解析运算符:::显…

西门子S7-1200 PLC远程上下载程序方案

西门子S7-1200 PLC远程上下载程序方案(巨控GRM552YW-C模块) 三步完成配置 | 全球适用 | 稳定高效 三步快速完成远程配置 硬件部署 准备巨控GRM552YW-CHE模块1台,通过网口连接西门子S7-1200 PLC以太网口。 模块支持4G/5G/Wi-Fi/网线接入外网…

linux(ubuntu)中Conda、CUDA安装Xinference报错ERROR: Failed to build (llama-cpp-python)

文章目录 一、常规办法二、继续三、继续四、缺少 libgomp库(最终解决)在 Conda 环境中安装 libgomp 如果符合标题情况 执行的: pip install "xinference[all]"大概率是最终解决的情况。 一、常规办法 llama-cpp-python 依赖 CMak…

删除有序数组中的重复项(26)

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {auto first nums.begin();auto last nums.end();auto result first;if (first last) {return std::…

基于深度学习的肺炎X光影像自动诊断系统实现,真实操作案例分享,值得学习!

医疗影像智能化的技术演进 医学影像分析正经历从人工判读到AI辅助诊断的革命性转变。传统放射科医师分析胸部X光片需要8-12年专业训练&#xff0c;而基于深度学习的智能系统可在秒级完成检测。本文将以肺炎X光检测为切入点&#xff0c;详解从数据预处理到模型部署的全流程实现。…

深度学习基础:线性代数的本质1——深入理解向量

目录 一、向量是什么 1. 从物理学角度 2. 从计算机专业角度 3. 从数学角度 4. 思考向量的特点方式 ① 向量是空间中的箭头 ② 向量是有序的数字列表 二、向量加法和向量相乘 1. 向量加法 2. 向量相乘 一、向量是什么 线性代数中最基础&#xff0c;最根源的组成部分。 …