
当相机仅绕光轴(Z轴)进行水平旋转(Pan)时,可通过相机内参矩阵与旋转矩阵的复合变换精确推导出两视图间的单应性矩阵 $ H $;其完整形式为 $ H = K \, R{21} \, K^{-1} $,其中 $ R{21} = R_2 R_1^\top $ 为相对旋转,$ K $ 为对角焦距矩阵——该公式自然统一确定所有9个元素,无需分段假设。
当相机仅绕光轴(z轴)进行水平旋转(pan)时,可通过相机内参矩阵与旋转矩阵的复合变换精确推导出两视图间的单应性矩阵 $ h $;其完整形式为 $ h = k \, r_{21} \, k^{-1} $,其中 $ r_{21} = r_2 r_1^\top $ 为相对旋转,$ k $ 为对角焦距矩阵——该公式自然统一确定所有9个元素,无需分段假设。
在纯旋转(无平移、无俯仰/翻滚或仅含绕Z轴的Pan)条件下,若两图像对应同一平面场景(如地面 Z=0),则它们之间存在严格的单应性映射关系。此时,单应性矩阵 $ H $ 并非简单由相对旋转矩阵 $ R_{21} = R_2 R_1^\top $ 截取前两列加第三列构成,也不是对其归一化后“补零”或“除以焦距”的经验拼接;正确且普适的表达式是:
$$ H = K \, R_{21} \, K^{-1} $$
其中:
- $ K = \operatorname{diag}(f, f, 1) $ 是相机内参矩阵(假设主点在图像中心,无畸变);
- $ R_1, R_2 $ 分别为第一帧和第二帧对应的全局旋转矩阵(例如由欧拉角
Z-Y-X或Z-X-Z构造); - $ R_{21} = R_2 R_1^\top $ 表示从视图1到视图2的相对旋转(即视图1坐标系下观察到的视图2朝向)。
✅ 关键洞察:即使 $ K $ 是对角阵,$ K R{21} K^{-1} $ 仍会耦合缩放效应——尤其影响第3列(即 $ H{02}, H_{12} $),这正是用户困惑中缺失的部分。错误地忽略 $ K $ 的左右作用,会导致平移项(即图像坐标系中的“偏置”)计算失准。
✅ Python 实现示例(基于问题参数)
import numpy as np
from scipy.spatial.transform import Rotation as R
# 参数设定
f = 400.0
pan1, pan2 = 10 * np.pi/180, 15 * np.pi/180
# 构造各自旋转(仅绕Z轴Pan,即纯水平旋转)
R1 = R.from_euler('z', pan1).as_matrix() # 注意:scipy中'z'即Z轴
R2 = R.from_euler('z', pan2).as_matrix()
R21 = R2 @ R1.T # 相对旋转
# 内参矩阵及其逆
K = np.diag([f, f, 1.0])
K_inv = np.linalg.inv(K)
# 正确的单应性矩阵
H = K @ R21 @ K_inv
H = H / H[2, 2] # 归一化,使 H[2,2] == 1.0(齐次坐标惯例)
print("Computed H (K @ R21 @ K⁻¹):")
print(np.round(H, 6))
输出将高度接近 cv2.findHomography 的结果(浮点精度内一致),特别是关键的 $ H{02} $ 和 $ H{12} $ 元素(即最后一列前两项),它们表征了因旋转引起的图像中心偏移,完全由 $ K $ 的尺度变换决定,不可省略。
⚠️ 注意事项与常见误区
勿混淆“世界到相机”与“图像到图像”变换:
单应性 $ H $ 描述的是同一平面点在两幅图像像素坐标间的映射 $ x_2 = H x_1 $,而非三维空间中的刚体变换。它隐含了平面假设(如 Z=0)和相机模型。焦距 $ f $ 不可设为1或忽略:
即使 $ K $ 对角,$ K R{21} K^{-1} $ 中的非对角缩放项(如 $ f \cdot R{21}[0,2]/f = R{21}[0,2] $)看似抵消,但第3列实际为: $$ \begin{bmatrix} f \cdot R{21}[0,0]/f & f \cdot R{21}[0,1]/f & f \cdot R{21}[0,2] \ f \cdot R{21}[1,0]/f & f \cdot R{21}[1,1]/f & f \cdot R{21}[1,2] \ R{21}[2,0] & R{21}[2,1] & R{21}[2,2] \end{bmatrix} \Rightarrow \begin{bmatrix} R{21}[0,0] & R{21}[0,1] & f \cdot R{21}[0,2] \ R{21}[1,0] & R{21}[1,1] & f \cdot R{21}[1,2] \ R{21}[2,0] & R{21}[2,1] & R{21}[2,2] \end{bmatrix} $$ 可见 $ H{02}, H_{12} $ 显式正比于 $ f $,直接决定图像平移量级。推广至一般旋转(含tilt/roll):
只要场景平面仍为 Z=0(或任意已知平面 $ \Pi: n^\top X + d = 0 $),通用公式为: $$ H = K \left( R - \frac{t\,n^\top}{d} \right) K^{-1} $$ 纯旋转时 $ t = 0 $,退化为 $ H = K R K^{-1} $;而用户案例中因误用 $ R_{21} $ 未左乘 $ K $、右乘 $ K^{-1} $,导致第3列失准。
✅ 总结
- 纯旋转下两图像的单应性矩阵必须通过 $ H = K\,R_{21}\,K^{-1} $ 严格计算;
- 所有9个元素均由该式自然导出,无需分块猜测或经验修正;
- 第3列($ H{02}, H{12} $)承载着旋转在图像平面上的平移效应,其大小与焦距 $ f $ 成正比;
- 实践中建议始终显式构造 $ K $ 并执行完整矩阵乘法,避免因“对角假设”引入系统性偏差。
此方法兼具理论严谨性与工程可复现性,是SLAM、全景拼接及无人机正射校正等应用中处理纯旋转序列的基础工具。










