【问题标题】:opencv detect dotted linesopencv检测虚线
【发布时间】:2015-05-25 20:46:55
【问题描述】:

我有一张由虚线组成的图像:

注意:打开图片,放大图片并查看所有小点

如何使用 openCV 检测和参数化这些线条?

此图像是机器人上的激光测距仪的值,我需要尽可能好地获取所有线条。


HoughLinesP 函数应该是这个的理想选择?

我尝试了以下代码:

    //converts laser range readings to a binary image.
    cv::Mat binaryImg = laserRangesToBinaryImage();

    cv::Mat cdst;
    cvtColor(binaryImg, cdst, CV_GRAY2BGR);

    std::vector<cv::Vec4i> lines;
    HoughLinesP(binaryImg, lines, 2, 5.0*CV_PI/180.0, 1, 2, 20 );
    for( size_t i = 0; i < lines.size(); i++ )
    {
        cv::Vec4i l = lines[i];
        line( cdst, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(0,0,255), 3, CV_AA);
    }

    cv::imshow("Hough output", cdst);

这导致大约 50 到 60 行(在 Ubuntu 14.04 上使用 openCV 2.8.3):

这里最大的问题是有多个分开的线段,应该检测到一条完整的线。所以这些段没有正确连接。有些线条太短甚至无法检测到。

最佳结果应该如下所示(手动创建),大约有 20 个线段:

我怎样才能达到这个结果?

【问题讨论】:

  • 你试过扩张和侵蚀吗?这可以将这些点连接起来并变成线,然后算法可能会更好地检测到。也可以检查彼此接近的段并将它们联合起来。
  • 你可以 1. 使用 houghLines 方法而不是 HoughLinesP 2. 使用 hlp 的 gap 参数 3. 集群并连接你的小线段

标签: python c++ opencv hough-transform


【解决方案1】:

如果您还没有,请查看tutorial

基本上,您应该对这三个参数(HoughLinesP function 的最后三个参数)进行操作,直到达到检测到的行的正确长度:

  1. 阈值:“检测”一条线的最小交叉点数(在Hough space 中)。
  2. minLinLength: 可以形成一条线的最小点数。 点数少于此数量的线将被忽略。
  3. ma​​xLineGap:要考虑的两点之间的最大间隙 同一行。

数学形态学 (closing) 也有帮助,正如 cmets 中提到的那样。但是,帮助将是有限的:对于此类任务,建议使用一个小的 3x3 内核,因此如果一条线上的某些像素彼此相距太远,则无论如何都不会填补空白。

【讨论】:

    猜你喜欢
    • 2020-07-29
    • 2023-03-10
    • 2017-10-31
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2016-08-21
    • 2012-11-11
    相关资源
    最近更新 更多