OpenCV哈里斯角檢測(cè)|Harris?Corner理論實(shí)踐
目標(biāo)
在本章中,將學(xué)習(xí)
- "Harris Corner Detection”背后的思想
- 函數(shù):
cv2.cornerHarris()
,cv.2cornerSubPix()
理論
可以用如下圖來(lái)表示:
因此,Harris Corner Detection的結(jié)果是具有這些分?jǐn)?shù)的灰度圖像。合適的閾值可提供圖像的各個(gè)角落。
OpenCV中的哈里斯角檢測(cè)
在OpenCV中有實(shí)現(xiàn)哈里斯角點(diǎn)檢測(cè),cv2.cornerHarris()
。其參數(shù)為:
dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]] )
src
- 輸入圖像,灰度和float32類型blockSize
- 是拐角檢測(cè)考慮的鄰域大小ksize
- 使用的Sobel導(dǎo)數(shù)的光圈參數(shù)k
- 等式中的哈里斯檢測(cè)器自由參數(shù)
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('chessboard.png') img_copy = img.copy() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) dst = cv2.cornerHarris(gray, 2, 3, 0.04) # result is dilated for marking the corners, not important dst = cv2.dilate(dst, None) # Threshold for an optimal value, it may vary depending on the image. img[dst >0.01*dst.max()]=[255,0,0] # plot plt.subplot(121) plt.imshow(img_copy, cmap='gray') plt.xticks([]) plt.yticks([]) plt.subplot(122) plt.imshow(img, cmap='gray') plt.xticks([]) plt.yticks([]) plt.show()
以下是結(jié)果:
可以看到,各個(gè)角點(diǎn)已經(jīng)標(biāo)紅。
SubPixel精度的轉(zhuǎn)角
有時(shí)候可能需要找到最精確的角點(diǎn)。OpenCV附帶了一個(gè)函數(shù)cv2.cornerSubPix()
,它進(jìn)一步細(xì)化了以亞像素精度檢測(cè)到的角點(diǎn)。下面是一個(gè)例子。
- 和之前一樣,首先需要先找到哈里斯角點(diǎn)
- 然后通過(guò)這些角的質(zhì)心(可能在一個(gè)角上有一堆像素,取它們的質(zhì)心)來(lái)細(xì)化它們
- Harris角用紅色像素標(biāo)記,SubPixel角用綠色像素標(biāo)記
對(duì)于cv2.cornerSubPix()
函數(shù),必須定義停止迭代的條件。我們可以在特定的迭代次數(shù)或達(dá)到一定的精度后停止它。此外,還需要定義它將搜索角點(diǎn)的鄰居的大小。
corners = cv.cornerSubPix( image, corners, winSize, zeroZone, criteria )
- image: 輸入圖像,單通道
- corners: 輸入的初始坐標(biāo)和為輸出提供的精制坐標(biāo)
- winSize: 搜索窗口的一半側(cè)面長(zhǎng)度
- zeroZone: 搜索區(qū)域中間的死區(qū)大小的一半在下面的公式中的求和,有時(shí)用于避免自相關(guān)矩陣的可能奇點(diǎn)。(−1,−1)(-1,-1)(−1,−1) 的值表示沒(méi)有這樣的尺寸
- criteria: 終止角點(diǎn)細(xì)化過(guò)程的條件
# sub pixel更精度角點(diǎn) import cv2 import numpy as np img = cv2.imread('chessboard2.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # find Harris corners 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) # find centroids ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst) # define the criteria to stop and refine the corners 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) # Now draw them 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('subpixel', img) cv2.waitKey(0) cv2.destroyAllWindows()
以下是結(jié)果, 可以看到SubPixel更精確一點(diǎn):
附加資源
以上就是OpenCV哈里斯角檢測(cè)|Harris Corner理論實(shí)踐的詳細(xì)內(nèi)容,更多關(guān)于OpenCV哈里斯角檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
matplotlib圖例legend語(yǔ)法及設(shè)置的方法
這篇文章主要介紹了matplotlib圖例legend語(yǔ)法及設(shè)置的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07解決Jupyter notebook中.py與.ipynb文件的import問(wèn)題
這篇文章主要介紹了解決Jupyter notebook中.py與.ipynb文件的import問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python 迭代,for...in遍歷,迭代原理與應(yīng)用示例
這篇文章主要介紹了Python 迭代,for...in遍歷,迭代原理與應(yīng)用,結(jié)合實(shí)例形式分析了Python迭代與遍歷的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2019-10-10Python3實(shí)現(xiàn)購(gòu)物車功能
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)購(gòu)物車功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python max內(nèi)置函數(shù)詳細(xì)介紹
這篇文章主要介紹了Python MAX內(nèi)置函數(shù)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11Python Flask框架開(kāi)發(fā)之運(yùn)用SocketIO實(shí)現(xiàn)WebSSH方法詳解
Socket.IO本是一個(gè)面向?qū)崟r(shí)web應(yīng)用的JavaScript庫(kù),現(xiàn)在已成為擁有眾多語(yǔ)言支持的Web即時(shí)通訊應(yīng)用的框架。這篇文章主要介紹了Python 運(yùn)用SocketIO實(shí)現(xiàn)WebSSH方法2022-10-10