如何检测一个棋盘角?
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/…以上是关于如何检测一个棋盘角?的主要内容,如果未能解决你的问题,请参考以下文章