matlab - 什么是最好的相机校准方法?

标签 matlab opencv computer-vision camera-calibration matlab-cvst

我明白上面的问题是广泛而模糊的。 但要放在上下文中: 我正在尝试确定相机姿势和位置估计的准确性。我花了数周时间校准和尝试不同的方法和不同尺寸的板、照明、距离等。

我尝试过的方法:

描述:

  • 在相机前使用大约 20 张不同方向和位置的图像
  • 对于尺寸为 25mm、32mm 和 50mm 的 9x6 棋盘格
  • 分辨率为 1280x720 和 1920x1080
  • 距离从小板的 500 毫米到大板的 2000 毫米不等

在所有情况下,我都按照此链接遵守严格的指导方针 How to verify the correctness of calibration of a webcam?

在上述因素的所有组合中,我得到的结果相差几毫米 (+- 15mm) 对于上述方法,我对 1280x720 的 25mm block 的内在特性如下:

  • OpenCV 的内置校准方法 > fx = 1269.4 fy = 1269.49 cx = 639.5 cy = 359.5
  • Matlab 校准工具箱 > fx = 1259.53 fy = 1260.76 cx = 661.3 cy = 306.5
  • Matlab 校准应用 > fx = 1255.1 fy = 1254.8 cx = 652.6 cy = 340.7
  • 手动调整值。 > 各种结果,除 cx = 639.5 cy = 359.5 外均不稳定

这不应该是这样的。在处理 1 米以下的距离时,相机相对于电路板原点的位置应该精确到平均一两毫米,如果不是亚毫米精度的话。除非我弄错了?

我的问题是,对于高清网络摄像头,失真小的理想、简单的校准方法是什么?

最佳答案

有许多可能的错误来源。

首先,虽然您尝试过的所有三种校准实现都使用基本相同的算法,但存在足够多的差异可以解释结果的差异。

主要区别在于棋盘角检测。 Caltech Calibration Toolbox 没有自动棋盘检测功能,而是使用第二个优化 channel 来细化角点。 OpenCV 和 Camera Calibrator App 都会自动检测棋盘,但 Camera Calibrator App 中使用的算法要好得多。它更健壮,这意味着它很可能在 OpenCV 未检测到板时检测到板,并且其亚像素定位更精确。我的观点是,在这三种方法中,您使用不同的数据点进行校准。因此,您的结果不同也就不足为奇了。

校准后,您会得到什么样的重投影误差? Camera Calibrator App 会显示重投影误差的条形图。你应该看看它,并排除给你带来高错误的图像。理想情况下,您希望平均重投影误差小于半个像素。越低越好。

现在我不得不问你,你是如何测量从相机到棋盘的距离的?您从校准中获得的外部参数表示从棋盘坐标系到相机坐标系的转换,其原点位于相机外壳内部的光学中心。这很难准确测量。更好的方法是 place a flat object of a known size on the checkerboard and measure it using the camera .事实上,您可以测量检测到的棋盘角之间的距离。请注意,检测精度是另一个误差来源。

另外,请确保不要将校准图像保存为 jpeg。压缩伪像会影响棋盘角检测的准确性。使用 tiff 或 png 等无损格式。

关于matlab - 什么是最好的相机校准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27256994/

相关文章:

visual-studio-2010 - 在 Windows 7 64 位上编译 OpenCV

c++ - 使用 HTK(隐马尔可夫工具包)的 C/C++ 代码示例

c++ - 如何使用 OpenCV 在图像中查找扑克牌?

Photoshop 中自动对比功能背后的算法

c# - 如何在 C# 中使用由 MATLAB 编译的 C++ DLL

matlab - 消除图像中两种颜色边缘的颜色过渡效果

windows - 如何修复 Matlab 中 10800x10800 矩阵的内存不足错误?

image - 如何选择结构元素?

android - 如何在 Android App 中集成 OpenCV Manager

python - OpenCV 网络摄像头问题