2010-05-01 62 views
7

我使用的OpenCV使用cvFitLine()绘制装线(OpenCV的)

cvFitLine()以适合从一组点的行返回的归一化矢量,即共线的线和上线的一个点。 查看详细信息here

使用此信息如何获得一条线的方程以便我可以画出线?

回答

7

如果cvFitLine()返回归一化矢量(vx,vy)和点(x0,y0),然后该线的方程是

(X,Y)=(X0,Y0)+ T *(VX,VY)

其中t运行从− ∞到+ ∞。

这就是你要求的,但可能不会立即有助于画线。您可能想要将其剪辑到屏幕边界,或者也可能是原始点集的边界框。要将一条线裁剪成一个矩形,只需要求出线条穿过矩形边界的值t

9

只画出一条大线,而不是解决边界问题。例如:

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

将做到这一点,例如..对于m足够大:)

4

我采用了类似于Karpathy那里战略,而是使用一个额外的功能。正如你所看到的,我使用cvClipLine将线条修剪成图像的大小,这是不必要的,但确实增加了一点不错。

此外,这里的乘数被定义为最大=最大(img->高度,img->宽度),所以我们不会得到可能有一天会溢出的数字。

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

我们使用“Vec4f fitedLine;”在fitLine拟合 线我们有4个参数 如果我们考虑线关系AZ波纹管: Ŷ - Y0 = M(X - X 0)

我们有 Y0 = FitedLine [3]; X0 = FitedLine [2]; m = FitedLine [1]/FitedLine [0];

所以我们有一个直线方程,我们可以找到其他点。