使用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轴定向的线(即在极坐标中)的 Angular 值。而不是传入的 Angular 值告诉opencv算法从0迭代到PI(或2 * PI,取决于算法的实现方式),并将该 Angular 作为迭代步骤,例如通过PI / 180从0迭代到PI将在HoughLinesP中进行180次迭代,以尝试找到给定(r,alpha)的线。

找到具有给定 Angular 范围的极坐标的线(不是最稳健的线)的解决方案可能是使用HoughLinesP检测所有线,然后对其进行迭代,计算 Angular 坐标,并滤除在给定范围内具有极角坐标的线。

编辑(使用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是一种在给定线上计算其第二( Angular )极坐标的方法。

记住要实现良好的浮点比较技术。

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

10-13 09:00