Skip navigation

Körök detektálása

Elméleti háttér

Az egyenes detekcióhoz hasonlóan Hough transzformációval körök detekciójára is lehetőség nyílik. Az ötlet itt is hasonló. Menjünk végig a bináris képen, és minden objektumpontra vizsgáljuk meg, hogy milyen középpontú és mekkora sugarú kör mehet rajta keresztül, amit egy összegzőtömbben tartunk nyilván. Az objektumpontok vizsgálata után az összegzőtömb lokális maximumértékei adják a detektált köröket.

A következőket vehetjük észre:

  • Az összegzőtömb dimenziója itt 3 lesz, mert egy kört a középpontja és a sugara ír le.
  • A nagymértékű memóriafoglalás elkerülése, és a hatékony működés elősegítésére csökkentsük az összegzőtömb méretét nagyobb léptékű paraméterválasztással. Érdemes a kör lehetséges sugaraira is egy elegendően szűk tartományt megadni.
  • A módszer alkalmas körívek keresésére is, nem kell teljes kör legyen.
  • Érdekesség, hogy az OpenCV implementációnak nem bináris élképet, hanem 8 bites szürkeárnyalatos képet kell átadnunk, az élkeresést beépítve végzi a Canny operátorral.

Körök detektálása Hough transzformációval (OpenCV)

Angol nyelvű leírás

Függvény paraméterek

circles = cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])

circles

Detektált körök paraméter vektora.
Minden elem három lebegőpontos értéket tartalmaz: (x, y, radius).
x, y: a kör középpontja.
radius: a kör sugara.

image

Bemeneti kép. 8 bites, 1 csatornás, szürkeárnyalatos kép lehet csak.

method Egyelőre csak CV_HOUGH_GRADIENT választható.
dp Képfelbontás és az összegzőtömb méretének fordított aránya.
minDist A detektált körök középpontjainak minimális távolsága.
Kis távolság esetén többszörös detekció előfordulhat.
Nagy távolság esetén elveszthetünk köröket.
param1 Módszer specifikus paraméter.
CV_HOUGH_GRADIENT esetén a Canny éldetektornak átadandó felső küszöb értéke.
Az alsó küszöb ennek fele lesz.
param2 Módszer specifikus paraméter.
CV_HOUGH_GRADIENT esetén a kör középpont összegzőtömbre vonatkozó küszöböt jelenti.
minRadius Detektálandó körök minimális sugara pixelben.
maxRadius Detektálandó körök maximális sugara pixelben.

Használati példa

rc = cv2.imread(filename, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)

rows = gray.shape[0]
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, rows / 16,
param1=200, param2=20,
minRadius=10, maxRadius=60)

if circles is not None:
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
center = (i[0], i[1])
print(center, i[2])
# circle center
cv2.circle(src, center, 1, (255, 0, 0), 3)

# circle outline
radius = i[2]

cv2.circle(src, center, radius, (0, 0, 255), 3)

cv2.imshow("detected circles", src)

Körök detektálása OpenCV példaprogramok

11_02_hough_circles.py

  • Körök detektálása és eredmény kirajzolása.

Eredmények

hun_coins_rs.jpg tesztképre, különböző összegzőtömb küszöbbel.


param2=20


param2=15


param2=30