首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于HoughLinesP的线路检测

基于HoughLinesP的线路检测
EN

Stack Overflow用户
提问于 2015-08-12 15:08:54
回答 1查看 1K关注 0票数 0

使用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);,但是它不能工作,因为控制台只显示视频,没有任何类型的行。

EN

回答 1

Stack Overflow用户

发布于 2015-08-12 17:37:57

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

找出具有给定角度范围的极坐标线(非最稳健的)的解决方法是用HoughLinesP检测所有的线,然后迭代它们,计算出在给定范围内有极角弦的线,并滤除那些有极角弦的线。

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

代码语言:javascript
复制
  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是在给定的直线上计算其第二(角)极坐标的方法。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31969073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档