2010-05-01 15 views
7

estoy usando OpenCV para adaptarse a una línea de un conjunto de puntos usando cvFitLine()Dibujar línea ajustada (OpenCV)

cvFitLine() devuelve un vector normalizado que es co-lineal a la línea y un punto en la línea. Ver detalles here

Usando esta información, ¿cómo puedo obtener la ecuación de una línea para poder dibujar la línea?

Respuesta

7

Si cvFitLine() rendimientos vector normalizado (vx,vy) y punto de (x0,y0), entonces la ecuación de la línea es

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

donde t funciona desde − ∞ hasta + ∞.

Esto es lo que pediste, pero probablemente no sea inmediatamente útil para trazar la línea. Debería recortarlo en los límites de la pantalla, o quizás en el cuadro delimitador del conjunto original de puntos. Para recortar una línea en un rectángulo, solo resuelve los valores de t donde la línea cruza el límite del rectángulo.

9

Simplemente dibuje una línea grande en lugar de resolver los límites. por ejemplo:

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

lo hará por ejemplo .. de m suficientemente grande :)

4

He utilizado una estrategia similar a Karpathy hasta allí, pero utiliza una función extra. Como puede ver, estoy usando cvClipLine para recortar la línea al tamaño de la imagen, lo cual es innecesario pero agrega un poco de amabilidad.

También el multiplicador aquí se define como theMult = max (img-> height, img-> width) por lo que no obtenemos números que un día podrían desbordarse o algo así.

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

usamos un "Vec4f fitedLine;" para línea ajustada en Fitline tenemos 4 parámetros si consideramos relación AZ de la línea más abajo: Y - Y0 = M (X - X0)

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

por lo que tenemos una ecuación de línea podemos encontrar otros puntos sobre ella.

Cuestiones relacionadas