线拟合算法OpenCV

时间:2016-02-28 20:44:48

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

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

来源图片:

Source image

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

After Canny edge detection and finding the longest contour

线条拟合后预期的结果:

Result after line fitting

任何帮助都将深表感谢。

1 个答案:

答案 0 :(得分:0)

你不能简单地使用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)并在它们上面贴上线条。

你应该非常适合。