为何OpenCV calibrateCamera中各视图的rvecs与tvecs存在差异?
关于cv2.calibrateCamera输出rvecs和tvecs的疑问
我难以理解cv2.calibrateCamera输出的rvecs和tvecs的实际含义,我认为二者共同定义相机的位姿(即位置与姿态)。但当我将同一相机拍摄的多幅视图传入cv2.calibrateCamera时,却得到每个视图对应的rvecs和tvecs。若相机未移动,它们不应保持一致吗?
我为第一幅图像定义的单应矩阵如下:
K = mtx R = cv2.Rodrigues(rvecs[0])[0] T = tvecs[0] RT = np.concatenate((R,T),axis=1) H = np.dot(K, RT)
该矩阵能正确完成投影。按我对单应矩阵的理解,相机未移动时单应矩阵应保持不变,但R、T的变化会导致H也发生变化。看来我对OpenCV中rvecs和tvecs的定义存在重要误解。
解答
- rvecs和tvecs的定义与你理解的相反:OpenCV里的rvecs(旋转向量)和tvecs(平移向量),描述的是世界坐标系相对于相机坐标系的旋转和平移关系,而非相机在世界坐标系中的位姿。它们的作用是把世界坐标系下的3D点转换到相机坐标系中,公式为:
相机坐标 = R * 世界坐标 + T。 - 同一相机多视图输出不同的原因:标定过程中,世界坐标系默认绑定在每一张图的棋盘格上——哪怕相机没动,每张图里的棋盘格位置/姿态不同,对应的世界坐标系相对于相机的位姿就会变化,因此每帧的rvecs和tvecs自然不一样。
- 单应矩阵的矛盾点解释:你计算的H是相机到当前棋盘格平面的单应矩阵,这个矩阵的变化取决于棋盘格(世界坐标系)和相机的相对位置。如果相机不动但棋盘格动了,H必然会变化,这和相机是否移动无关。若要固定相机位姿,需要将世界坐标系绑定到一个固定的参考点,而非每张图的棋盘格上。
内容的提问来源于stack exchange,提问作者Mike Azatov
相关产品推荐
相关产品推荐

