2013-04-03 29 views
7

Ho un'immagine e contiene delle forme. Ho rilevato linee con l'uso di linee di groviglio. Come posso rilevare quali linee sono parallele?Python openCV rileva linee parallele

+0

Se questo è fatto in Python, come dichiarato nei tag, è possibile utilizzare la versione SciPy di ​​houghlines, che fornisce l'immagine di uscita houghspace: Vedi qui] (http://scikit-image.org/docs/dev/auto_examples/plot_line_hough_transform.html). È quindi possibile capovolgere l'asse indipendente (theta o 'X') e l'asse dipendente (rho o 'Y') in modo tale che theta sia ora l'asse dipendente. Dopo aver messo a segno questa immagine spaziale Hough (per ottenere i punti più intensi di (rho, theta) che corrispondono alle linee più probabili), puoi adattare una linea orizzontale ai dati: theta = costante (y = mx + b senza pendenza). – chase

risposta

13

equazione di una retta in coordinate cartesiane:

y = k * x + b

Due linee y = k1 * x + b1, y = k2 * x + b2 sono parallele, se k1 = k2.

Quindi è necessario calcolare il coefficiente k per ciascuna linea rilevata.

Per univocamente identificare l'equazione di una retta è necessario conoscere le coordinate di due punti che appartengono alla linea.

Dopo aver linee trovata con HoughLines (con il ++):

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

si hanno le linee vettoriali, che memorizza i parametri (r, theta) delle linee rilevate in coordinate polari. È necessario trasferirli in coordinate cartesiane:

Qui esempio 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 
} 

Dopo aver ottenuto questi due punti di una linea si può calcolare la sua equazione.

+0

grazie mille per la tua soluzione. – vtokmak

+3

È sufficiente verificare che i valori theta per le linee di rilevamento siano paralleli o no? Possiamo dire che i valori di theta sono uguali a quelli di linee parallele? – vtokmak

+0

Penso che controllare i valori di theta dovrebbe essere un controllo sufficiente. –

1

HoughLines restituisce i risultati in coordinate polari. Quindi basta controllare il 2 ° valore per l'angolo. Non c'è bisogno di convertire in 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