Angol nyelvű dokumentáció
Standard változat
Az egyenes vonalak leírása poláris koordináta-rendszerben: távolsága az origótól és függőleges tengellyel bezárt szöge.
lines = cv.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]])
lines |
Detektált vonalak paraméter vektora. Minden egyenest két érték határoz meg: (ρ, θ). ρ: távolság az origótól (bal felső sarok). θ: bezárt szög az Y-tengely irányával radiánban (0: függőleges; π/2: vízszintes).
A tapasztalat azt mutatja, hogy az egyenes paramétereket szavazatszám alapján sorba rendezve kapjuk meg. Vagyis az első elem lesz az az egyenes, amely a legtöbb ponton keresztülhalad.
|
image |
Bementi kép. A függvény működése közben a tartalma megváltozhat!
|
rho |
Távolság összegzőtömb felbontása pixelben. |
theta |
Bezárt szög összegzőtömb felbontása radiánban. |
threshold |
Csak azok a vonalak kerülnek detektálásra, amelyek legalább threshold számú szavazatot kaptak. |
srn |
Többskálás módszer esetén a rho paraméter osztója. |
stn |
Többskálás módszer esetén a theta paraméter osztója. |
min_theta |
Minimális szög. Alapértéke 0. |
max_theta |
Maximális szög. Alapértéke CV_PI. |
Használati példa
Figyeljük meg, hogyan rajzolhatjuk a képre a detektált egyeneseket! A rho és theta paraméterek alapján meghatározásra kerül az egyenes egy pontja. Erről balra és jobbra olyan távolságra választunk pontokat, amelyek feltehetőleg a képmátrixon kívül esnek. Ezek összekötésével a kép szélei közötti egyeneseket kapunk.
src = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
dst = cv2.Canny(src, 50, 200, None, 3)
cdst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR)
lines = cv2.HoughLines(dst, 1, np.pi / 180, 300, None, 0, 0)
# Diagonal is the longest line that can be drawn
sizemax = math.sqrt(cdst.shape[0] ** 2 + cdst.shape[1] ** 2)
if lines is not None:
print('Detektált egyenesek száma:', len(lines))
for i in range(0, len(lines)):
rho = lines[i][0][0]
theta = lines[i][0][1]
a = math.cos(theta)
b = math.sin(theta)
x0 = a * rho
y0 = b * rho
# Computing line endpoints outside of image matrix
pt1 = (int(x0 + sizemax * (-b)), int(y0 + sizemax * a))
pt2 = (int(x0 - sizemax * (-b)), int(y0 - sizemax * a))
cv2.line(cdst, pt1, pt2, (0, 0, 255), 3, cv2.LINE_AA)
cv2.imshow("Source", src)
cv2.imshow("Detected Lines (in red) - Standard Hough Line Transform", cdst)
Az 54 legerősebb detektált egyenest az alábbi animáció mutatja, erősségi csökkenő sorrendben megjelenítve. Figyeljük meg, hogy az egyenesre eső szakaszok tetszőlegesen nagy távolságra lehetnek egymástól, ezek elkülönítésére a módszer nem képes. Ha elkülönülő vonalszakaszokat szeretnénk detektálni, akkor használjuk a probabilisztikus változatot!
Mivel a szöveg körvonala is megjelenik objektumpontokként, a módszer azokra a pontokra is vizsgálja az egyenesek illeszkedését.

Probabilisztikus változat
Végpont koordinátáikkal megadott vonalszegmensek. Megadható a minimális vonalhossz, valamint a megengedett legnagyobb szakadási hossz.
lines = cv.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])
lines |
Detektált vonalszakaszok vektora. 4 elemű tömbök listája, amelyek a vonalszakaszok végpontjait adják. |
image |
Bementi kép. |
rho |
Távolság összegzőtömb felbontása pixelben. |
theta |
Bezárt szög összegzőtömb felbontása radiánban. |
threshold |
Csak azok a vonalak kerülnek detektálásra, amelyek legalább threshold számú szavazatot kaptak. |
minLineLength |
Minimális szegmens hossz. A kisebbek eldobásra kerülnek. |
maxLineGap |
Maximális megengedett távolság két egy irányba eső vonalszakasz között. Kisebb távolság esetén összevonásra kerülnek. Nagyobb távolság esetén két különálló szegmenst kapunk (ha a minimális hosszt elérik).
|
Használati példa
src = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
dst = cv2.Canny(src, 50, 200, None, 3)
cdst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR)
linesP = cv2.HoughLinesP(dst, 1, np.pi / 180, 50, None, 50, 10)
if linesP is not None:
for i in range(0, len(linesP)):
l = linesP[i][0]
cv2.line(cdstP, (l[0], l[1]), (l[2], l[3]), (0, 0, 255), 3, cv2.LINE_AA)
cv2.imshow("Source", src)
cv2.imshow("Detected Lines (in red) - Probabilistic Line Transform", cdstP)
