OpenCV 霍夫圓
本教程將討論在 Python 中使用 OpenCV 的 HoughCircles()
函式檢測影象中的圓圈。
在 Python 中使用 OpenCV 的 HoughCircles()
函式檢測影象中的圓圈
我們可以使用 OpenCV 的 HoughCircles()
函式來檢測影象中存在的圓圈。HoughCircles()
函式使用 Hough 變換來查詢灰度影象中存在的圓圈。
霍夫變換從影象中提取特徵,然後使用投票程式確定影象中存在的物件的形狀。
HoughCircles()
的第一個引數是我們想要檢測圓圈的影象,它應該是灰度的。第二個引數是用於檢測圓圈的方法。
霍夫模式包含 cv2.HOUGH_STANDARD
,經典或標準霍夫變換,cv2.HOUGH_PROBABILISTIC
是概率霍夫變換,如果影象中存在長線性段,cv2.HOUGH_MULTI_SCALE
,多尺度經典霍夫變換的變體,cv2.HOUGH_GRADIENT
和 cv2.GRADIENT_ALT
。
第三個引數是累加器解析度和影象解析度的比值。如果比率為 1,則累加器和影象解析度相等,如果比率為 2,則累加器的寬度和高度將變為一半。
cv2.HOUGH_GRADIENT_ALT
方法的推薦比率為 1.5。第四個引數是兩個圓的中心之間的最小距離。
第五個引數是第一個方法的特定引數。在 cv2.HOUGH_GRADIENT
和 cv2.HOUGH_GRADIENT_ALT
的情況下,第五個引數將用作 Canny 邊緣檢測器的閾值。
第六個引數是第二種方法的具體引數;在 cv2.HOUGH_GRADIENT
的情況下,第六個引數將用作圓心的閾值。
在 cv2.HOUGH_GRADIENT_ALT
的情況下,第六個引數將用作圓的完美值。第七個引數是最小圓半徑,第八個是最大圓半徑。
例如,讓我們使用 HoughCircles()
函式檢測影象中存在的圓圈,並使用 OpenCV 的 circle()
函式在原始影象上繪製檢測到的圓圈及其中心。
請參閱下面的程式碼。
import numpy as np
import cv2 as cv
src_img = cv.imread("blob1.jpg", 0)
color_img = cv.cvtColor(src_img, cv.COLOR_GRAY2BGR)
circles_img = cv.HoughCircles(
src_img, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0
)
circles_img = np.uint16(np.around(circles_img))
for i in circles_img[0, :]:
cv.circle(color_img, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv.circle(color_img, (i[0], i[1]), 2, (0, 0, 255), 3)
cv.imshow("Original Image", src_img)
cv.imshow("Detected Circles", color_img)
cv.waitKey(0)
cv.destroyAllWindows()
輸出:
我們可以根據給定的影象更改 HoughCircles()
的引數。numpy
庫的 around()
函式用於將圓形值四捨五入到最接近的整數。
我們還可以通過更改 circle()
函式的第四個引數(BGR 三元組)來更改在影象上繪製的圓圈的顏色和圓圈的中心。