【问题标题】:OpenCV: How to merge multiple lines into one curveOpenCV:如何将多条线合并为一条曲线
【发布时间】:2013-11-04 15:13:14
【问题描述】:

我正在做一个学校项目,我必须在图像中检测地平线。我们必须使用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);
  }

【问题讨论】:

  • 您的线段目前以什么格式表示?
  • 我用创建线段的代码更新了主题。所以我猜它叫笛卡尔坐标系。
  • 最后你想得到什么样的格式? :-)
  • 我不太关心格式,我只需要制作在任何地方都具有相同厚度的单一曲线。这是我老师想要的一个例子。 img833.imageshack.us/img833/7457/zu7d.jpg

标签: c++ opencv


【解决方案1】:

您提到的霍夫变换通常会返回图片中的所有行(高于给定阈值)。它们不需要是连续的,可以在完全不同的位置和方向。

在你的情况下,它们出人意料地很好地跟随地平线。您可以继续收集所有起点和/或终点,按 x 坐标对它们进行排序并使用例如绘图。 polylines.

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

【讨论】:

  • 感谢您的建议,我尝试使用折线。与此同时,我的老师回复了我的电子邮件:我应该找到从最小 x 坐标到最高 x 坐标的相同颜色像素的路径。你怎么看??¨
  • 黑白图像中颜色的含义是什么?如果您只想针对该特定图像解决此问题,则单独处理每一列(根据老师的输入找到最暗的像素或在我的最后一点中找到最陡峭的梯度)可能会起作用,但在更一般的情况下不稳定,例如天空中有一只鸟。
  • 您还有什么想知道的吗?否则考虑accepting an answer。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2016-06-29
相关资源
最近更新 更多