如何使用HoughLinesP检测OpenCV中的水平线?

时间:2014-02-20 09:51:25

标签: opencv

我目前正在尝试使用opencv中的HoughLinesP函数检测图像中的水平线,使用以下参数:

HoughLinesP(linMat[i], lines, 1, CV_PI/180, 80, linMat[i].cols*(0.3), 3);

其中linMat[i]是输入图像。结果是这样的

http://postimg.org/image/49b8wzlgz/

虽然这没关系,但我想要的是在水平方向上有线条,如此图像中的黄线所示(线条是手动绘制的)

http://postimg.org/image/rh9wlueo7/

我尝试将CV_PI/180参数更改为较小的值(例如CV_PI/45),并尝试将其他参数的各种值用于其他参数,但无法生成水平线。

在opencv中使用HoughLinesP函数在参数中使用哪些值来生成这样的黄线?

谢谢!

更新

遵循建议(谢谢大家!)我已经尝试了非常极端的值,比如

HoughLinesP(linMat[i], lines, 1, CV_PI/360, 80, 1, 1);

然而,所得到的线条在接近垂直方向上具有斜率,如下所示:postimg.org/image/y5w6vm7lx/(请复制粘贴链接......)。 我不使用canny之类的边缘检测滤波器,因为它无法检测到较粗的线条,边缘往往是不连续的线条。

更新2

为了澄清,结果中绘制的线条如下生成(在HoughLinesP之后)

for all lines

{

line( linMat[i], Point(lines[j][0], lines[j][1]), Point(lines[j][2], lines[j][3]), Scalar(0,0,255), 1, 8 );

}

5 个答案:

答案 0 :(得分:2)

尝试将Hough应用于canny或任何其他算法的边缘输出图像,而不是在阈值图像上运行它。

enter image description here

可以看出,较高的θ值仅表示水平值。通过消除低θ值的值,过滤掉lines中获得的结果。

答案 1 :(得分:2)

只需使用等式

double Angle = atan2(y2 - y1, x2 - x1) * 180.0 / CV_PI;

检查HoughLinesP()检测到的每条线的角度,并考虑角度为0或180的线条。

答案 2 :(得分:1)

从我在文档(link)中可以看到的内容,我认为函数HoughLinesP将检测所有图像中的行。参数只是影响检测灵敏度的阈值。

因此,如果您只想要水平线,只需通过分析输出数组过滤掉其他线条。由于输出向量的每个项都是4元素向量(x_1, y_1, x_2, y_2),因此您可以计算线的斜率并使用它来过滤掉非水平线。

答案 3 :(得分:1)

您可以尝试:

for all lines:
  if abs(lines[j][1] - lines[j][3]) == 0:
     # Horizontal line

此外,如果您的线条倾斜,您可以尝试:

for all lines:
  if abs(lines[j][1] - lines[j][3]) < 20: # Tune this parameter
     # Horizontal line

我想你明白了!

答案 4 :(得分:0)

CV_PI/2(在Python中为numpy.pi/2)作为参数 theta ,它将仅以90°的步进进行扫描。由于您现在在结果中只有完全水平和完全垂直的线条,因此可以减少不需要的结果的数量。这样也可以避免在不使用边缘检测时错误地检测粗线中的坡度。

注意:以180°步进(使用CV_PInumpy.pi)只会传递垂直线。