2013-04-03 28 views
7

Ich habe ein Bild und es hat einige Formen drin. Ich habe Linien mit Hough-Linien gefunden. Wie kann ich erkennen, welche Linien parallel sind?Python openCV erkennen parallele Linien

+0

Wenn dies in Python getan wird, wie in den Tags angegeben, können Sie die scipy Version von HoughLines verwenden können, die die houghspace Ausgabebild bietet: Siehe hier] (http://scikit-image.org/docs/dev/auto_examples/plot_line_hough_transform.html). Sie können dann die unabhängige Achse (Theta oder 'X') und die abhängige Achse (Rho oder 'Y') so spiegeln, dass Theta jetzt die abhängige Achse ist. Nach der Schwellenwertbildung dieses Hough-Raumbildes (um die intensivsten Punkte von (rho, theta) zu erhalten, die den wahrscheinlichsten Linien entsprechen) können Sie eine horizontale Linie an die Daten anpassen: theta = konstant (y = mx + b ohne Steigung)). – chase

Antwort

13

Gleichung einer Geraden in kartesischen Koordinaten:

y = k · x + b

Zwei Linien y = k1 * x + b1, y = k2 * x + b2 parallel ist, wenn k1 = k2.

Sie müssen also den Koeffizienten k für jede erkannte Linie berechnen.

Um eindeutig identifizieren die Gleichung einer Linie Sie die Koordinaten von zwei Punkten , die Linie gehören wissen müssen.

Nachdem mit HoughLines (С ++) gefunden Zeilen aufweist:

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

haben Sie die Vektorlinien, die die Parameter (r, theta) der detektierten Linien in Polarkoordinaten gespeichert werden. Sie müssen sie in kartesischen Koordinaten übertragen:

Hier Beispiel in 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 
} 

Nachdem diese beiden Punkte einer Linie bekam haben Sie seine Gleichung berechnen kann.

+0

thx viel für Ihre Lösung. – vtokmak

+3

Reicht es aus, dass die Theta-Werte für Erkennungslinien parallel sind oder nicht? Können wir sagen, dass Theta-Werte gleich sind, als Linien parallel sind? – vtokmak

+0

Ich denke, Theta-Werte sollten ausreichend sein, überprüfen. –

1

HoughLines gibt seine Ergebnisse in Polarkoordinaten zurück. Überprüfen Sie einfach den 2. Wert für den Winkel. Keine Notwendigkeit, x zu konvertieren, 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