立体相机校准与使用 OpenCV 的两个单相机校准之间的区别

Difference between stereo camera calibration vs two single camera calibrations using OpenCV

我的车有左右两个摄像头。我分别校准每个相机与我执行“立体校准”之间有区别吗?我问是因为我注意到 OpenCV documentation 中有一个 stereoCalibrate 函数,还有一个用于 MATLAB 的立体声校准工具。如果我分别对每个相机进行校准,然后使用每个相机的未失真图像进行深度计算,结果是否相同?

我不确定这两种方法有什么区别。我分别对每个相机进行了正常的相机校准。

对于intrinsics,没关系。不过,添加的信息(“一对相机”)可能会使校准效果更好一些。

立体校准为您提供外在,即相机之间的变换矩阵。那是为了... 立体视觉。如果你不进行立体标定,你就会缺少外部函数,然后你根本无法进行任何深度估计,因为那需要外部函数。

TL;DR 如果你想要 3D 点,你需要立体校准。

长答案 单摄像头标定和立体摄像头标定有很大区别

单相机标定的输出仅为内在参数(即 3x3 相机矩阵和一些畸变系数,具体取决于所使用的模型)。在 OpenCV 中,这是通过 cv2.calibrateCamera 完成的。您可以检查 my custom library 这有助于减少样板文件。

当您进行立体校准时,其输出由两个相机的内在参数外在参数给出。 在 OpenCV 中,这是通过 cv2.stereoCalibrate 完成的。 OpenCV 修复了第一台摄像机的世界原点,然后你得到一个旋转矩阵 R 和平移向量 t 从第一台摄像机(原点)到第二台摄像机。

那么,为什么我们需要外部函数?如果您使用立体系统进行 3D 扫描,那么您需要那些(和内部函数)来进行 三角测量,所以要得到space中的3D点:如果你知道一个通​​用点p在space中在两个相机上的投影,那么你就可以计算出它的位置.

要对@Christoph 之前正确回答的内容进行补充,内在函数应该 几乎 相同,但是,cv2.stereoCalibrate 如果未设置标志 CALIB_FIX_INTRINSIC,则可能会改进内在函数的计算。出现这种情况是因为两个摄像头和标定板组成的系统是通过数值优化整体解决的。