2013-04-03 13 views
7

Mam obraz i ma on kilka kształtów. Wykryłem linie z użyciem linii "hough". Jak mogę wykryć, które linie są równoległe?Python openCV wykryj linie równoległe

+0

Jeśli odbywa się to w Pythonie, jak wskazano w znacznikach, można użyć scipy wersję houghlines, który zapewnia obraz wyjściowy houghspace: patrz tutaj] (http://scikit-image.org/docs/dev/auto_examples/plot_line_hough_transform.html). Możesz wtedy obrócić oś niezależną (theta lub "X") i oś zależną (rho lub "Y") tak, że theta jest teraz osią zależną. Po progowaniu tego obrazu przestrzeni Hough (aby uzyskać najbardziej intensywne plamy (rho, theta), które odpowiadają najbardziej prawdopodobnym liniom), można dopasować poziomą linię do danych: theta = stała (y = mx + b bez nachylenia). – chase

Odpowiedz

13

Równanie linii w kartezjańskim układzie współrzędnych:

Y = K * x + bi

dwóch linii y = K1 * x + B1 y = k2 * x + b2 są równoległe, jeśli K1 = k2.

Musisz więc obliczyć współczynnik k dla każdej wykrytej linii.

W celu jednoznacznie zidentyfikować równanie linii trzeba znać współrzędne dwoma punktami, które należą do linii.

Po znalezieniu linii z HoughLines (С ++):

vector<Vec2f> lines; 
HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0); 

masz linie wektora, który przechowuje parametry (r, theta) wykrytego linii we współrzędnych biegunowych. Trzeba przenieść je we współrzędnych kartezjańskich:

Oto przykład w C++:

for(size_t i = 0; i < lines.size(); i++) 
{ 
    float rho = lines[i][0], theta = lines[i][1]; 
    Point pt1, pt2; 
    double a = cos(theta), b = sin(theta); 
    double x0 = a*rho, y0 = b*rho; 
    pt1.x = cvRound(x0 + 1000*(-b)); //the first point 
    pt1.y = cvRound(y0 + 1000*(a)); //the first point 
    pt2.x = cvRound(x0 - 1000*(-b)); //the second point 
    pt2.y = cvRound(y0 - 1000*(a)); //the second point 
} 

Po dostał te dwa punkty linią można obliczyć swoje równanie.

+0

thx za rozwiązanie. – vtokmak

+3

Czy to wystarczy sprawdzić, czy wartości theta dla wykrywania linii są równoległe, czy nie? Czy możemy powiedzieć, że wartości theta są równe, a linie są równoległe? – vtokmak

+0

Myślę, że sprawdzanie wartości theta powinno być wystarczającą kontrolą. –

1

HoughLines zwraca wyniki we współrzędnych biegunowych. Po prostu sprawdź 2. wartość kąta. Nie trzeba konwertować do x, y

def findparallel(lines): 

lines1 = [] 
for i in range(len(lines)): 
    for j in range(len(lines)): 
     if (i == j):continue 
     if (abs(lines[i][1] - lines[j][1]) == 0):   
      #You've found a parallel line! 
      lines1.append((i,j)) 


return lines1