我目前正在尝试使用opencv中的HoughLinesP函数检测图像中的水平线,使用以下参数:
HoughLinesP(linMat[i], lines, 1, CV_PI/180, 80, linMat[i].cols*(0.3), 3);
其中linMat[i]
是输入图像。结果是这样的
http://postimg.org/image/49b8wzlgz/
虽然这没关系,但我想要的是在水平方向上有线条,如此图像中的黄线所示(线条是手动绘制的)
http://postimg.org/image/rh9wlueo7/
我尝试将CV_PI/180
参数更改为较小的值(例如CV_PI/45
),并尝试将其他参数的各种值用于其他参数,但无法生成水平线。
在opencv中使用HoughLinesP函数在参数中使用哪些值来生成这样的黄线?
谢谢!
更新
遵循建议(谢谢大家!)我已经尝试了非常极端的值,比如
HoughLinesP(linMat[i], lines, 1, CV_PI/360, 80, 1, 1);
更新2
为了澄清,结果中绘制的线条如下生成(在HoughLinesP之后)
for all lines
{
line( linMat[i], Point(lines[j][0], lines[j][1]), Point(lines[j][2], lines[j][3]), Scalar(0,0,255), 1, 8 );
}
答案 0 :(得分:2)
尝试将Hough应用于canny或任何其他算法的边缘输出图像,而不是在阈值图像上运行它。
可以看出,较高的θ值仅表示水平值。通过消除低θ值的值,过滤掉lines
中获得的结果。
答案 1 :(得分:2)
只需使用等式
double Angle = atan2(y2 - y1, x2 - x1) * 180.0 / CV_PI;
检查HoughLinesP()检测到的每条线的角度,并考虑角度为0或180的线条。
答案 2 :(得分:1)
从我在文档(link)中可以看到的内容,我认为函数HoughLinesP
将检测所有图像中的行。参数只是影响检测灵敏度的阈值。
因此,如果您只想要水平线,只需通过分析输出数组过滤掉其他线条。由于输出向量的每个项都是4元素向量(x_1, y_1, x_2, y_2)
,因此您可以计算线的斜率并使用它来过滤掉非水平线。
答案 3 :(得分:1)
您可以尝试:
for all lines:
if abs(lines[j][1] - lines[j][3]) == 0:
# Horizontal line
此外,如果您的线条倾斜,您可以尝试:
for all lines:
if abs(lines[j][1] - lines[j][3]) < 20: # Tune this parameter
# Horizontal line
我想你明白了!
答案 4 :(得分:0)
将CV_PI/2
(在Python中为numpy.pi/2
)作为参数 theta ,它将仅以90°的步进进行扫描。由于您现在在结果中只有完全水平和完全垂直的线条,因此可以减少不需要的结果的数量。这样也可以避免在不使用边缘检测时错误地检测粗线中的坡度。
注意:以180°步进(使用CV_PI
或numpy.pi
)只会传递垂直线。