【问题标题】:Line fitting algorithm OpenCV线拟合算法 OpenCV
【发布时间】:2016-06-11 19:29:36
【问题描述】:

我在源图像上应用了 Canny 边缘检测,然后使用 findContours 函数找到最长的轮廓。但是在此之后,我想使用OpenCV中的线拟合算法( fitline 函数)沿着源图像中的天海线绘制一条线。

源图片:

经过 Canny 边缘检测并找到最长轮廓:

线拟合后的预期结果:

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ opencv line detection curve-fitting


    【解决方案1】:

    您不能简单地将 Canny 边缘检测器用于地平线。

    (1) 应用足够大的中值滤波器来隐藏小尺度特征。

    cv::medianBlur( imgOriginal, blurred, 101 );
    

    (2) 计算梯度幅度。例如。使用丑陋的前向差异如下:

    cv::Mat m;
    blurred.convertTo(m,CV_32F);
    cv::Mat crop = m( cv::Rect(0,0,m.cols-1,m.rows-1) );
    const cv::Mat shiftx = m( cv::Rect(1,0,m.cols-1,m.rows-1) );
    const cv::Mat shifty = m( cv::Rect(0,1,m.cols-1,m.rows-1) );
    cv::Mat dx,dy;
    cv::subtract( shiftx, crop, dx );
    cv::subtract( shifty, crop, dy );
    cv::pow( dx, 2.0, dx );
    cv::pow( dy, 2.0, dy );
    cv::add( dx, dy, dx );
    m.setTo(0);
    cv::sqrt( dx, crop );
    

    (3) 收集梯度幅度高于---比如说---最大值一半的点。

    cv::minMaxLoc( m, &mi, &ma );
    const float thr = ma/2.0;
    std::vector< cv::Point2f > pts;
    for ( int y=0; y<m.rows;++y)
    // ...
    

    (4) 并在他们身上套上线条。

    你应该很合身。

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2020-10-10
      相关资源
      最近更新 更多