2010-05-01 16 views
7

I OpenCV bin mit einer Zeile aus einem Satz von Punkten passen cvFitLine()Draw angepasste Linie (OpenCV)

cvFitLine() kehrt unter Verwendung eines normalisierten Vektor, der auf der Linie kolinear ist und ein Punkt auf der Linie. Siehe Details here

Mit diesen Informationen wie bekomme ich die Gleichung einer Linie, so dass ich die Linie zeichnen kann?

Antwort

7

Wenn cvFitLine() kehrt normalisierten Vektor (vx,vy) und Punkt (x0,y0), dann ist die Gleichung der Geraden ist

(x, y) = (x0, y0) + t * (Vx, Vy)

wo t läuft von − ∞ zu + ∞.

Dies ist, was Sie gefragt haben, aber wahrscheinlich ist nicht sofort hilfreich beim Zeichnen der Linie. Sie möchten es entweder an die Bildschirmgrenzen oder vielleicht an die Begrenzungsbox des ursprünglichen Satzes von Punkten anhängen. Um eine Linie zu einem Rechteck zu schneiden, lösen Sie einfach nach Werten von t, wobei die Linie die Grenze des Rechtecks ​​kreuzt.

9

Zeichnen Sie einfach eine große Linie, anstatt für die Grenzen zu lösen. zB:

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

wird es zum Beispiel tun .. für m groß genug :)

4

Ich benutze eine ähnliche Strategie wie Karpathy dort aber verwendet, um eine zusätzliche Funktion. Wie Sie sehen können, benutze ich cvClipLine, um die Linie auf die Größe des Bildes zu schneiden, was unnötig ist, aber ein wenig mehr Nettigkeit ergibt.

Auch der Multiplikator ist hier definiert als theMult = max (img-> height, img-> width), so dass wir keine Zahlen bekommen, die eines Tages überlaufen könnten oder so.

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

wir verwenden eine "Vec4f fitedLine;" für angepasste Linie in FITLINE haben wir 4 Parameter wenn wir Linie Beziehung az Balg berücksichtigen: Y - Y0 = M (X - X0)

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

so haben wir eine Line-Gleichung können wir andere Punkte darauf finden.