成功后如何获得好cv2.stereoCalibratecv2.calibrateCamera
How to get a good cv2.stereoCalibrate after successful cv2.calibrateCamera
大家好,我一直在使用 Python 和 OpenCV 深入研究计算机视觉,并试图校准我购买的两个相机以进行一些 3D 立体重建,但我有一些问题。
我主要遵循这个 tutorial 来单独校准相机(我将它应用于它们)然后我打算使用 cv2.stereoCalibrate 来获得相对校准。
通过单相机校准,一切似乎都正常工作,我得到一个非常低的重新投影错误,据我所知,矩阵看起来不错。这里我留下单相机标定的结果。
cameraMatrix1 和 distCoeffs1:
[[ 951.3607329 0. 298.74117671]
[ 0. 954.23088299 219.20548594]
[ 0. 0. 1. ]]
[[ -1.07320015e-01 -5.56147908e-01 -1.13339913e-03 1.85969704e-03
2.24131322e+00]]
cameraMatrix2 和 distCoeffs2:
[[ 963.41078117 0. 362.85971342]
[ 0. 965.66793023 175.63216871]
[ 0. 0. 1. ]]
[[ -3.31491728e-01 2.26020466e+00 3.86190151e-03 -2.32988011e-03
-9.82275646e+00]]
因此,在完成这些之后,我执行以下操作(我修复了我从之前的校准中已经知道的内在函数):
stereocalibration_criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 100, 1e-5)
stereocalibration_flags = cv2.CALIB_FIX_INTRINSIC
stereocalibration_retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F = cv2.stereoCalibrate(objpoints,imgpoints_left,imgpoints_right,cameraMatrix1,distCoeffs1,cameraMatrix2,distCoeffs2,gray_left.shape[::-1],criteria = stereocalibration_criteria, flags = stereocalibration_flags)
我已经尝试过多次更改 stereoCalibrate 的标志并切换矩阵以查看我是否在顺序上弄错了,这很重要,但我仍然受阻并得到大约 30 (然后我尝试纠正图像,结果当然是一场灾难)。
我也尝试过使用来自互联网的一些校准图像,但我确实得到了相同的结果,所以我认为问题不在于我拍摄的图像。如果有人能指出我正确的方向或知道可能是什么,将非常欢迎。
事实证明,我使用的左右摄像头的图像顺序不一样...我使用的是
images_left = glob.glob('Calibration/images/set1/left*' + images_format)
images_right = glob.glob('Calibration/images/set1/right*' + images_format)
当我应该使用更像的东西时:
images_left = sorted(glob.glob('Calibration/images/set1/left*' + images_format))
images_right = sorted(glob.glob('Calibration/images/set1/right*' + images_format))
这是因为 glob 以明显随机的顺序获取图像,所以我试图匹配错误的图像。现在我终于得到了 0.4 retval,这还不错。
大家好,我一直在使用 Python 和 OpenCV 深入研究计算机视觉,并试图校准我购买的两个相机以进行一些 3D 立体重建,但我有一些问题。
我主要遵循这个 tutorial 来单独校准相机(我将它应用于它们)然后我打算使用 cv2.stereoCalibrate 来获得相对校准。
通过单相机校准,一切似乎都正常工作,我得到一个非常低的重新投影错误,据我所知,矩阵看起来不错。这里我留下单相机标定的结果。
cameraMatrix1 和 distCoeffs1:
[[ 951.3607329 0. 298.74117671]
[ 0. 954.23088299 219.20548594]
[ 0. 0. 1. ]]
[[ -1.07320015e-01 -5.56147908e-01 -1.13339913e-03 1.85969704e-03
2.24131322e+00]]
cameraMatrix2 和 distCoeffs2:
[[ 963.41078117 0. 362.85971342]
[ 0. 965.66793023 175.63216871]
[ 0. 0. 1. ]]
[[ -3.31491728e-01 2.26020466e+00 3.86190151e-03 -2.32988011e-03
-9.82275646e+00]]
因此,在完成这些之后,我执行以下操作(我修复了我从之前的校准中已经知道的内在函数):
stereocalibration_criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 100, 1e-5)
stereocalibration_flags = cv2.CALIB_FIX_INTRINSIC
stereocalibration_retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F = cv2.stereoCalibrate(objpoints,imgpoints_left,imgpoints_right,cameraMatrix1,distCoeffs1,cameraMatrix2,distCoeffs2,gray_left.shape[::-1],criteria = stereocalibration_criteria, flags = stereocalibration_flags)
我已经尝试过多次更改 stereoCalibrate 的标志并切换矩阵以查看我是否在顺序上弄错了,这很重要,但我仍然受阻并得到大约 30 (然后我尝试纠正图像,结果当然是一场灾难)。
我也尝试过使用来自互联网的一些校准图像,但我确实得到了相同的结果,所以我认为问题不在于我拍摄的图像。如果有人能指出我正确的方向或知道可能是什么,将非常欢迎。
事实证明,我使用的左右摄像头的图像顺序不一样...我使用的是
images_left = glob.glob('Calibration/images/set1/left*' + images_format)
images_right = glob.glob('Calibration/images/set1/right*' + images_format)
当我应该使用更像的东西时:
images_left = sorted(glob.glob('Calibration/images/set1/left*' + images_format))
images_right = sorted(glob.glob('Calibration/images/set1/right*' + images_format))
这是因为 glob 以明显随机的顺序获取图像,所以我试图匹配错误的图像。现在我终于得到了 0.4 retval,这还不错。