OpenCV findChessboardCorners函数在(显然)简单的场景中失败

时间:2013-08-01 12:02:44

标签: python opencv computer-vision camera-calibration

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

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

Original image

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

Cropped image

我实际上没有裁剪图像,因为我已经使用这个图像尺寸校准了相机,我不想改变它。 该操作应该相当于更改图像矩阵中的值,但我更喜欢使用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临时创建的人工图像有问题吗? 我怎样才能找到角落?

任何建议都将不胜感激。

5 个答案:

答案 0 :(得分:5)

我打赌5美元,由于蒙面图片中的背景,findChessboardCorners中的图像阈值处理会产生垃圾。

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

答案 1 :(得分:5)

我知道我已经晚了几个月了,但是需要进行两项更改才能使这张图片能够被非常挑剔的cv2.findChessboardCorners函数接受。首先,棋盘需要白色背景。我只是通过调整图像的对比度来获得这个。其次,我还必须将连接棋盘顶部和底部黑色方块的黑色水平线变暗。这是结果图像: enter image description here

通过这些增强功能,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 :(得分:3)

在国际象棋模式周围添加空白区域。 “注意:该功能需要在电路板周围设置白色空间(如方形粗边框,越宽越好),以便在各种环境下检测更加稳健。否则,如果没有边框且背景暗,则外部黑色方块无法正确分割,因此方形分组和排序算法失败。 “

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

Result of detectCheckerboardPoints from Matlab

您应该能够摆脱右侧的额外列,但将所选区域的右边缘向左移动一点。