![]() |
OpenCV
开源计算机视觉
|
霍夫变换是一种流行的技术,可以检测任何形状,只要您可以用数学形式表示该形状。即使形状稍微断裂或变形,它也能检测到形状。我们将看到它如何用于直线。
一条直线可以用
因此,如果直线经过原点下方,则它将具有正的ρ和一个小于180的角度。如果它经过原点上方,则角度取小于180,ρ取负值,而不是取大于180的角度。任何垂直线都将具有0度,水平线将具有90度。
现在让我们看看霍夫变换如何用于直线。任何直线都可以用这两个参数
考虑一个100x100的图像,中间有一条水平线。取直线的第一个点。你知道它的(x,y)值。现在在线性方程中,将
现在取直线上的第二个点。执行与上述相同的操作。将你得到的
这就是霍夫变换对直线的工作原理。很简单。下面是一张显示累加器的图像。某些位置的亮点表示它们是图像中可能直线的参数。(图片来自:维基百科)
上面解释的所有内容都封装在OpenCV函数cv.HoughLines()中。它只返回一个
我们使用函数:cv.HoughLines (image, lines, rho, theta, threshold, srn = 0, stn = 0, min_theta = 0, max_theta = Math.PI)
图像 | 8位单通道二值源图像。该函数可能会修改图像。 |
lines | 直线的输出向量(cv.32FC2 类型)。每条线都由一个两元素向量 (ρ,θ) 表示。ρ是距坐标原点 (0,0) 的距离。θ是直线的旋转角度(以弧度表示)。 |
rho | 累加器中距离分辨率(以像素为单位)。 |
theta | 累加器中角度分辨率(以弧度为单位)。 |
threshold | 累加器阈值参数。只返回获得足够投票数的直线。 |
srn | 对于多尺度霍夫变换,它是距离分辨率 rho 的除数。粗略累加器距离分辨率为 rho,精确累加器分辨率为 rho/srn。如果 srn=0 且 stn=0,则使用经典霍夫变换。否则,这两个参数都应为正数。 |
stn | 对于多尺度霍夫变换,它是角度分辨率 theta 的除数。 |
min_theta | 对于标准和多尺度霍夫变换,要检查直线的最小角度。必须介于 0 和 max_theta 之间。 |
max_theta | 对于标准和多尺度霍夫变换,要检查直线的最大角度。必须介于 min_theta 和 CV_PI 之间。 |
在霍夫变换中,您可以看到,即使对于具有两个参数的直线,它也需要大量的计算。概率霍夫变换是我们看到的霍夫变换的一种优化方法。它不会考虑所有点。相反,它只考虑足以进行直线检测的随机点子集。我们只需要降低阈值即可。请参见下图,该图比较了霍夫空间中的霍夫变换和概率霍夫变换。(图片来自:Franck Bettinger的主页)
OpenCV 的实现基于 Matas,J. 和 Galambos,C. 和 Kittler,J.V. 的《使用渐进概率霍夫变换进行鲁棒的直线检测》 [185]。
我们使用函数:cv.HoughLinesP (image, lines, rho, theta, threshold, minLineLength = 0, maxLineGap = 0)
图像 | 8位单通道二值源图像。该函数可能会修改图像。 |
lines | 线段输出向量(cv.32SC4 类型)。每条线段由一个四元素向量 (x1,y1,x2,y2) 表示,其中 (x1,y1) 和 (x2,y2) 是检测到的线段的两个端点。 |
rho | 累加器中距离分辨率(以像素为单位)。 |
theta | 累加器中角度分辨率(以弧度为单位)。 |
threshold | 累加器阈值参数。只返回获得足够投票数的直线。 |
minLineLength | 最小线段长度。短于此长度的线段将被拒绝。 |
maxLineGap | 同一直线上允许的点之间最大间隙,用于连接这些点。 |