【问题标题】:How to use HoughLinesP to detect horizontal lines in OpenCV?如何使用 HoughLinesP 检测 OpenCV 中的水平线?
【发布时间】:2014-02-20 09:51:24
【问题描述】:

我目前正在尝试使用 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 );

}

【问题讨论】:

    标签: opencv


    【解决方案1】:

    只需使用方程式

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

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

    【讨论】:

    • 正如我在更新的问题中提到的,似乎无论我改变多少角度,结果线总是有垂直斜率。会不会是 HoughLinesP 函数对这种情况的限制?
    【解决方案2】:

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

    可以看出,较高的 theta 值将仅代表水平值。通过剔除低theta值的值,过滤掉lines中得到的结果。

    【讨论】:

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

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

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

    【讨论】:

      【解决方案4】:

      你可以试试:

      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
      

      我想你明白了!

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-05
          • 2020-01-17
          • 1970-01-01
          • 2017-02-06
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多