【python-opencv】30-角點檢測


【微語】世上有很多不可能,不過不要在你未盡全力之前下結論

特征檢測:找到圖像特征的技術

特征描述:描述圖像特征

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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM