2014-02-20 368 views
3

我目前试图检测使用HoughLinesP功能在OpenCV中的图像中的水平状的线,使用这些参数:如何使用HoughLinesP检测OpenCV中的水平线?

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);

}

回答

2

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

enter image description here

这可以看出,较高的THETA值仅代表水平值。通过消除具有低θ值的值来过滤出在lines中获得的结果。

+0

如果您将theta设置为PI,您将得到几乎只是垂直线的结果。 PI/3似乎也一样。但PI/6返回所有方向。我还没有弄清楚细节,为什么它以这种方式工作,但修改测试图片上的theta可以给你方向。 –

1

从我能看到的文档(link),我认为功能HoughLinesP将检测到所有图像中的行。这些参数仅是影响检测灵敏度的阈值。

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

2

只需使用方程

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

检查角度用于通过HoughLinesP()检测出的各线,并考虑其具有角度0°或180°的线

+0

正如我在更新的问题中提到的那样,无论改变角度多少,结果线总是有垂直斜率。这可能是这种情况下HoughLinesP函数的限制吗? – Houari

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 

我想你明白了!