2010-05-01 30 views
7

Sto utilizzando OpenCV per adattarsi a una linea da un insieme di punti usando cvFitLine()Tracciare la linea montato (OpenCV)

cvFitLine() restituisce un vettore normalizzato che è co-lineare per la linea e un punto sulla linea. Vedere i dettagli here

Utilizzare queste informazioni come si ottiene l'equazione di una linea in modo che sia possibile tracciare la linea?

risposta

7

Se cvFitLine() rendimenti vettore normalizzato (vx,vy) e punto (x0,y0), allora l'equazione della linea è

(x, y) = (x0, y0) + t * (vx, vy)

dove t va da − ∞ a + ∞.

Questo è ciò che hai chiesto, ma probabilmente non è immediatamente utile per tracciare la linea. Dovresti ritagliarlo sui bordi dello schermo, o forse sul riquadro di delimitazione del set originale di punti. Per ritagliare una linea in un rettangolo, basta risolvere i valori di t in cui la linea attraversa il limite del rettangolo.

9

Basta disegnare una linea grande invece di risolvere i limiti. ad esempio:

cv.Line(img, (x0-m*vx[0], y0-m*vy[0]), (x0+m*vx[0], y0+m*vy[0]), (0,0,0)) 

lo farà per esempio .. per m abbastanza grande :)

4

ho usato una strategia simile a Karpathy lassù, ma usato una funzione extra. Come puoi vedere, sto usando cvClipLine per tagliare la linea alla dimensione dell'immagine, che non è necessaria ma aggiunge un po 'di cordialità.

Anche il moltiplicatore qui è definito come il valore = max (img-> altezza, img-> larghezza) in modo da non ottenere numeri che potrebbero un giorno traboccare o qualcosa del genere.

void drawLine(IplImage * img, float line[4], int thickness,CvScalar color) 
{ 
    double theMult = max(img->height,img->width); 
    // calculate start point 
    CvPoint startPoint; 
    startPoint.x = line[2]- theMult*line[0];// x0 
    startPoint.y = line[3] - theMult*line[1];// y0 
    // calculate end point 
    CvPoint endPoint; 
    endPoint.x = line[2]+ theMult*line[0];//x[1] 
    endPoint.y = line[3] + theMult*line[1];//y[1] 

    // draw overlay of bottom lines on image 
    cvClipLine(cvGetSize(img), &startPoint, &endPoint); 
    cvLine(img, startPoint, endPoint, color, thickness, 8, 0); 
} 
0

usiamo un "Vec4f fitedLine;" per la linea montato in Fitline abbiamo 4 parametri se consideriamo Linea relazione az qui sotto: Y - Y0 = M (X - X0)

abbiamo Y0 = FitedLine [3]; X0 = FitedLine [2]; m = FitedLine [1]/FitedLine [0];

quindi abbiamo un'equazione di linea in cui possiamo trovare altri punti.

Problemi correlati