給定一個棋盤圖像,OpenCV(Matlab等)功能可以非常精確地檢測棋盤角落。如何檢測一個棋盤角?
現在我只有一個類似棋盤的角落(請參閱兩張附圖),我該如何準確檢測角點?有沒有可用的功能?
如果沒有,有人能告訴我在OpenCV中查找棋盤角落的實現細節嗎?也許我可以使用類似的想法來實現我自己的一個棋盤角落檢測。
謝謝。
給定一個棋盤圖像,OpenCV(Matlab等)功能可以非常精確地檢測棋盤角落。如何檢測一個棋盤角?
現在我只有一個類似棋盤的角落(請參閱兩張附圖),我該如何準確檢測角點?有沒有可用的功能?
如果沒有,有人能告訴我在OpenCV中查找棋盤角落的實現細節嗎?也許我可以使用類似的想法來實現我自己的一個棋盤角落檢測。
謝謝。
可以使用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
下面是結果我得到的,當我運行的新形象:
還不夠完美,但你可以玩弄的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()'函數運行圖像時,我得到一個返回的像素,可以使用這一行代碼plot(C(:,1),C(:,2), 'r *');'假設C包含角落的X和Y座標。我將用一點代碼編輯答案。 –
請測試我剛添加的新圖像。這些圖像是由相機拍攝的圖像。之前的圖像是由屏幕中的功能生成的完美圖像。 –
您是否試過OpenCV的[findChessboardCorners](http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findchessboardcorners)函數? – api55
它不起作用,因爲它不是棋盤。 –
它不需要成爲一個棋盤,無論如何,你可以嘗試背後的方法,[哈里斯角落探測器](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