我使用的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];
所以我们有一个直线方程,我们可以找到其他点。