我正在尝试使用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
函数接受,需要进行两项更改。首先,国际象棋棋盘需要白色背景。我只是通过调整图像上的对比度来获得的。其次,我还必须清除连接棋盘顶部和底部黑色正方形的深色水平线。这是生成的图像:
通过这些增强功能,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和规范化)。我尝试了所有,但在这里没什么区别。