本节首先介绍一些关于霍夫变换的基本概念,然后利用OpenCV提供的霍夫变换来寻找车道。
最初霍夫变换只是一种检测图像中线条的技术,现在已被广泛采用来检测2D和3D曲线。其算法的执行步骤如下:
(1)拐角或边缘检测。例如,使用Canny、Sobel和自适应阈值,所生成的二进制/灰度图像将具有用0(无边缘)和1(或更高值)表示的边缘。这是输入图像。
(2) ρ 范围和 θ 范围的创建。 ρ 的范围为[-max_dist,max_dist],其中max_dist表示输入图像的对角线长度; θ 的范围为-90 o ~90 o 。
(3)计算相对于 ρ 的 θ 累加值。它是一个2D数组,其行数为 ρ 值,列数为 θ 值。
(4)在累加器中“投票”。对于每个边缘点和每个 θ 值,找到最近的 ρ 值,并在累加器中递增该索引。每个元素都表明有多少个点/像素,为潜在的候选线贡献了“票”。
(5)峰值发现。累加器中的局部最大值,用于指示输入图像中最突出的线条的参数。通过应用阈值或相对阈值(等于或大于全局最大值的某个固定的百分比),容易找到峰值。
下面这段代码表示利用霍夫变换来检测直线。
代码3-1 利用霍夫变换检测直线
下面这段代码表示如何调用上面定义的hough_line检测直线。
代码3-2 调用hough_line检测直线
下面给出的例子,主要是利用OpenCV提供的cv2.HoughLinesP函数来进行直线检测。
代码3-3 OpenCV提供的cv2.HoughLinesP函数
代码3-4 调用cv2.HoughLinesP函数