我正在尝试使用 OpenCV 的现成的立体校准代码(使用所有默认参数并使用 Bouguet 算法)来校准我的立体相机,但是校正后的图像没有显示出良好的校准:它们被裁剪得太多,以至于这些图像仅由几个像素组成。我不确定我做了什么,因为我能够让这个校准脚本与不同的相机对一起工作...我使用 20 对图像进行校准并改变棋盘相对于棋盘的方向每张图像中的相机。任何建议将不胜感激!
我找到了解决办法!事实证明,在
CALIB_FIX_K3 + CALIB_FIX_K4 + CALIB_FIX_K5
的标志参数中使用 cv::stereoCalibrate
的默认值导致了这个问题,只需删除它们就可以解决问题。为了清楚起见,这就是工作函数调用的样子:
double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
cameraMatrix[0], distCoeffs[0],
cameraMatrix[1], distCoeffs[1],
imageSize, R, T, E, F,
CALIB_FIX_ASPECT_RATIO +
CALIB_ZERO_TANGENT_DIST +
CALIB_USE_INTRINSIC_GUESS +
CALIB_SAME_FOCAL_LENGTH +
CALIB_RATIONAL_MODEL,
TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 100, 1e-5) );
为stereoRectify 使用与stereoCalibrate 相同的标志似乎也很重要!如果我为 StereoCalibrate 指定标志,而只在 StereoRectify 中保留默认标志,则右侧图像的最终 ROI 始终为空。