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

4
我目前正在尝试使用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之后) 对于所有的线

{

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

的翻译结果是:

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

}

5个回答

3

只需要使用以下公式:

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

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


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

2
尝试在Canny或其他算法的边缘输出图像上应用Hough,而不是在阈值图像上运行它。
可以看到,更高的theta值只表示水平值。通过消除低theta值的值,过滤掉在“lines”中获得的结果。

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

2
根据文档(链接),我认为函数HoughLinesP将检测图像中的所有线条。参数只会影响检测的灵敏度。

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


2
你可以尝试以下方法:
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

我明白你的意思了!

1
CV_PI / 2(Python中的numpy.pi/2)作为参数theta,它只会在90°步长中进行扫描。这将减少需要过滤的不必要结果的数量,因为现在您的结果中只有完全水平和完全垂直的线条。这也将避免在不使用边缘检测时错误地检测到较粗线条的斜率。

注意:以180°步长进行步进(使用CV_PInumpy.pi)将仅提供垂直线条。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接