2017-06-14 98 views
1

給定一個棋盤圖像,OpenCV(Matlab等)功能可以非常精確地檢測棋盤角落。如何檢測一個棋盤角?

現在我只有一個類似棋盤的角落(請參閱兩張附圖),我該如何準確檢測角點?有沒有可用的功能?

如果沒有,有人能告訴我在OpenCV中查找棋盤角落的實現細節嗎?也許我可以使用類似的想法來實現我自己的一個棋盤角落檢測。

謝謝。

enter image description here

enter image description here

+1

您是否試過OpenCV的[findChessboardCorners](http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners)函數? – api55

+0

它不起作用,因爲它不是棋盤。 –

+0

它不需要成爲一個棋盤,無論如何,你可以嘗試背後的方法,[哈里斯角落探測器](http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection。 html#cornerharris),然後使用[cornerSubPix](http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html#cornersubpix)獲得更精確的位置(子像素) – api55

回答

1

可以使用Harris Corner detector找到圖像中的角落。如果您有圖像處理工具箱在MATLAB,你可以使用corner()功能,探測角落:https://uk.mathworks.com/help/images/ref/corner.html

MATLAB代碼來檢測角落:後評論

corner()

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

更新函數在檢測角落方面做得不錯,但是你確實得到了異常值,我會推薦一個更復雜的算法,它被稱爲Shi-Tomasi Corner Detector & Good Features to Track

下面是結果我得到的,當我運行的新形象:

enter image description here

還不夠完美,但你可以玩弄的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) 
+0

角落( )功能可以在非常高質量的圖像中檢測交點。但是,對於常規圖像(我添加了一個新圖像),角落功能無法檢測到交點。實際上,它會檢測兩個黑色矩形的相交區域之間的兩個角點。也許我們需要一種方法來合併兩個角點。 –

+0

這很奇怪,因爲當我通過'corner()'函數運行圖像時,我得到一個返回的像素,可以使用這一行代碼plot(C(:,1),C(:,2), 'r *');'假設C包含角落的X和Y座標。我將用一點代碼編輯答案。 –

+0

請測試我剛添加的新圖像。這些圖像是由相機拍攝的圖像。之前的圖像是由屏幕中的功能生成的完美圖像。 –