在OpenCV api中,有cv::stereoCalibrate()
和cv::fisheye::stereoCalibrate()
分别用于校准普通立体相机和鱼眼立体相机。对于这两个api,立体相机对使用相同的相机模型。也就是说,对于cv::stereoCalibrate()
,两种立体摄像机必须使用正常摄像机模型(6个径向畸变系数+ 2个切向畸变系数),对于cv::fisheye::stereoCalibrate()
,两种立体摄像机必须使用鱼眼摄像机模型(4个鱼眼畸变系数)。
是否有办法校准立体相机对,其中一个使用普通相机模型,另一个使用鱼眼相机模型通过OpenCV?
对于任何发现这个问题有帮助的人来说,OpenCV不支持混合相机模型(例如,一个是正常的,另一个是鱼眼的)的立体校准(即通过stereoCalibrate()
API)。但是,这可以通过以下步骤完成:
- 通过API
cv::calibrateCamera()
或cv::fisheye::calibrate()
校准每个相机的内在特性。 - 通过API
cv::undistortPoints()
或cv::fisheye::undistortPoints()
为两个相机使用先前的intrinsic来消除所有图像点的扭曲。 -
使用前一步未失真后的图像点校准立体对的外部和"完美的内在";
通过API
cv::stereoCalibrate()
或cv::fisheye::stereoCalibrate()
(CALIB_FIX_INTRINSIC
标志仅计算外部性)。具有完美本征的摄像机,其摄像机矩阵为[1 0 0];0 0 0;0 0 1],失真为零(失真系数均为0)。注意:在这一步中使用
cv::stereoCalibrate()
或cv::fisheye::stereoCalibrate()
并不重要,它们将导致相同的外部外观