2016-02-24 9 views
5

Mam trudności ze znalezieniem linii na szachownicy na tym obrazie za pomocą HoughLinesP z OpenCV w Pythonie.Parametry houghLinesP OpenCV

Próbując zrozumieć parametry HoughLinesP, mam wymyślić następujący kod:

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
from matplotlib import image as image 

I = image.imread('chess.jpg') 
G = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY) 

# Canny Edge Detection: 
Threshold1 = 150; 
Threshold2 = 350; 
FilterSize = 5 
E = cv2.Canny(G, Threshold1, Threshold2, FilterSize) 

Rres = 1 
Thetares = 1*np.pi/180 
Threshold = 1 
minLineLength = 1 
maxLineGap = 100 
lines = cv2.HoughLinesP(E,Rres,Thetares,Threshold,minLineLength,maxLineGap) 
N = lines.shape[0] 
for i in range(N): 
    x1 = lines[i][0][0] 
    y1 = lines[i][0][1]  
    x2 = lines[i][0][2] 
    y2 = lines[i][0][3]  
    cv2.line(I,(x1,y1),(x2,y2),(255,0,0),2) 

plt.figure(),plt.imshow(I),plt.title('Hough Lines'),plt.axis('off') 
plt.show() 

Problem mam jest to, że odbiera tylko jeden wiersz. Jeśli zmniejszę maxLineGap do 1, odbiera tysiące.

Rozumiem, dlaczego tak jest, ale jak wybrać odpowiedni zestaw parametrów, aby uzyskać wszystkie te współliniowe linie do scalenia? Czy czegoś brakuje?

Chciałbym zachować prosty kod, ponieważ używam go jako przykładu tej funkcji w akcji.

Z góry dziękuję za pomoc!

Aktualizacja: Działa to doskonale z HoughLines.

Wygląda na to, że Canny nie radzi sobie z wykrywaniem krawędzi.

Jednak nadal muszę uruchomić HoughLinesP. Jakieś pomysły??

Obrazy tutaj: Results

Odpowiedz

14

OK, w końcu znalazłem problem i pomyślałem, że udostępnię rozwiązanie dla kogokolwiek napędzanego orzechami. Problem polega na tym, że w funkcji HoughLinesP istnieje dodatkowy parametr "linie", który jest nadmiarowy, ponieważ wyjście funkcji jest takie samo:

cv2.HoughLinesP (obraz, rho, theta, próg [, linie [, minLineLength [, maxLineGap]]])

Powoduje to problemy z parametrami, ponieważ są odczytywane w niewłaściwej kolejności. Aby uniknąć nieporozumień z rzędu parametrów, najprostszym rozwiązaniem jest określić je wewnątrz funkcji tak:

lines = cv2.HoughLinesP(E,rho = 1,theta = 1*np.pi/180,threshold = 100,minLineLength = 100,maxLineGap = 50) 

Ten całkowicie ustalone mój problem i mam nadzieję, że to pomoże innym.

+0

Awesome. Powinieneś zaakceptować swoją odpowiedź. – Phani

+0

Dzięki za przypomnienie, Phani! Zrobi to. –

-1

Nie jest HoughLinesP problem, stosując tę ​​metodę będzie tylko wszystkie linie wykrytych w obrazie i powróci do was.

Aby uzyskać żądane linie, należy wygładzić obraz przed użyciem tej metody. Jeśli jednak wygładzisz zbyt dużo, nie będzie żadnych krawędzi, które mogłyby wykryć HoughLinesP.

Możesz dowiedzieć się więcej o wygładzaniu efektów OpenCV here.

+0

Dzięki za powrót. Wydaje się, że nie ma problemu z wygładzaniem, ponieważ: (a) działa idealnie na HoughLines, (2) Wyniki z funkcji Canny są piękne (jeśli powiem to sobie!) I (d) Canny Edge Detection zawiera wygładzanie w każdym razie. Jakieś inne pomysły? Wsparcie! –

+0

Wygładzanie usuwa szum tła obrazu. Canny nie wygładza. Wygładzanie "rozmywa" obraz, który zapewni mniejsze krawędzie po wykryciu krawędzi (spiczaste). – Meaniegy

+0

Więc dałem ci korzyść z wątpliwości i wypróbowałem wygładzenie. Sprawdziłem również kod funkcji Canny, aby sprawdzić, czy działa on gładko, jak sugeruje algorytm.(a) Wygładzanie nie rozwiązało problemu, po prostu zmniejszyło liczbę krawędzi (ale jestem zadowolony z liczby krawędzi) i (b) kod Canny rzeczywiście zawiera wygładzenie, tak jak powinien, więc dodatkowy etap wygładzania jest zbędny. Jeszcze raz dziękuję za pomoc, ale inne pomysły? –