目錄:
(一)霍夫圓檢測原理
(二)代碼實現
(一)霍夫圓檢測原理
(二)代碼實現
1 #霍夫圓檢測 2 import cv2 as cv 3 import numpy as np 4 5 def detect_circles_demo(image): 6 dst = cv.pyrMeanShiftFiltering(image, 10, 100) #邊緣保留濾波EPF 7 cimage = cv.cvtColor(dst, cv.COLOR_RGB2GRAY) 8 circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) 9 circles = np.uint16(np.around(circles)) #把circles包含的圓心和半徑的值變成整數 10 for i in circles[0, : ]: 11 cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2) #畫圓 12 cv.circle(image, (i[0], i[1]), 2, (0, 0, 255), 2) #畫圓心 13 cv.imshow("circles", image) 14 15 src = cv.imread('E:/imageload/coins.jpg') 16 cv.namedWindow('input_image', cv.WINDOW_NORMAL) #設置為WINDOW_NORMAL可以任意縮放 17 cv.imshow('input_image', src) 18 detect_circles_demo(src) 19 cv.waitKey(0) 20 cv.destroyAllWindows()
注意:
1.OpenCV的霍夫圓變換函數原型為:HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles
image參數表示8位單通道灰度輸入圖像矩陣。
method參數表示圓檢測方法,目前唯一實現的方法是HOUGH_GRADIENT。
dp參數表示累加器與原始圖像相比的分辨率的反比參數。例如,如果dp = 1,則累加器具有與輸入圖像相同的分辨率。如果dp=2,累加器分辨率是元素圖像的一半,寬度和高度也縮減為原來的一半。
minDist參數表示檢測到的兩個圓心之間的最小距離。如果參數太小,除了真實的一個圓圈之外,可能錯誤地檢測到多個相鄰的圓圈。如果太大,可能會遺漏一些圓圈。
circles參數表示檢測到的圓的輸出向量,向量內第一個元素是圓的橫坐標,第二個是縱坐標,第三個是半徑大小。
param1參數表示Canny邊緣檢測的高閾值,低閾值會被自動置為高閾值的一半。
param2參數表示圓心檢測的累加閾值,參數值越小,可以檢測越多的假圓圈,但返回的是與較大累加器值對應的圓圈。
minRadius參數表示檢測到的圓的最小半徑。
maxRadius參數表示檢測到的圓的最大半徑。
2.OpenCV畫圓的circle函數原型:circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img
img參數表示源圖像。
center參數表示圓心坐標。
radius參數表示圓的半徑。
color參數表示設定圓的顏色。
thickness參數:如果是正數,表示圓輪廓的粗細程度。如果是負數,表示要繪制實心圓。
lineType參數表示圓線條的類型。
shift參數表示圓心坐標和半徑值中的小數位數。