我在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似乎很大!知道这里发生了什么吗?这会在以后破坏我的立体声矫正吗?
最佳答案
由于似乎很少有人遵循opencv的问题,直到他们需要答案,所以我将分享我学到的东西。
借助涉及校准板高度定向的校准数据集,立体声校准算法很容易过度拟合。例如,我的40张校准图像与1cm的增量变化以及17个横向方向相关。相机质量很高,基本上没有失真。这导致大量的过度拟合:我认为opencv算法正在学习校准图像方向上的图案。
在这种情况下,我发现的解决方案是使用Matlab中的Bouquet工具箱。它优于opencv,因为它允许在优化中限制许多参数。这有助于克服我遇到的过拟合问题,该问题会导致较大的图像失真。
关于opencv - OpenCV摄像机校准:distCoeffs中的k3值非常大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51567380/