2010-05-01 59 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];

所以我們有一個直線方程,我們可以找到其他點。