Muf*_*ffo 5 python opencv computer-vision camera-calibration
我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)
我也尝试设置自适应阈值,但它仍然无效
>>> cv2.findChessboardCorners(img, (24, 5), flags=cv2.cv.CV_CALIB_CB_ADAPTIVE_THRESH)
(False, None)
Run Code Online (Sandbox Code Playgroud)
这看起来很奇怪.我过去多次使用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]
Run Code Online (Sandbox Code Playgroud)
(图像增强方式的细微变化可以极大地改变上述结果.只有一张小棋盘的图像,这些结果是不可信的.)
如您所述,cv2.findChessboardCorners接受旨在帮助棋盘识别的标志(自适应阈值,filter_quads和规范化).我尝试了所有,但他们在这里没有任何区别.
我打赌5美元,由于蒙版图像中的背景,findChessboardCorners中的图像阈值处理会产生垃圾.
我建议做一个裁剪,提取棋盘,然后通过裁剪窗口位置偏移找到的角落的坐标.
小智 5
在国际象棋图案周围添加空白区域。”注:该功能需要在板子周围留白(如方形粗边框,越宽越好),以使检测在各种环境下更加稳健。否则,如果没有边框且背景较暗,则外部黑色正方形无法正确分割,因此正方形分组和排序算法失败。”
我正在解决几乎相同的问题,但是是在 C++ 中。该函数findChessboardCorners并不总是能够识别给定尺寸的棋盘,并且由于图像的照明没有散布在棋盘上,我认为这会产生影响。我的建议是减小棋盘的大小,直到找到东西为止。!!