溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV哈里斯角檢測怎么應用

發(fā)布時間:2023-04-18 10:17:33 來源:億速云 閱讀:85 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“OpenCV哈里斯角檢測怎么應用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“OpenCV哈里斯角檢測怎么應用”吧!

理論

OpenCV哈里斯角檢測怎么應用

OpenCV哈里斯角檢測怎么應用

可以用如下圖來表示:

OpenCV哈里斯角檢測怎么應用

因此,Harris Corner Detection的結果是具有這些分數(shù)的灰度圖像。合適的閾值可提供圖像的各個角落。

OpenCV中的哈里斯角檢測

在OpenCV中有實現(xiàn)哈里斯角點檢測,cv2.cornerHarris()。其參數(shù)為:

dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]] )

  • src - 輸入圖像,灰度和float32類型

  • blockSize - 是拐角檢測考慮的鄰域大小

  • ksize - 使用的Sobel導數(shù)的光圈參數(shù)

  • k- 等式中的哈里斯檢測器自由參數(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()

以下是結果:

OpenCV哈里斯角檢測怎么應用

可以看到,各個角點已經標紅。

SubPixel精度的轉角

有時候可能需要找到最精確的角點。OpenCV附帶了一個函數(shù)cv2.cornerSubPix(),它進一步細化了以亞像素精度檢測到的角點。下面是一個例子。

  • 和之前一樣,首先需要先找到哈里斯角點

  • 然后通過這些角的質心(可能在一個角上有一堆像素,取它們的質心)來細化它們

  • Harris角用紅色像素標記,SubPixel角用綠色像素標記

對于cv2.cornerSubPix()函數(shù),必須定義停止迭代的條件。我們可以在特定的迭代次數(shù)或達到一定的精度后停止它。此外,還需要定義它將搜索角點的鄰居的大小。

corners = cv.cornerSubPix( image, corners, winSize, zeroZone, criteria )

  • image: 輸入圖像,單通道

  • corners: 輸入的初始坐標和為輸出提供的精制坐標

  • winSize: 搜索窗口的一半側面長度

  • zeroZone: 搜索區(qū)域中間的死區(qū)大小的一半在下面的公式中的求和,有時用于避免自相關矩陣的可能奇點。(−1,−1)(-1,-1)(−1,−1) 的值表示沒有這樣的尺寸

  • criteria: 終止角點細化過程的條件

# sub pixel更精度角點
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()

以下是結果, 可以看到SubPixel更精確一點:

OpenCV哈里斯角檢測怎么應用

感謝各位的閱讀,以上就是“OpenCV哈里斯角檢測怎么應用”的內容了,經過本文的學習后,相信大家對OpenCV哈里斯角檢測怎么應用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI