我在67张图像上运行cv2.calibrateCamera,每张图像均具有19x3棋盘角检测。我发现重投影误差约为0.3。当我不扭曲图像时,它们看起来很棒。它们之前几乎没有变形,之后看上去基本上是完美的。这是用高质量的科学相机拍摄的,但是他们看到的是在水下,这使事情变得复杂。
稍后,我将这些摄像机校准(以及来自立体声设置中其他摄像机的校准)用作stereoCalibrate的输入,该校准返回的误差约为0.3。当我尝试进行立体校正和重新映射时,我会胡说八道:黑色图像或扭曲图像,具体取决于cv2.stereoRectify中的alpha参数。
这使我回到了原始的相机矩阵。我通过相机校准得到的失真系数是
array([[-1.44561083e-01, -3.21620254e+01, 0.00000000e+00,
0.00000000e+00, 1.72034253e+03]])
K3似乎很大!知道这里发生了什么吗?以后会毁了我的立体声矫正吗?
答案 0 :(得分:0)
由于似乎很少有人遵循opencv的问题,直到他们需要答案,所以我将分享我学到的东西。
利用涉及校准板高度定向的校准数据集,立体声校准算法很容易过度拟合。例如,我的40张校准图像与1cm的增量变化以及17个横向方向相关。相机质量很高,基本上没有失真。这导致大量的过拟合:我认为opencv算法正在学习校准图像方向上的图案。
在这种情况下,我找到的解决方案是使用Matlab中的Bouquet工具箱。它优于opencv,因为它允许在优化中限制许多参数。这有助于克服我遇到的过拟合问题,该问题导致较大的图像失真。