如何检测一个棋盘角?

Posted

技术标签:

【中文标题】如何检测一个棋盘角?【英文标题】:How to detect one chessboard corner? 【发布时间】:2017-06-14 11:48:58 【问题描述】:

给定一个棋盘图像,OpenCV(Matlab等)函数可以非常精确地检测棋盘角。

现在我只有一个棋盘状角点(请看两张附图),如何精确检测角点?有没有可用的功能?

如果没有,有人可以告诉我在 OpenCV 中查找棋盘角的实现细节吗?也许我可以用类似的想法自己实现一个棋盘角检测。

谢谢。

【问题讨论】:

你试过OpenCV的findChessboardCorners功能吗? 不行,因为它不是棋盘。 不一定是棋盘,反正你可以试试后面的方法harris corner detector再用cornerSubPix得到更准确的位置(亚像素) 【参考方案1】:

您可以使用Harris Corner detector 查找图像中的角。如果您在 MATLAB 中有图像处理工具箱,则可以使用 corner() 函数来检测角点:https://uk.mathworks.com/help/images/ref/corner.html

检测角点的MATLAB代码:

image = imread('E8UD1.png');
imageGray  = rgb2gray(image);
C = corner(imageGray);
imshow(imageGray);
hold on;
plot(C(:,1), C(:,2), 'r*');

评论后更新

corner() 函数在检测角点方面做得不错,但你是对的,你确实得到了异常值,我建议使用更精细的算法,它被称为 Shi-Tomasi Corner Detector & Good Features to Track

这是我运行新图像时得到的结果:

仍然不完美,但您可以尝试使用 goodFeaturesToTrack() 函数的参数

代码如下:

import numpy as np
import cv2

filename = 'ddNNZ.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

corners = cv2.goodFeaturesToTrack(gray,1,0.01,10)
corners = np.int0(corners)

for i in corners:
    x,y = i.ravel()
    cv2.circle(img,(x,y),3,255,-1)

cv2.imwrite('result.png',img)

【讨论】:

corner() 函数可以检测到非常高质量图像中的交点。但是,对于常规图像(我添加了一个新图像),角函数无法检测到交点。实际上,它检测两个黑色矩形的相交区域之间的两个角点。也许我们需要一种方法来合并两个角点。 这很奇怪,因为当我通过 corner() 函数运行图像时,我返回了一个像素,你可以使用这行代码 plot(C(:,1), C(:,2), 'r*'); 来绘制它,假设 C 包含 X 和 Y 坐标角落。我会用一点代码来编辑答案。 请测试我刚刚添加的新图像。这些图像是相机拍摄的图像。之前的图像是屏幕中函数生成的完美图像。 谢谢。我已经尝试过您的方法并阅读了 goodFeaturesToTrack()。您的方法可以解决给定的两个图像。但是,它并不是所有此类图像的解决方案。我们需要通过理解棋盘角检测算法的思想来设计一种新的方法。 github.com/opencv/opencv/blob/master/modules/calib3d/src/… 这是一个很好的答案,通过 findChessboardCorners() 函数的内部工作原理 - dsp.stackexchange.com/questions/2805/…

以上是关于如何检测一个棋盘角?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Leap Motion 上检测用于相机校准的棋盘?

如何对找到的棋盘角进行排序?

如何用opencv找到模糊角位置?

Python 如何使用 HoughLines 和 OpenCV 检测图像中的垂直线和水平线?

尝试查找棋盘角时出现opencv python错误

寻找倾斜图像的棋盘角