立体校准:相机坐标系之间的映射

时间:2018-10-08 20:49:15

标签: opencv camera computer-vision camera-calibration calibration

我需要找到两个摄像机坐标系之间的映射。 我之前已经计算了两个摄像机的本征和外在性,因此我将它们设置为{strong> cv2.CALIB_FIX_INTRINSIC 标志的stereoCalibrate函数。

reprojErr, _, _, _, _, R, T, E, F = cv2.stereoCalibrate(objectPoints, imagePoints1, imagePoints2, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageShape, flags=cv2.CALIB_FIX_INTRINSIC)

其中: objectPoints 是对象坐标空间中棋chess点的数组, imagePoints1 imagePoints2 是分别来自第一和第二个摄像机的对应图像在棋盘内角位置的数组。

在处理了约50对对应的图像之后,我得到了巨大的重投影误差(> 10),对于较小数量的(〜10)图片,该误差是合理的小。 所有图像都有清晰可见的棋盘,可以正确检测到: correctly detected chessboards

现在,请考虑以下Python代码摘录:

_, rvec1, tvec1, _ = cv2.solvePnPRansac(objectPoints, imagePoints1, cameraMatrix1, distCoeffs1)
rvec2 = np.matmul(R, rvec1)
tvec2 = np.matmul(R, tvec1) + T
_, rvec2_ref, tvec2_ref, _ = cv2.solvePnPRansac(objectPoints, imagePoints2, cameraMatrix2, distCoeffs2)

我希望 rvec2 tvec2 分别等于(足够接近) rvec2_ref tvec2_ref 。由于某些原因,这不是事实,无论 stereoCalibrate 返回的重投影错误有多大。为了进行视觉验证,我使用 rvec2 tvec2 (如右图所示)绘制了3个正交矢量(2个跨越棋盘的平面及其法线)的投影框架: terrible transformation result

整个校准代码都可用here。 您能告诉我哪里出了问题以及如何解决吗?欢迎所有提示。

0 个答案:

没有答案