gpt4 book ai didi

c++ - 如何从 OpenCV C++ 中的 HoughLines 函数输出中绘制所需的线?

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:35 30 4
gpt4 key购买 nike

上下文:

lecture 中的第 8 页说 OpenCV HoughLines函数返回一个 N x 2 行参数数组 rhotheta,它们存储在名为 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);
}

输入图像:

enter image description here

观察 1:

enter image description here

观察 2:

enter image description here

问题:

在上面显示的代码中,如果我们将数字与 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 的截距用作起点。

然后用类似的方法找到第二个点就可以画线了。

关于c++ - 如何从 OpenCV C++ 中的 HoughLines 函数输出中绘制所需的线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51796526/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com