【问题标题】:OpenCV findChessboardCorners function is failing in a (apparently) simple scenarioOpenCV findChessboardCorners 函数在(显然)简单的场景中失败
【发布时间】:2013-08-01 12:02:44
【问题描述】:

我正在尝试使用 OpenCV 找到棋盘的角。

我使用的图像包含两个棋盘,但我只对其中一个的子区域感兴趣。 下图为原图。

使用 GIMP,然后我选择了感兴趣的区域,并将所有其他像素设置为默认值。

我实际上并没有裁剪图像,因为我已经使用此图像尺寸校准了相机并且我不想更改它。 该操作应该等同于更改图像矩阵中的值,但我更喜欢使用 GIMP 进行操作。这是一个一次性的实验,使用图形工具而不是使用代码执行该操作更快。

生成的图像包含一个 24x5 角的棋盘,但函数 findChessboardCorners 找不到任何东西。

这是我正在使用的 Python 代码:

>>> img = cv2.imread('C:\\Path\\To\\C4-Cropped.png', 0)
>>> cv2.findChessboardCorners(img, (24, 5))
(False, None)
>>> cv2.findChessboardCorners(img, (5, 24))
(False, None)

我也试过设置自适应阈值,但还是不行

>>> cv2.findChessboardCorners(img, (24, 5), flags=cv2.cv.CV_CALIB_CB_ADAPTIVE_THRESH)
(False, None)

这看起来很奇怪。我过去多次使用过 OpenCV 的这个功能,并且它总是有效,即使图像看起来比这个更复杂。 该区域的照明不是均匀的,但函数应该足够强大以处理它。

使用 GIMP 临时创建的 人工 图像有什么问题吗? 我怎样才能找到角落?

任何建议将不胜感激。

【问题讨论】:

  • 你应该在你的问题中包含findChessboardCorners这个函数......否则真的没有任何人可以帮助...... :)
  • 您的意思是在问题的标签中吗?不幸的是,我的声誉还不够高,无法创建自定义标签
  • 你先转灰度了吗?

标签: python opencv computer-vision camera-calibration


【解决方案1】:

需要进行两项更改才能使该图像能够被非常挑剔的cv2.findChessboardCorners 函数所接受。首先,棋盘需要白色背景。我只是通过调整图像的对比度来获得这个。其次,我还必须将连接棋盘顶部和底部黑色方块的黑色水平线涂成白色。这是生成的图像:

通过这些增强功能,cv2.findChessboardCorners 可以成功分析图像。结果是:

camera matrix =
    [[  1.67e+04   0.00e+00   1.02e+03]
    [  0.00e+00   1.70e+04   5.45e+02]
    [  0.00e+00   0.00e+00   1.00e+00]]

distortion coefficients = [ -4.28e+00   1.38e+03  -8.59e-03  -1.49e-02   6.93e+00]

(图像增强方式的微小变化可以极大地改变上述结果。只有一张小棋盘的图像,这些结果是不可信的。)

如您所述,cv2.findChessboardCorners 接受旨在帮助识别棋盘的标志(自适应阈值、filter_quads 和规范化)。我尝试了所有方法,但它们在这里没有任何区别。

【讨论】:

    【解决方案2】:

    我敢打赌,findChessboardCorners 中的图像阈值处理会因为蒙版图像中的背景而产生垃圾。

    我建议进行裁剪,提取棋盘,然后将找到的角的坐标偏移裁剪窗口位置。

    【讨论】:

      【解决方案3】:

      在国际象棋图案周围添加空白。 "注意:该功能需要在板子周围留有空白(如方形粗边框,越宽越好),以使检测在各种环境下更加稳健。否则,如果没有边框且背景较暗,则外部黑色正方形无法正确分割,因此正方形分组和排序算法失败。 "

      【讨论】:

        【解决方案4】:

        我正在处理几乎相同的问题,但使用的是 c++。 函数findChessboardCorners 并不总是能识别给定尺寸的棋盘,并且看到你的图像的光照没有散布在棋盘上,我认为这会有所不同。我的建议是减少你的棋盘的大小,直到你找到一些东西。 !!

        【讨论】:

          【解决方案5】:

          用于 Matlab 的计算机视觉系统工具箱中的 detectCheckerboardPoints 函数检测到它,但它为您提供了一个额外的列:

          您应该能够去掉右侧多余的列,但将所选区域的右边缘向左移动一点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-14
            • 1970-01-01
            • 2015-10-05
            相关资源
            最近更新 更多