我使用的OpenCV使用cvFitLine()
繪製裝線(OpenCV的)
cvFitLine()
以適合從一組點的行返回的歸一化矢量,即共線的線和上線的一個點。 查看詳細信息here
使用此信息如何獲得一條線的方程以便我可以畫出線?
我使用的OpenCV使用cvFitLine()
繪製裝線(OpenCV的)
cvFitLine()
以適合從一組點的行返回的歸一化矢量,即共線的線和上線的一個點。 查看詳細信息here
使用此信息如何獲得一條線的方程以便我可以畫出線?
如果cvFitLine()
返回歸一化矢量(vx,vy)
和點(x0,y0)
,然後該線的方程是
(X,Y)=(X0,Y0)+ T *(VX,VY)
其中t
運行從− ∞到+ ∞。
這就是你要求的,但可能不會立即有助於畫線。您可能想要將其剪輯到屏幕邊界,或者也可能是原始點集的邊界框。要將一條線裁剪成一個矩形,只需要求出線條穿過矩形邊界的值t
。
只畫出一條大線,而不是解決邊界問題。例如:
cv.Line(img, (x0-m*vx[0], y0-m*vy[0]), (x0+m*vx[0], y0+m*vy[0]), (0,0,0))
將做到這一點,例如..對於m足夠大:)
我採用了類似於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);
}
我們使用「Vec4f fitedLine;」在fitLine擬合 線我們有4個參數 如果我們考慮線關係AZ波紋管: Ŷ - Y0 = M(X - X 0)
我們有 Y0 = FitedLine [3]; X0 = FitedLine [2]; m = FitedLine [1]/FitedLine [0];
所以我們有一個直線方程,我們可以找到其他點。