我正在学校项目中工作,我必须在图像中检测地平线。我们必须使用openCV。我已经达到了可以使用Canny边缘检测器和概率霍夫变换成功检测图像中的horiton的地步。这是我的结果:
Image with detected horizon
如您所见,显示地平线位置的线由多条线组成。
我的老师的水平检测精度很好,但他希望我将多条线合并为一条曲线。
有简单的方法吗?
我在编程方面有点陌生,因此将不胜感激。
我想为我的英语不好而道歉。
编辑1。
这就是我创建线条的方式:
vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 1, 1, 200 );
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];
line( src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
}
最佳答案
您提到的霍夫变换通常会返回图片中找到的所有行(超过给定阈值)。它们不需要是连续的,可以在完全不同的位置和方向。
在您的情况下,它们令人惊讶地很好地跟随了地平线。您可以先收集所有起点和/或终点,然后按x坐标对它们进行排序,然后使用例如polylines。
但是,考虑到给出的示例图像,我还将尝试一些不同的方法。例如,每个图像列中的高斯高阈值, Activity 轮廓或仅最强的垂直梯度(Sobel)的Canny边缘检测。
关于c++ - OpenCV:如何将多条线合并为一条曲线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19770798/