c++ - OpenCV:如何将多条线合并为一条曲线

标签 c++ opencv

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

最佳答案

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

就你而言,他们出人意料地很好地跟随地平线。您可以继续收集所有起点和/或终点,按 x 坐标对它们进行排序,然后使用例如polylines .

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

关于c++ - OpenCV:如何将多条线合并为一条曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770798/

相关文章:

c++ - 指向匿名结构的共享指针

c++ - 修剪字符串 vector

c++ - 如何检测测量水位的白色仪表板?

python - 在 Opencv 中绘制断裂线(点线/虚线)

c++ - 是否可以阻止共享/动态库的网络访问?

c++ - 静态数据成员真的可以进行惰性初始化吗?

图像梯度角计算

python - Docker opencv3 Cmake错误

c++ - pretty-print 类型和类模板及其所有模板参数

python - OpenCV:从 RGB 图像中提取颜色 channel