使用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);,但是它不能工作,因为控制台只显示视频,没有任何类型的行。
发布于 2015-08-12 17:37:57
HoughLinesP的第四个参数不是一个角值,它告诉opencv只检测从OX轴(即极坐标中)定向的线。传入的角度值不是告诉opencv算法从0迭代到PI (或2* PI,取决于算法是如何实现的),以这个角度作为迭代步骤,例如,从0到PI/180的迭代将在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是在给定的直线上计算其第二(角)极坐标的方法。
记住要实现好的浮点比较技术。
https://stackoverflow.com/questions/31969073
复制相似问题