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

2024-05-22 09:37:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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临时创建的人工图像有问题吗? 我怎样才能找到角落?

任何建议都将不胜感激。


Tags: 函数代码图像nonefalse区域img棋盘
3条回答

我敢打赌5美元,findChessboardCorners内部的图像阈值会产生垃圾,因为遮罩图像中的背景。

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

在棋盘格周围加上空格。 “注意:该功能需要在电路板周围留出空白(像一个正方形的粗边框,越宽越好),以使检测在各种环境下更加可靠。否则,如果没有边界且背景是黑色的,则外部黑色方块无法正确分割,因此方块分组和排序算法失败。 “。”

需要进行两项更改才能使非常挑剔的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接受旨在帮助棋盘识别的标志(自适应阈值、过滤四元值和规范化)。我都试过了,但在这里没有什么不同。

相关问题 更多 >