2012-11-22 22 views
6

Sono nuovo su opencv (in C++) e sto cercando di implementare il rilevamento della linea.Rilevamento della linea OpenCV in generale

Ho una foto con un paio di linee e sto cercando di determinare la distanza tra le linee. So che c'è Hough, Canny e così via, ma come posso ottenere le coordinate delle diverse linee per calcolare la distanza tra le linee? Devo usare le funzioni di contorno opencv o ci sono modi migliori? Non ho bisogno di esempi completi di codice, ma qualcuno può dirmi il modo migliore per portare a termine il lavoro?

+0

Non è necessario aggiungere la firma al post - la scheda utente viene aggiunta automaticamente. – Artemix

risposta

13

I rilevamenti di linea portano spesso all'utilizzo della trasformazione di Hough, il rilevatore di bordi Canny e il rilevamento dei contorni fungono solo da pre-processori convenienti se necessario.

Se hai linee parallele, utilizzare

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0) 

per linee di rivelazione in cui il secondo parametro conterrà il rilevamento:

linee - Uscita vettore di linee. Ogni linea è rappresentata da un vettore a due elementi (ρ, θ). ρ è la distanza dall'origine della coordinata (0, 0) (angolo superiore sinistro dell'immagine). θ è la rotazione della linea angolo in radianti (0 ~ linea verticale, π/2 ~ linea orizzontale).
[opencv2refman.pdf]

Ciò significa, che la distanza tra due linee dovrebbe essere abs(rho1-rho2), che le distanze sono differenze assolute tra valori dei pixel nella prima colonna di lines. (Nota: metodo dovrebbe essere CV_HOUGH_STANDARD qui!)

Per linee non parallele si devono definire cosa pensi di come distanza, ma poi OpenCV può ancora fornire le coordinate di punti finali di ogni linea rilevata.
Devi solo usare method = CV_HOUGH_PROBABILISTIC.

CV_HOUGH_PROBABILISTIC probabilistico trasformata di Hough (più efficiente nel caso in cui se l'immagine contiene alcuni segmenti lineari lunghi). Lo restituisce segmenti di linea anziché l'intera riga. Ogni segmento è rappresentato dai punti iniziale e finale e la matrice deve essere (la sequenza creata sarà) del tipo CV_32SC4.
[opencv2refman.pdf]

si possono anche trovare un tutorial in opencv_tutorials.pdf all'interno della documentazione del OpenCV installato.

+0

grazie per la risposta! Nel prossimo passaggio voglio ottenere una stima della qualità delle linee nella mia immagine. le linee sono bordi di scanalatura e dovrebbero essere parallele. In diversi punti la scanalatura è danneggiata e i bordi non sono più paralleli. C'è un modo semplice per ottenere la deviazione di un bordo reale da una linea retta? – marc

+0

Huh, non sono sicuro. Penso valga la pena pubblicarlo come una domanda separata. –

+0

Puoi votare/accettare se la mia risposta è stata di aiuto? –

Problemi correlati