如何从 OpenCV C++ 中的 HoughLines 函数输出中绘制所需的线?
How to draw a desired line from HoughLines function output in OpenCV C++?
上下文:
此 lecture says that the OpenCV HoughLines 函数中的第 8 页 returns 一个 N x 2 行参数数组 rho 和 theta 存储在名为 lines.
的数组中
然后为了从这些角度实际创建线,我们有一些公式,稍后我们使用 line 函数。公式在下面的代码中解释。
代码:
//Assuming we start our program with the Input Image as shown below.
//This array will be used for storing rho and theta as N x 2 array
vector<Vec2f> lines;
//The input bw_roi is a canny image with detected edges
HoughLines(bw_roi, lines, 1, CV_PI/180, 70, 0, 0); '
//These formulae below do the line estimation based on rho and theta
for( size_t i = 0; i < lines.size(); i++ )
{
float rho = lines[i][0], theta = lines[i][1];
Point2d pt1, pt2;
double m;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
//When we use 1000 below we get Observation 1 output.
//But if we use 200, we get Observation 2 output.
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
//This line function is independent of HoughLines function
//and is used for drawing any type of line in OpenCV
line(frame, pt1, pt2, Scalar(0,0,255), 3, LINE_AA);
}
输入图像:
观察 1:
观察 2:
问题:
在上面显示的代码中,如果我们将数字与 a、-a、b 和 -b 相乘,我们会得到不同长度的行。当我乘以 200 而不是 1000(这导致观察 1)时获得观察 2。
更多信息,请参考上面代码第18行和第19行的注释。
问题:
当我们从 HoughLines 输出中绘制线条时,我们如何控制线条的起点和终点?
例如,我希望观察2中的右车道(红线从左上角指向右下角)从屏幕右下角开始指向屏幕左上角(像镜子一样)左车道的图像)。
给定
a = cos(theta)
b = sin(theta)
x0 = a * rho
y0 = b * rho
您可以将位于 (rho, theta)
定义的直线上的所有点的公式写为
x = x0 - c * b
y = y0 + c * a
其中 c
是与参考点的距离(与通过原点的垂线相交)。
在您的情况下,您已经使用 c = 1000
和 c = -1000
对其进行了评估,以获得在两者之间画一条线的两个点。
您可以将它们重写为
c = (x0 - x) / b
c = (y - y0) / a
然后用代入计算水平和垂直截距:
x = x0 - ((y - y0) / a) * b
或
y = y0 + ((x0 - x) / b) * a
注意: 注意正确处理 a
或 b
为 0 的情况。
假设您有一张 800x600 的图片(为了简化数字)。我们可以将图像的底部边缘定义为线y = 599
。使用上面的公式计算 x
的值,您的线截取它的位置。
- 如果截取点在图像中(
0 <= x < 800
),那就是你的起点。
- 如果它在左侧 (
x < 0
),找到与线 x = 0
的截距作为起点。
- 如果它在右边 (
x >= 800
),找到以线 x = 799
为起点的截距。
然后用类似的方法找到第二个点就可以画线了
上下文:
此 lecture says that the OpenCV HoughLines 函数中的第 8 页 returns 一个 N x 2 行参数数组 rho 和 theta 存储在名为 lines.
的数组中然后为了从这些角度实际创建线,我们有一些公式,稍后我们使用 line 函数。公式在下面的代码中解释。
代码:
//Assuming we start our program with the Input Image as shown below.
//This array will be used for storing rho and theta as N x 2 array
vector<Vec2f> lines;
//The input bw_roi is a canny image with detected edges
HoughLines(bw_roi, lines, 1, CV_PI/180, 70, 0, 0); '
//These formulae below do the line estimation based on rho and theta
for( size_t i = 0; i < lines.size(); i++ )
{
float rho = lines[i][0], theta = lines[i][1];
Point2d pt1, pt2;
double m;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
//When we use 1000 below we get Observation 1 output.
//But if we use 200, we get Observation 2 output.
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
//This line function is independent of HoughLines function
//and is used for drawing any type of line in OpenCV
line(frame, pt1, pt2, Scalar(0,0,255), 3, LINE_AA);
}
输入图像:
观察 1:
观察 2:
问题:
在上面显示的代码中,如果我们将数字与 a、-a、b 和 -b 相乘,我们会得到不同长度的行。当我乘以 200 而不是 1000(这导致观察 1)时获得观察 2。
更多信息,请参考上面代码第18行和第19行的注释。
问题:
当我们从 HoughLines 输出中绘制线条时,我们如何控制线条的起点和终点?
例如,我希望观察2中的右车道(红线从左上角指向右下角)从屏幕右下角开始指向屏幕左上角(像镜子一样)左车道的图像)。
给定
a = cos(theta)
b = sin(theta)
x0 = a * rho
y0 = b * rho
您可以将位于 (rho, theta)
定义的直线上的所有点的公式写为
x = x0 - c * b
y = y0 + c * a
其中 c
是与参考点的距离(与通过原点的垂线相交)。
在您的情况下,您已经使用 c = 1000
和 c = -1000
对其进行了评估,以获得在两者之间画一条线的两个点。
您可以将它们重写为
c = (x0 - x) / b
c = (y - y0) / a
然后用代入计算水平和垂直截距:
x = x0 - ((y - y0) / a) * b
或
y = y0 + ((x0 - x) / b) * a
注意: 注意正确处理 a
或 b
为 0 的情况。
假设您有一张 800x600 的图片(为了简化数字)。我们可以将图像的底部边缘定义为线y = 599
。使用上面的公式计算 x
的值,您的线截取它的位置。
- 如果截取点在图像中(
0 <= x < 800
),那就是你的起点。 - 如果它在左侧 (
x < 0
),找到与线x = 0
的截距作为起点。 - 如果它在右边 (
x >= 800
),找到以线x = 799
为起点的截距。
然后用类似的方法找到第二个点就可以画线了