c++ - 使用 HoughLinesP 进行线检测

标签 c++ opencv hough-transform

我尝试使用 OpenCV 和 C++ 从输入视频中检测街道的线条。我正在使用 HoughLinesP 并且我只想检测分隔街道的线,例如水平线或垂直线。
使用 HoughLinesP(dst, lines, 1, CV_PI/180, 8, 80, 3) , 我检测到所有的线,所以我将 double theta ( CV_PI/180) 更改为此 HoughLinesP(dst, lines, 10*CV_PI/180<=theta<=80*CV_PI/180 & 110*CV_PI/180<=theta<=170*CV_PI/180, 8, 80, 3); 但它不起作用,因为控制台只显示没有任何类型线条的视频。

最佳答案

HoughLinesP 的第四个参数不是一个角度值,它告诉 opencv 只检测从 OX 轴(即极坐标)定向的线。相反,传入的角度值告诉 opencv 算法从 0 迭代到 PI(或 2*PI,取决于算法的实现方式),并将该角度作为迭代步骤,例如通过 PI/180 从 0 迭代到 PI 将在 HoughLinesP 中进行 180 次迭代以尝试找到给定 (r,alpha) 的直线。

找到具有给定角度范围(不是最稳健的)极坐标的线的解决方案可能是使用 HoughLinesP 检测所有线,然后迭代它们,计算角度坐标并过滤掉那些具有极坐标的线一个给定的范围。

编辑(使用 C++11 的算法草案):

  vector<Vec4i> detectedLines;
  HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
  vector<Vec4i> filteredLines(detectedLines.size());
  const float downAngleRange = 30*CV_PI/180;
  const float upAngleRange = 60*CV_PI/180;
  auto it = copy_if(detectedLines.begin(), detectedLines.end(),
    filteredLines.begin(),
    [](const Vec4i &v) {
       float angle = calculateAnglePolarCord(v);
       return angle <= upAngleRange && angle >= downAngleRange;
    });
   filteredLInes.resize(std::distance(filteredLines.begin(),it));  

其中 calculateAnglePolarCord 是一种在给定线上计算其第二个(角度)极坐标的方法。

请记住实现良好的 float 比较技术。

关于c++ - 使用 HoughLinesP 进行线检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31969073/

相关文章:

Python 和 OpenCV - 改进我的车道检测算法

c++ - 询问比要求更多的元素

c++ - 字符串迭代器不可取消引用

c++ - 两种类型的字符串没有匹配的函数调用

python - Eclipse中Python的OpenCV 2.3的配置

ios - 使用 OpenCV iOS Objective C 将图像转换为黑白(非灰度)

c++ - 使用 Mat opencv 组合矩阵

opencv - HoughCircles 识别球的参数

java - 用于图像中文本检测的霍夫变换算法

c++ - 使用库的 Makefile