软件杯 深度学习机器视觉车道线识别与检测 -自动驾驶
文章目录
- 1 引言
-
2 展示成果
-
3 车道线
-
4 问题抽象(建立模型)
-
5 帧掩码(Frame Mask)
-
6 图像预处理流程
-
7 图像二值化处理
-
8 基于霍夫变换的直线检测算法
-
9 实现车道检测
- 9.1 帧掩码构建过程
- 9.2 图像预处理步骤
- 9.2.1 图像二值化处理
- 9.2.2 基于霍夫变换的直线检测算法
-
最后
-
1 前言
🔥 优质竞赛项目系列,今天要分享的是
🚩 机器视觉 深度学习 车道线检测 - opencv
该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 更多资料, 项目分享:
https://gitee.com/dancheng-senior/postgraduate
2 先上成果

3 车道线
理解车道检测的概念
那么什么是车道检测?以下是百度百科对车道的定义:
行驶道亦称行车线或车行道,在专为供车辆行驶的道路设有之。通常可在普通公路以及高速公路上见到。高速公路的规定较为严格:行驶道与加速度带均需遵循一定的法律规范。

为建立该概念的定义至关重要,在构建该系统的各个组件时必须保证清晰明确
如前所述,在我的先前讨论中提到过
以下是一些随机道路图像(第一行)及其检测到的车道(第二行):
4 问题抽象(建立模型)
我们的目标是实时识别视频中的车道。我们的任务可以通过多种途径实现。我们能够利用基于学习的策略,在经过标注的视频数据集上训练深度学习模型,并且还可以通过利用预训练好的模型来完成这一目标。
但是,在这个领域中还有一种更为简便的方式来进行车道检测任务。在这里,请注意他将向大家演示一种无需依赖复杂的深度学习模型的技术路径。
下面是将要处理的视频的一个帧:
如图所示,在这张图片中我们可以清晰地观察到四条由白色标线分隔的道路 lanes are clearly visible. 因此,在进行车道识别时必须准确识别这些区域中的白色标记. 这自然地提出了一个问题:如何准确地解析这些标线信息?
除了车道标线以外,在场景中还包含其他多种物体。道路上包括车辆、路侧护栏以及路灯等,在视频序列中每个画面都呈现动态变化。这一现象真实地模拟了行车过程中的常见状况。
为此必须找到一种方法来忽视驾驶环境中无关的对象
我们可以进行的一项具体操作就是聚焦于感兴趣的部分。为了避免使用整个帧而选择仅处理帧的一部分能够节省计算资源。在所分析的图像中,在排除车道标记的情况下其他所有元素均被隐去。当车辆移动时,在该区域内的车道标线将会有不同程度地出现。

5 帧掩码(Frame Mask)
帧掩码只是一个NumPy数组。
在处理图像时,在目标区域设置像素值为0、255或其他数值即可实现掩膜效果
下面给出了一个图像掩蔽的例子。图像中某个区域的像素值已设置为0:

这是一种非常简单但有效的从图像中去除不需要的区域和对象的方法。
6 车道检测的图像预处理
我们将首先对输入视频中的所有帧应用掩码。
然后,我们将应用图像阈值化和霍夫线变换来检测车道标线。
7 图像阈值化
在该方法中, 灰度图像中的每个像素会被基于设定好的阈值划分为黑白两种不同的数值. 进而判断每个像素是否超过该特定阈值. 如果是, 则给该像素赋以一个对应的数值; 否则, 给其赋予另一个对应的数值.

正如所述,在对蒙版图像施加阈值后,在输出图像中仅获取到车道标线的结果。目前而言,在这一过程中我们能够相对容易地利用霍夫线变换识别出这些标记。
8 霍夫线变换
霍夫线变换是一种检测任何可以用数学方法表示的形状的方法。
例如,在图像中可以看出其形态特征包括矩形圆形三角形以及线条等基本元素我们则专注于识别那些具有直线路标的线条类符号
在执行图像阈值化后对图像应用霍夫线变换将提供以下输出:

9 实现车道检测
现在需要用Python来完成这个车道检测项目!我强烈推荐采用Google Colab平台进行开发工作,因为构建复杂的车道检测系统确实需要较高的计算资源支持。
首先导入所需的库:
import os
import re
import cv2
import numpy as np
from tqdm import tqdm_notebook
import matplotlib.pyplot as plt
# 获取帧的文件名
col_frames = os.listdir('frames/')
col_frames.sort(key=lambda f: int(re.sub('\D', '', f)))
# 加载帧
col_images=[]
for i in tqdm_notebook(col_frames):
img = cv2.imread('frames/'+i)
col_images.append(img)
# 指定一个索引
idx = 457
# plot frame
plt.figure(figsize=(10,10))
plt.imshow(col_images[idx][:,:,0], cmap= "gray")
plt.show()

9.1 帧掩码创建
我们的兴趣区域是由一个明确的多边形形状构成的。为此我们需要将不属于该区域的所有内容掩盖起来。为此我们必须首先确定该多边形的坐标参数,并据此生成相应的帧遮罩图像:


9.2 图像预处理
为了实现对视频帧进行图像预处理以识别所需车道的目的
图像阈值化
霍夫线变换
9.2.1 图像阈值化

9.2.2 霍夫线变换
lines = cv2.HoughLinesP(thresh, 1, np.pi/180, 30, maxLineGap=200)
# 创建原始帧的副本
dmy = col_images[idx][:,:,0].copy()
# 霍夫线
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(dmy, (x1, y1), (x2, y2), (255, 0, 0), 3)
# 画出帧
plt.figure(figsize=(10,10))
plt.imshow(dmy, cmap= "gray")
plt.show()

最后
🧿 更多资料, 项目分享:
