使用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);
但它不起作用,因为控制台只显示没有任何类型线条的视频。
答案 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是一个在给定线上计算其第二个(角度)极坐标的方法。
请记住实施良好的浮动比较技术。