1. 程式人生 > >Harris 角點及cv2.cornerHarris()

Harris 角點及cv2.cornerHarris()

角點檢測中要使 E (µ, ν) 的值最大。這就是說必須使方程右側的第二項的取值最大。對上面的等式進行泰勒級數展開然後再通過幾步數學換算這裡 Ix 和 Iy 是影象在 x 和 y 方向的導數。(可以使用函式 cv2.Sobel()計算得到)。

• det(M) = λ1λ2• trace (M) = λ1 + λ2λ和 λ是矩陣 M 的特徵值
λ1 和 λ2 是矩陣 M 的特徵值所以根據這些特徵中我們可以判斷一個區域是否是角點,邊界或者是平面。當 λ1 和 λ2 都小時,|R| 也小,這個區域就是一個平坦區域。當 λ1≫ λ2 或者 λ1≪ λ2,時 R 小於 0,這個區域是邊緣,當 λ1 和 λ2 都很大,並且 λ1~λ2 中的時,R 也很大,(λ1 和 λ2 中的最小值都大於閾值)說明這個區域是角點。可以用下圖來表示我們的結論:

所以 Harris 角點檢測的結果是一個由角點分數構成的灰度影象。選取適當的閾值對結果影象進行二值化我們就檢測到了影象中的角點。 

cv2.cornerHarris() 可以用來進行角點檢測。引數如
下:
• img - 資料型別為 float32 的輸入影象。
• blockSize - 角點檢測中要考慮的領域大小。
• ksize - Sobel 求導中使用的視窗大小
• k - Harris 角點檢測方程中的自由引數,取值引數為 [0,04,0.06]

 

import cv2 as cv
import numpy as np

def cornerHarri(imgae):
    gray = cv.cvtColor(imgae, cv.COLOR_BGR2GRAY)
    gray = np.float32(gray)
    dst = cv.cornerHarris(gray, 2, 3, 0.04)
    dst = cv.dilate(dst, None)
    imgae[dst>0.01*dst.max()]=[0,0,255]
    cv.imshow("corn",imgae)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("C:/Users/weiqiangwen/Desktop/sest/data/lena.jpg")
cv.namedWindow("input contours",cv.WINDOW_AUTOSIZE)
cv.imshow("contours", src)
cornerHarri(src)
#cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)

cv.waitKey(0)

cv.destroyAllWindows()