我正在尝试使用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临时创建的人工图像有什么问题吗?
如何找到角落?

任何建议将不胜感激。

最佳答案

要使该图像被非常挑剔的cv2.findChessboardCorners函数接受,需要进行两项更改。首先,国际象棋棋盘需要白色背景。我只是通过调整图像上的对比度来获得的。其次,我还必须清除连接棋盘顶部和底部黑色正方形的深色水平线。这是生成的图像:
python - OpenCV findChessboardCorners函数在(显然)简单的场景中失败-LMLPHP

通过这些增强功能,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和规范化)。我尝试了所有,但在这里没什么区别。

10-05 18:04