opencv检测虚线

时间:2015-03-22 22:13:05

标签: python c++ opencv hough-transform

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

注意:打开图像,进行识别并查看所有小点

Dotted lines

如何使用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):

Hough transform results

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

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

Manually annotated image

如何实现此结果?

1 个答案:

答案 0 :(得分:0)

如果您还没有,请查看此tutorial

基本上,你应该对这三个参数(HoughLinesP function的最后三个参数)采取行动,直到你找到检测到的线的正确长度:

  1. 阈值:“检测”一条线的最小交叉点数(Hough space中)。
  2. minLinLength:可以形成一条线的最小点数。     点数少于此数量的行将被忽略。
  3. maxLineGap:要考虑的两点之间的最大差距     同一条线。
  4. 数学形态学(closing)也可以提供帮助,正如评论中提到的那样。但是,帮助将是有限的:建议将一个小的3x3内核用于此类任务,因此如果一条线上的某些像素彼此相距太远,则无论如何都不会填补这个差距。