2013-11-04 210 views
2

我正在学校项目中,我必须在图像中检测地平线。我们必须使用openCV。通过使用canny边缘检测器和概率Hough变换,我能够成功检测图像中的三角形。下面是我的结果:OpenCV:如何合并多条线到一条曲线

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); 
    } 
+0

您的线段当前以何种格式表示? – mbschenkel

+0

我已经用创建线段的代码更新了主题。所以我猜它叫做笛卡尔坐标系。 –

+0

你想最终得到什么样的格式? :-) – mbschenkel

回答

0

霍夫变换你提到通常返回(大于给定的阈值)在图片中发现的所有线路。它们不需要连续,可以处于完全不同的位置和方向。

在你的情况下,他们惊人地跟随地平线。你可以继续收集所有的起点和/或终点,用x坐标对它们进行排序并用例如polylines

但是,考虑到给出的示例图像,我也会尝试一些不同的方法。例如,Canny边缘检测具有较大的高斯和高阈值,活动轮廓或每个图像列中最强的垂直梯度(Sobel)。

+0

感谢您的建议,生病尝试使用折线。与此同时,我的老师回应了我的电子邮件:我应该找到从最小x坐标到最高x坐标的相同颜色像素的路径。你对此有何看法?¨ –

+0

黑白图像中颜色的含义是什么?如果你只想为这个特定的图像解决这个问题,单独处理每一列(根据你的老师输入找到最黑的像素,或者像我最后一点那样找到最深的像素)可能会起作用,但在更一般的情况下不会稳定,例如在天空中有一只鸟。 – mbschenkel

+0

还有什么你想知道的吗?否则,请考虑[接受答案](http://stackoverflow.com/help/accepted-answer)。谢谢! – mbschenkel