基于基础矩阵求解未标定双相机的相对旋转与平移方向
核心逻辑澄清
你当前计算的T = np.linalg.inv(H1) @ H2是第二张图像平面到第一张图像平面的单应变换矩阵,仅能描述像素点的映射关系,无法直接分解得到相机位姿。你需要的旋转信息、光心方向向量应该从基础矩阵F推导得到,具体步骤如下:
前置依赖说明
因为你使用同一台相机拍摄两帧图像,两帧的内参矩阵K完全一致。如果没有预先标定得到K,你只能得到投影空间下的位姿结果,无法拿到度量级的旋转角度和平移尺度,仅能确定平移的方向。
步骤1:从基础矩阵计算本质矩阵
本质矩阵E和基础矩阵F的关系如下:
E = K.T @ F @ K
步骤2:分解本质矩阵得到位姿候选解
直接调用OpenCV内置的分解接口即可得到所有可能的位姿组合:
# 返回两组旋转候选R1、R2,一组平移方向向量t R1, R2, t = cv2.decomposeEssentialMat(E)
最终共得到4组可能的位姿组合:(R1, t)、(R1, -t)、(R2, t)、(R2, -t)
步骤3:筛选唯一正确的位姿
取任意一组匹配内点,对四组候选位姿分别做三角化计算3D点坐标,只有正确的位姿组合下,所有3D点在两个相机坐标系下的深度都为正值,以此规则即可筛选出最终的旋转矩阵R和光心方向向量t。
附:从单应矩阵T分解位姿的方法
如果你坚持要从当前计算的单应矩阵T提取信息,需要已知内参K,通过单应分解接口实现:
# 先将图像单应转相机平面单应 H_cam = np.linalg.inv(K) @ T @ K # 分解单应得到多组R、t、法向量n的候选 retval, Rs, ts, normals = cv2.decomposeHomographyMat(H_cam, K) # 同样通过三角化验证深度的方法筛选正确的R和t即可
注意该方法的精度远低于从本质矩阵分解的结果,不推荐使用。
内容的提问来源于stack exchange,提问作者Yulia Grinblat
相关产品推荐
相关产品推荐

