基于Homography单应矩阵求解相机位姿的相关疑问咨询
单应矩阵分解求解相机位姿问题解答
问题1:[R|t]的变换方向
首先明确单应矩阵的通用定义前提:所有匹配的关键点都处于世界坐标系(你所说的关键点坐标系)下Z=0的平面,此时绝大多数开源框架(包括OpenCV)定义的单应矩阵满足:图像齐次2D点 = H * 世界平面齐次2D点。
基于这个定义分解得到的[R|t],变换方向是世界坐标系→相机坐标系,即可以用P_cam = R * P_world + t将世界系下的3D点转换为相机系下的3D点。
问题2:多组候选解的筛选方法
分解单应矩阵通常会得到4组候选的R、t组合,筛选逻辑非常明确:
- 核心判断依据是所有可见点的深度必须为正:将每组候选R、t代入投影公式,计算所有匹配关键点在相机坐标系下的Z坐标(深度),所有点深度都为正的那组就是正确解。
- 如果你用OpenCV,可以直接调用
filterHomographyDecompByVisibleRefpoints()函数完成自动筛选,不需要手动实现判断逻辑。
问题3:H维度不匹配的疑惑
你看到的H=K[R|t]是省略了适用前提的简化写法,完整的推导逻辑如下:
当物方点都处于世界系Z=0平面时,3D世界点的齐次坐标为[X,Y,0,1]^T,代入相机投影公式可得:
u = K * [R|t] * [X,Y,0,1]^T = K * (R1*X + R2*Y + t)
其中R1、R2是旋转矩阵R的前两列,此时原来3×4的[R|t]去掉了对应Z轴的第三列,变成了3×3的[R1 R2 t]矩阵,因此完整的单应矩阵公式是H = K * [R1 R2 t],两边都是3×3矩阵,维度完全匹配。
问题4:SolvePnP的使用场景判断
是否需要调用SolvePnP分两种情况:
- 如果你只是需要快速得到粗精度的位姿,且能确认所有匹配关键点都共面,直接用H分解得到的rvect、tvect即可,不需要额外调用SolvePnP。
- 如果你需要更高精度的位姿结果,建议调用SolvePnP做优化:H分解得到的是闭式解,受关键点匹配噪声的影响很大,而SolvePnP会基于重投影误差做非线性优化,精度更高。
没有3D物方点的解决方法:
因为你的场景适配单应矩阵,所以所有关键点都在同一平面上,你可以自定义世界坐标系:将关键点所在平面设为Z=0平面,手动给每个2D匹配点分配对应的世界系3D坐标[X,Y,0]即可,比如对于平面标定板可以用实际物理尺寸赋值,对于自然场景的平面可以自定义尺度赋值。
内容的提问来源于stack exchange,提问作者xXNukem KS
相关产品推荐
相关产品推荐

