借助 OpenCV 找到车载记录仪中的车道线

2018-08-16 19:17:07爱云资讯阅读量:1039


大家好!在此项目中,我将尝试从车载记录仪的视频中寻找车道线。当我们检测到车道线,我们将在原视频帧上将他们标记出来并回放。所有的一切工作将在线上使用 OpenCV 提供的函数完成,并且不会存在任何延迟。

在此我们将编辑一系列的函数来检测车道线。我们在编写此函数的时候将用到一个示例图像,一旦我们能在一些示例图像的基础上成功地检测到车道线,我们将完整的程序添加到一个函数里去,该函数能接收实时图像,并返回带有车道线标记的相同图像。让我们立刻开始学习吧。

首先,输入示例图像帧。此行将在最终的代码中进行注释,其中 image 将通过视频捕获来获得帧。

示例图

为了减轻我们处理器的负担(这在嵌入式系统中是非常稀缺的资源),我们将在 Greyscale 版本的图像中进行所有图像处理,而不是原始的彩色版本,这将有助于用更少的资源更快地执行程序。以下函数将彩色图像转换成灰度版本。

灰度图像

接下来我们将通过模糊来消除图像中的噪声,通过将图像与低通滤波器内核卷积来实现图像模糊。它有助于消除噪音,实际上从图像中去除了高频内容(例如:噪声,边缘),因此在此操作中边缘会有些模糊。OpenCV 提供 4 种不同类型的模糊技术,高斯模糊是最受欢迎的一种。

图像模糊(图像平滑化)

我们能选择不同的内核大小,其中结果过滤器将简单地取内核(内核大小行 x 列的矩阵)区域的平均像素值,并用平均值代替中心元素。而 5 是一个标准值,故我选择了 5。

边缘检测

canny 边缘检测是边缘检测的常用算法。实际上,canny 边缘函数还实现了一个内核大小为 5x5 的高斯过滤器,这和我们之前的步骤一样,但是在我遇到的许多文献中,都推荐在 canny 边缘检测之前先对其进行图像模糊。边缘检测背后的基础理论是,无论何处有边缘,边缘两侧的像素在强度上有着很大的差异(也称为梯度)。首先,在水平和垂直方向上扫描输入图像以找到每个像素的梯度。在获得梯度幅度和方向之后,完成图像的全扫描以去除可能不构成边缘的任何不想要的像素。为此,在每个像素处检查像素是否是其邻域中的局部最大值。

low_threshold 和 high_threshold 确定必须检测边缘的强度。如果梯度高于 high_threshold ,则将此梯度视为边缘的一部分,但是一旦检测到边缘,即使梯度高于 low_threshold ,下一个像素将被视为边缘。

参考我们的示例图像,很明显在边缘条件下,尤其是在车道线是白色的,邻近的车道像素是黑色的时候,相邻的像素存在着巨大的差异。

感兴趣区域

有一点需要考虑的是,我们并不想查找图像中的所有边缘。我们只对图像中中心区域的车道线查找感兴趣。直观上这是可行的,车道线是不可能在图像的左上/右上部分。看我们的示例图像,我们可以有把握地说,车道线应位于图像底部边缘较宽的梯形区域内。随着边缘逐渐变窄,我们朝向图像的顶部。

相关文章
热门文章
头条文章
重点文章
推荐文章
热点文章
关于我们|联系我们|免责声明|会展频道
冀ICP备2022007386号-1 冀公网安备 13108202000871号 爱云资讯 Copyright©2018-2023