OpenCV 相机校准:distCoeffs 中的 k3 值非常大
OpenCV Camera Calibration: very large k3 value in distCoeffs
I 运行 cv2.calibrateCamera 在 67 张图像上,每张图像都有 19x3 棋盘角检测。我发现重投影误差在 0.3 左右。当我取消扭曲图像时,它们看起来很棒。它们之前几乎没有失真,之后看起来基本上是完美的。这是使用高质量的科学相机,但是他们看到的是水下,这使事情变得复杂。
稍后,我使用这些相机校准(以及立体设置中其他相机的校准)作为 stereoCalibrate 的输入,returns 误差约为 0.3。当我尝试立体校正和重新映射时,我得到了一些废话:黑色图像或扭曲图像,具体取决于 cv2.stereoRectify.
中的 alpha 参数
这让我回到了最初的相机矩阵。我的相机校准畸变系数是
array([[-1.44561083e-01, -3.21620254e+01, 0.00000000e+00,
0.00000000e+00, 1.72034253e+03]])
K3好像很大!知道这里发生了什么吗?这会不会破坏我以后的立体声校正?
由于似乎很少有人在需要答案之前一直关注 opencv 问题,因此我将分享我学到的知识。
对于涉及高度有序的校准板方向的校准数据集,立体校准算法很容易过度拟合。例如,我的 40 张校准图像通过 1 厘米的增量变化以及 17 个横向方向相关。相机质量非常高,基本上没有失真。这导致了大规模的过度拟合:我认为 opencv 算法正在学习校准图像方向中的模式。
我在这种情况下找到的解决方案是使用 Matlab 中的 Bouquet 工具箱。它优于 opencv,因为它允许在优化中限制许多参数。这有助于克服我遇到的导致大图像失真的过度拟合问题。
I 运行 cv2.calibrateCamera 在 67 张图像上,每张图像都有 19x3 棋盘角检测。我发现重投影误差在 0.3 左右。当我取消扭曲图像时,它们看起来很棒。它们之前几乎没有失真,之后看起来基本上是完美的。这是使用高质量的科学相机,但是他们看到的是水下,这使事情变得复杂。
稍后,我使用这些相机校准(以及立体设置中其他相机的校准)作为 stereoCalibrate 的输入,returns 误差约为 0.3。当我尝试立体校正和重新映射时,我得到了一些废话:黑色图像或扭曲图像,具体取决于 cv2.stereoRectify.
中的 alpha 参数这让我回到了最初的相机矩阵。我的相机校准畸变系数是
array([[-1.44561083e-01, -3.21620254e+01, 0.00000000e+00,
0.00000000e+00, 1.72034253e+03]])
K3好像很大!知道这里发生了什么吗?这会不会破坏我以后的立体声校正?
由于似乎很少有人在需要答案之前一直关注 opencv 问题,因此我将分享我学到的知识。
对于涉及高度有序的校准板方向的校准数据集,立体校准算法很容易过度拟合。例如,我的 40 张校准图像通过 1 厘米的增量变化以及 17 个横向方向相关。相机质量非常高,基本上没有失真。这导致了大规模的过度拟合:我认为 opencv 算法正在学习校准图像方向中的模式。
我在这种情况下找到的解决方案是使用 Matlab 中的 Bouquet 工具箱。它优于 opencv,因为它允许在优化中限制许多参数。这有助于克服我遇到的导致大图像失真的过度拟合问题。