使用HoughLinesP进行线检测

时间:2015-08-12 15:08:54

标签: c++ opencv hough-transform

使用OpenCV和C ++,我试图从输入视频中检测街道的线条。我正在使用 HoughLinesP ,我只想检测界定街道的线条,所以不是水平或垂直的。例如。
运用 HoughLinesP(dst, lines, 1, CV_PI/180, 8, 80, 3), 我检测到所有行,所以我将双重θ(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); 但它不起作用,因为控制台只显示没有任何类型线条的视频。

1 个答案:

答案 0 :(得分:1)

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

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

EDIT(使用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是一个在给定线上计算其第二个(角度)极坐标的方法。

请记住实施良好的浮动比较技术。