【微語】世上有很多不可能,不過不要在你未盡全力之前下結論
特征檢測:找到圖像特征的技術
特征描述:描述圖像特征
Harris角點檢測(Corner Detection)
參考:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html#harris-corners
角點的特征是 無論框框往哪邊移動 框框內像素值都會變化很大。
學習函數:cv2.cornerHarris() , cv2.cornerSubPix()
cornerHarris(img, blockSize, ksize, k[, dst[, borderType]]) -> dst

注意:ksize-Sobel的孔徑參數(aperture parameter),也就是Sobel核的半徑,如1、3、5、7
import cv2 import numpy as np img = cv2.imread(r'pictures\chessboard.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 檢測到角點 gray = np.float32(gray) dst = cv2.cornerHarris(gray,2,3,0.04) cv2.imshow('cornerHarris',dst) dst = cv2.dilate(dst,None) #角點原來是個小叉叉(××) 膨脹角點 cv2.imshow('dilate',dst) cv2.waitKey(0) cv2.destroyAllWindows()
1 import cv2 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 img = cv2.imread(r'pictures\chess.png') 6 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 7 8 gray = np.float32(gray) #將gray轉化為float32的輸入圖像 blocksize=2,ksize=3 9 dst = cv2.cornerHarris(gray,2,3,0.04) 10 11 #result is dilated for marking the corners, not important 12 dst = cv2.dilate(dst,None) 13 14 # Threshold for an optimal value, it may vary depending on the image
#將img圖像中檢測到的角點塗上紅色 15 img[dst>0.01*dst.max()]=[0,0,255] 16 17 cv2.imshow('cornerHarris',img) 18 19 if cv2.waitKey(0) & 0xff == 27: 20 cv2.destroyAllWindows()
亞像素級精確度的角點 cv2.cornerSubPix() ---最大精度的角點檢測
首先我們要找到 Harris角點,然后將角點的重心傳給這個函數進行修正。Harris 角點用紅色像素標出,綠色像素是修正后的像素。在使用這個函數是我們要定義一個迭代停止條件。當迭代次數達到或者精度條件滿足后迭代就會停止。我們同樣需要定義進行角點搜索的鄰域大小。
import cv2 import numpy as np filename = 'chessboard.jpg' img = cv2.imread(filename) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 找到Harris角點 gray = np.float32(gray) dst = cv2.cornerHarris(gray,2,3,0.04) dst = cv2.dilate(dst,None) ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0) dst = np.uint8(dst) # 找到Harris角點重心 ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst) # 定義迭代停止條件 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001) corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria) # 繪制角點 res = np.hstack((centroids,corners)) res = np.int0(res) img[res[:,1],res[:,0]]=[0,0,255] img[res[:,3],res[:,2]] = [0,255,0] cv2.imshow('subpixel5.png',img) cv2.waitKey() cv2.destroyAllWindows()

31 Shi-Tomasi 角點檢測 & 適合於跟蹤的圖像特征
參考:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_shi_tomasi/py_shi_tomasi.html#shi-tomasi
https://www.cnblogs.com/Undo-self-blog/p/8447728.html
目標
本節我們將要學習:
• 函數:cv2.goodFeatureToTrack()
31.1 python-opencv代碼
OpenCV 提供了函數:cv2.goodFeaturesToTrack()。這個函數可以幫我們使用 Shi-Tomasi 方法獲取圖像中 N 個最好的角點(如果你願意的話也可以通過改變參數來使用 Harris 角點檢測算法)。通常情況下,輸入的應該是灰度圖像。然后確定你想要檢測到的角點數目。再設置角點的質量水平,0到 1 之間。它代表了角點的最低質量,低於這個數的所有角點都會被忽略。最后在設置兩個角點之間的最短歐式距離。根據這些信息,函數就能在圖像上找到角點。所有低於質量水平的角點都會被忽略。然后再把合格角點按角點質量進行降序排列。函數會采用角點質量最高的那個角點(排序后的第一個),然后將它附近(最小距離之內)的角點都刪掉。按着這樣的方式最后返回 N 個最佳角點。
在下面的例子中,我們試着找出 25 個最佳角點:
import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2.imread('simple.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) corners = cv2.goodFeaturesToTrack(gray,25,0.01,10) #返回的結果是[[311,...250]] 兩層括號的數組 corners = np.int0(corners) for i in corners: x,y = i.ravel() cv2.circle(img,(x,y),3,255,-1) plt.imshow(img),plt.show()


