源于deepseek:
在 OpenCV 的 cv2.stereoRectify
函数中,R1
, R2
, P1
, P2
, Q
是计算立体校正和三维重建所需的关键输出矩阵。它们各自代表不同的几何变换和投影关系:
- 目标:立体校正使左右相机图像平面共面且行对齐(极线平行于图像行)。
- 输入:左右相机内参 (
cameraMatrix1
,cameraMatrix2
)、畸变系数 (distCoeffs1
,distCoeffs2
)、相机间旋转矩阵R
和平移向量T
。 - 输出:用于校正图像 (
initUndistortRectifyMap
) 和计算视差/深度 (reprojectImageTo3D
)。
输出矩阵详解
-
R1
(3x3 旋转矩阵)- 物理意义:将左相机从原始坐标系旋转到校正后虚拟相机坐标系的旋转变换。
- 作用:描述左相机为了达到共面行对准状态,其坐标系需要进行的旋转。应用
R1
后,左相机光轴垂直于新的公共成像平面(基线平面),且成像平面的行方向平行。 - 几何解释:想象你物理上转动左相机,使它的成像平面与一个虚拟的理想平面重合(该平面平行于基线且水平)。
R1
就是这个转动操作对应的数学旋转矩阵。
-
R2
(3x3 旋转矩阵)- 物理意义:将右相机从原始坐标系旋转到校正后虚拟相机坐标系的旋转变换。
- 作用:描述右相机为了达到共面行对准状态,其坐标系需要进行的旋转。应用
R2
后,右相机光轴也垂直于同一个新的公共成像平面(基线平面),且成像平面的行方向与左相机严格平行。 - 几何解释:想象你物理上转动右相机,使它的成像平面与左相机转动后到达的同一个虚拟理想平面重合(平行于基线且水平)。
R2
就是这个转动操作对应的数学旋转矩阵。 - 关键点:
R1
和R2
共同作用使得两个虚拟相机坐标系的 Z 轴平行(都垂直于公共成像平面),X 轴平行(通常指向相同方向),Y 轴平行(垂直向下)。这就实现了共面行对准。
-
P1
(3x4 投影矩阵 - 左相机)- 物理意义:将校正后左虚拟相机坐标系下的三维点投影到校正后左图像平面上的齐次坐标变换矩阵。
- 结构:
P1 = [K1_new * [I | 0]]
或P1 = [K1_new * [R1 | 0]]
(取决于alpha
参数)K1_new
(3x3):校正后左虚拟相机的内参矩阵。它的主点(cx, cy)
可能因alpha
参数(用于控制有效图像区域)而改变,焦距通常保持不变或根据alpha
略有调整。[I | 0]
(3x4):单位旋转矩阵 + 零平移向量。这是最常见的情况,意味着校正后的左虚拟相机坐标系原点与原始左相机坐标系原点重合(即只旋转,不改变位置)。[R1 | 0]
(3x4):如果cv2.stereoRectify
内部实现需要额外的旋转(取决于算法和flags
),但物理意义仍是原点在原始左相机位置。
- 作用:定义校正后左图像是如何从校正后左虚拟相机观察到的三维世界投影而来的。
- 几何解释:
P1
定义了一个新的“虚拟左相机”。这个相机的内参是K1_new
,它位于原始左相机的位置(原点),但它的朝向是经过R1
旋转后的方向(即朝向新的公共成像平面)。
-
P2
(3x4 投影矩阵 - 右相机)- 物理意义:将校正后右虚拟相机坐标系下的三维点投影到校正后右图像平面上的齐次坐标变换矩阵。
- 结构:
P2 = [K2_new * [R | T_new]]
K2_new
(3x3):校正后右虚拟相机的内参矩阵。主点也可能因alpha
改变,焦距通常与K1_new
相同(即K1_new[0,0] == K2_new[0,0]
且K1_new[1,1] == K2_new[1,1]
)。R
(3x3):一个旋转矩阵。在 Bouguet 算法中,R
通常是R1
或R2
的转置,用于将点转换到校正后坐标系。T_new
(3x1):最关键的部分! 这是校正后虚拟相机坐标系下的基线平移向量。它的形式通常是T_new = [Tx, 0, 0]^T
。Tx = -fx * B
(其中fx
是K1_new[0,0]
,B
是原始基线长度||T||
)。- 物理意义:
Tx
表示在校正后坐标系中,右虚拟相机原点相对于左虚拟相机原点沿 X 轴的偏移量(单位为像素)。Tx
是负值,因为右相机在左相机的负 X 方向(假设左相机在原点)。
- 作用:定义校正后右图像是如何从校正后右虚拟相机观察到的三维世界投影而来的。
T_new
中的Tx
直接决定了视差与深度的关系。 - 几何解释:
P2
定义了一个新的“虚拟右相机”。这个相机的内参是K2_new
。它位于原始右相机的位置,但朝向是经过R2
旋转后的方向(朝向新的公共成像平面)。T_new
精确地描述了在校正后的坐标系下,这个右虚拟相机相对于左虚拟相机的位置(只有 X 方向有偏移)。
-
Q
(4x4 视差-深度映射矩阵)- 物理意义:将校正后左图像中的像素坐标
(u, v)
及其视差值d
映射回原始左相机坐标系下的三维点坐标(X, Y, Z, W)
的齐次变换矩阵。最终三维坐标为(X/W, Y/W, Z/W)
。 - 结构:
Q = [ 1, 0, 0, -cx;0, 1, 0, -cy;0, 0, 0, f;0, 0, -1/Tx, (cx - cx')/Tx ]
cx
,cy
:P1[0,2]
和P1[1,2]
(校正后左图像主点)。cx'
:P2[0,2]
(校正后右图像主点)。在校正良好的系统中,cy == cy'
,且cx
和cx'
通常相等(图像水平对齐)。f
:P1[0,0]
或P1[1,1]
(校正后虚拟相机的焦距,通常P1[0,0]
用于 X,P1[1,1]
用于 Y)。Tx
:P2[0,3]
/P2[0,0]
(来自P2
的基线平移量,负值)。
- 核心公式:深度
Z = f * B / |d| = f * |Tx| / |d|
(因为B = |Tx| / f
,Tx = -f * B
=>|Tx| = f * B
)。 - 作用:这是立体视觉三维重建的核心。给定左校正图像中的一个点
(u, v)
和通过立体匹配计算得到的该点对应的视差值d
,Q
矩阵可以直接计算出该点在原始左相机坐标系下的三维坐标(X, Y, Z)
。 - 使用:
cv2.reprojectImageTo3D(disparity_map, Q)
函数就是利用Q
矩阵将视差图转换为三维点云。
- 物理意义:将校正后左图像中的像素坐标
关键物理意义总结表
矩阵 | 维度 | 核心物理意义 | 关键作用 |
---|---|---|---|
R1 | 3x3 | 左相机原始坐标系 -> 校正后虚拟相机坐标系的旋转 | 定义左相机为达到共面行对准所需的姿态调整 |
R2 | 3x3 | 右相机原始坐标系 -> 校正后虚拟相机坐标系的旋转 | 定义右相机为达到共面行对准所需的姿态调整 |
P1 | 3x4 | 校正后左虚拟相机坐标系下的 3D点 -> 校正后左图像像素坐标的投影 ([K1_new * [I|0]] ) | 定义校正后左图像的成像模型(位置、朝向、内参) |
P2 | 3x4 | 校正后右虚拟相机坐标系下的 3D点 -> 校正后右图像像素坐标的投影 ([K2_new * [R|T_new]] , T_new=[Tx,0,0] ) | 定义校正后右图像的成像模型(位置、朝向、内参),Tx 是核心基线参数 |
Q | 4x4 | 校正后左图像像素 (u, v) + 视差 d -> 原始左相机坐标系下的 3D点 (X, Y, Z) | 立体三维重建的核心公式,将视差转换为深度和三维坐标 |
补充说明
alpha
参数:控制有效图像区域。alpha=0
表示只保留所有像素都有效的重叠区域(可能有黑边),alpha=1
表示保留原始图像所有像素(有效区域可能包含畸变严重的部分)。它会影响K1_new
,K2_new
的主点坐标(cx, cy)
和(cx', cy')
,进而影响P1
,P2
,Q
。- 图像校正:
R1
,R2
,P1
,P2
用于计算映射表 (cv2.initUndistortRectifyMap
),然后用cv2.remap
函数实际校正原始图像。 - 视差图:在校正后的图像对上 (
rectified1
,rectified2
),使用立体匹配算法(如cv2.StereoSGBM
,cv2.StereoBM
) 计算视差图disparity_map
。 - 三维重建:使用
Q
矩阵和视差图 (cv2.reprojectImageTo3D(disparity_map, Q)
) 计算每个像素对应的三维点坐标。 - 基线
B
:原始平移向量T
的模||T||
就是物理基线长度。在P2
中体现为Tx
(Tx = -f * B
),在Q
矩阵中用于深度计算Z = f * B / d
。 Tx
的重要性:它是连接视差d
和深度Z
的桥梁 (Z ∝ 1/d
,比例常数是f * |Tx| / |d|
中的f * |Tx|
)。Tx
的值直接决定了深度计算的尺度。