基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

这篇具有很好参考价值的文章主要介绍了基于OpenCV的实时车道线分割&车道保持系统(源码&教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.研究背景

汽车主动安全系统能够实现风险的主动预防和规避,其能有力缓解当前我国汽车交通事故频发的困境,故对其的相关研究得到了国家的大力支持。
车道保持辅助系统(LKAS,Lane Keeping Assistance Systems)作为ADAS中的一种,它能够有效地避免因车辆偏离正常行驶车道而引发的交通事故。有关专家表示,由车道偏离造成的事故占全球汽车交通事故总量的50%左右,因此围绕LKAS展开的相关研究也应受到行业和学术界的重点关注。同时,以摄像头作为LKAS的主要环境感知传感器将有效降低系统的研发及生产成本,进而快速提高系统的普及率和装配率。基于上述原因,研究以摄像头为主传感器的基于机器视觉的车道保持辅助系统具有重要的现实意义。

2.图片演示

基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

3.视频演示

基于OpenCV的实时车道线分割&车道保持系统(源码&教程)_哔哩哔哩_bilibili

4.算法流程图

参考该博客提出的算法流程,稍加改进,在基于机器视觉的车道保持辅助系统中,系统将通过车道线识别与跟踪模块来提取准确的道路图像信息,进而根据它们反解出道路空间信息以及车辆相对于车道的位姿信息等以供后续模块的使用。在本章中,本文将基于图所示的车道线识别流程研究设计一种高效、稳定的车道线识别与跟踪算法。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
(1)图像预处理:对原始道路图像进行处理,获得噪声较少的车道线特征图。
(2)车道线特征点提取:从车道线特征图中提取出车道线特征点。
(3)车道线拟合:选取适当的数学模型,根据车道线特征点拟合出车道线。
(4)车道线跟踪:选择合适的跟踪对象并设计相应的跟踪策略,以提高车道线识别的稳定性及准确率。

5.图像预处理

在原始的道路图像中,存在大量无用的信息以及干扰点。对图像进行预处理,可以有效地减少算法需要处理的数据量,同时筛除图像中的大部分噪声,从而起到降低车道线识别算法整体开发难度、提高算法整体运行效率的作用。
图像特征提取是图像预处理的必要环节,它将决定整个车道线识别算法的基本设计思路,故图像预处理工作必须紧密地围绕其来展开。通过对比分析现有特征提取手段的优缺点,本文最终选取基于车道线宽度特征的线性滤波来进行图像特征提取,并围绕其设计了一套图像预处理方法,如图是该方法的工作流程,其中涉及的图像预处理手段依次为图像灰度化、图像特征提取、图像二值化、逆透视变换以及感兴趣区域获取。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

6.车道线边缘检测

车道线边缘检测是车道线识别领域中应用最为广泛的图像特征提取手段。在灰度图像中,灰度值存在显著变化的像素点被称为边缘像素点。通常情况下,车道线与道路交界处的像素点也会发生灰度值的突变,即在车道线的边界处存在属于车道线的边缘像素点。因此,算法可以通过边缘检测来提取图像中属于车道线的边缘像素点,进而根据它们来实现对车道线的识别与定位。
在图像处理领域中,常采用Canny边缘检测算法进行边缘检测。如图,经过边缘检测后,原始图像将转化为如图(b)所示的边缘图像。对比图(a)和(b)可知,在边缘图像中,仅有的物体的边缘像素点得到了保留。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

然而,边缘检测将使图像丢失大量重要的车道线信息,如车道线的几何信息、灰度值信息等。这就导致基于边缘检测开发的车道线识别算法的错检率普遍较高。如图,展示了这类算法在某些常见环境下发生的车道线错检。由图可知,当非车道线边缘与车道线边缘相互平行时,由于缺乏其他信息,算法将无法有效地区分二者,所以算法将很有可能发生错检。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
另外,仅根据车道线的边缘像素点将很难实现对弯道车道线的识别,同时,现有的边缘检测算法检测耗时普遍较长,实时性差,因此本文最终决定不采用边缘检测进行图像特征提取。

7.基于车道线宽度特征的线性滤波

在真实道路图像中,由于车道线像素点之间灰度值相近,而路面上非车道线像素点之间灰度值也相近,且前者的灰度值普遍大于后者,因此对真实道路图像进行线性滤波后,也将获得如图所示的“明-暗”分布效果。
如图,展示了对真实道路图像进行线性滤波后的效果。由图(b)可知,经过滤波后,车道线像素点与路面非车道线像素点在视觉层面上被明显地区分开了,同时车道线的宽度、长度、大致形状等信息也得到了保留。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
另外,基于车道线宽度特征的线性滤波能够排除以下一些干扰源对车道线识别算法带来的干扰。
(1)斑马线等宽度超过车道线的白色标志线。
(2)路面黑色刹车印或水迹等。
(3)路边台阶。
如图,展示了包含上述干扰源的道路图像经过线性滤波后的效果,为了方便观察,本文还对滤波后的图像进行了二值化处理。显然,经过滤波后,大多数前述干扰源的像素点都变“暗”,即被过滤掉了。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

8.逆透视变换

摄像头成像是一个透视过程,它会使地面上相互平行的车道线在图像中相交于一点。逆透视变换的目的就是去除上述透视效应,使图像中相交的车道线重新回到相互平行的状态。当已知摄像头的内外参数时,该博客提出的算法便能够对原始图像进行逆透视变换,并获得逆透视图像。逆透视变换的过程如下:
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
如图展示了本文的二值化特征图经过逆透视变换后的效果。显然,经过逆透视变换后,图中不平行的车道线重新回到了如图所示的相互平行的状态。在后文中,方便起见,本文称经过逆透视变换后的二值化特征图为“逆透视特征图”。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

9.车道线拟合

在基于机器视觉的车道保持辅助系统中,车道线识别与跟踪模块的输出是参数确定的车道线数学模型,而车道偏离预警模块和车道保持控制模块都将根据该模型来获取相应的车路信息,故模型合理、参数精确的车道线数学模型是保证车道线识别与跟踪算法高性能运行的关键。基于此,车道线拟合阶段的工作即是选取适当的车道线数学模型,并利用已搜索到的车道线特征点来确定该模型的各个参数。
在拟合车道线模型时,常用的方法有随机抽样一致性算法和最小二乘算法这两种。随机抽样一致性算法不易受噪声点影响,但其需要进行迭代计算,循环次数多,处理速度慢。最小二乘算法的处理速度较快,但其易受噪声点干扰。在本文中,通过提取得到的车道线特征点中将没有噪声点或只存在极少数的噪声点,故使用最小二乘算法即能获得高精度的模型参数,又能保证算法的运算效率。因此,本文决定采用最小二乘算法来进行车道线模型拟合。
对于一个参数未定的数学模型,最小二乘算法通过最小化该模型与已知数据点的误差平方和来寻找最佳的模型参数。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

求解线性方程组,得到参数a、b和c的确定值,从而完成对二次曲线模型C:x = ay’+by+c的拟合。
如图,是算法对不同类型车道线的拟合结果。由图可知,二次曲线模型已经能够很好的拟合车道线。
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)

10.车道线跟踪

一般地,对于连续相邻多帧的车道线特征图,车道线在图像中的起点、整体位置、大致形状等变化微小。基于上述事实,在车道线识别算法中选取合适的跟踪对象,并设计合理的跟踪策略,将有助于提高算法的识别准确率和成功率,同时降低算法的错检率和漏检率。
本文采取的车道线跟踪策略如下:
(1)利用第k-1帧特征图的车道线起点来指导第k帧特征图的车道线起点的检测。
(2)利用第k-1帧特征图的车道线参数模型来指导第k帧特征图的车道线特征点提取。
(3)若未能从第k帧特征图中成功识别出车道线,则按以下方式进行处理。
a.若第k-1帧的车道线参数模型存在,且其不是从第k-2帧继承而来的,则令第k帧继承第k-1帧的车道线参数模型。其中,“继承”是指直接令某一帧图像的车道线检测结果与另一帧的车道线检测结果相同。
b.若第k-1帧的车道线参数模型存在,且其是从第k-2帧继承而来的,则第k帧不继承第k-1帧的车道线参数模型。
c.若第k-1帧的车道线参数模型不存在,则第k帧的车道线参数模型也不存在。

11.核心代码实现

# Canny检测
def do_canny(frame):
	# 将每一帧转化为灰度图像,去除多余信息
	gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
	# 高斯滤波器,去除噪声,平滑图像
	blur = cv.GaussianBlur(gray,(5,5),0)
	# 边缘检测
	# minVal = 50
	# maxVal = 150
	canny = cv.Canny(blur,50,150)

	return canny

# 图像分割,去除多余线条信息
def do_segment(frame):
	# 获取图像高度(注意CV的坐标系,正方形左上为0点,→和↓分别为x,y正方向)
	height = frame.shape[0]

	# 创建一个三角形的区域,指定三点
	polygons = np.array([
		[(0,height), 
		 (800,height),
		 (380,290)]
		])

	# 创建一个mask,形状与frame相同,全为0值
	mask = np.zeros_like(frame)

	# 对该mask进行填充,做一个掩码
	# 三角形区域为1
	# 其余为0
	cv.fillPoly(mask,polygons,255) 

	# 将frame与mask做与,抠取需要区域
	segment = cv.bitwise_and(frame,mask) 

	return segment

# 车道左右边界标定
def calculate_lines(frame,lines):
	# 建立两个空列表,用于存储左右车道边界坐标
	left = []
	right = []

	# 循环遍历lines
	for line in lines:
		# 将线段信息从二维转化能到一维
		x1,y1,x2,y2 = line.reshape(4)

		# 将一个线性多项式拟合到x和y坐标上,并返回一个描述斜率和y轴截距的系数向量
		parameters = np.polyfit((x1,x2), (y1,y2), 1)
		slope = parameters[0] #斜率 
		y_intercept = parameters[1] #截距

		# 通过斜率大小,可以判断是左边界还是右边界
		# 很明显左边界slope<0(注意cv坐标系不同的)
		# 右边界slope>0
		if slope < 0:
			left.append((slope,y_intercept))
		else:
			right.append((slope,y_intercept))

	# 将所有左边界和右边界做平均,得到一条直线的斜率和截距
	left_avg = np.average(left,axis=0)
	right_avg = np.average(right,axis=0)
	# 将这个截距和斜率值转换为x1,y1,x2,y2
	left_line = calculate_coordinate(frame,parameters=left_avg)
	right_line = calculate_coordinate(frame, parameters=right_avg)

	return np.array([left_line,right_line])

# 将截距与斜率转换为cv空间坐标
def calculate_coordinate(frame,parameters):
	# 获取斜率与截距
	slope, y_intercept = parameters

	# 设置初始y坐标为自顶向下(框架底部)的高度
	# 将最终的y坐标设置为框架底部上方150
	y1 = frame.shape[0]
	y2 = int(y1-150)
	# 根据y1=kx1+b,y2=kx2+b求取x1,x2
	x1 = int((y1-y_intercept)/slope)
	x2 = int((y2-y_intercept)/slope)
	return np.array([x1,y1,x2,y2])

# 可视化车道线
def visualize_lines(frame,lines):
	lines_visualize = np.zeros_like(frame)
	# 检测lines是否为空
	if lines is not None:
		for x1,y1,x2,y2 in lines:
			# 画线
			cv.line(lines_visualize,(x1,y1),(x2,y2),(0,0,255),5)
	return lines_visualize

......

12.系统整合

下图完整源码&环境部署视频教程&自定义UI界面:
基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
参考博客《基于OpenCV的实时车道线分割&车道保持系统(源码&教程)》

13.参考文献


[1]朱思聪,周德龙.角点检测技术综述[J].计算机系统应用.2020,(1).DOI:10.15888/j.cnki.csa.007237.

[2]胡延平,唐叩祝,王乃汉.基于粒子群优化神经网络PID控制的车道保持系统研究[J].北京汽车.2018,(4).DOI:10.14175/j.issn.1002-4581.2018.04.010.

[3]郭克友,王艺伟,郭晓丽.LDA与LSD相结合的车道线分类检测算法[J].计算机工程与应用.2017,(24).DOI:10.3778/j.issn.1002-8331.1606-0116.

[4]陈无畏,谈东奎,汪洪波,等.一类基于轨迹预测的驾驶员方向控制模型[J].机械工程学报.2016,(14).DOI:10.3901/JME.2016.14.106.

[5]曹晴晴,丁志中.基于二自由度的车辆AFS系统建模与仿真[J].电子测量与仪器学报.2014,(4).DOI:10.13382/j.jemi.2014.04.015.

[6]徐瑾,赵又群,阮米庆.基于汽车操纵动力学的神经网络驾驶员模型[J].动力学与控制学报.2008,(4).DOI:10.3969/j.issn.1672-6553.2008.04.018.

[7]伍明,伍俊龙,马帅,等.基于角点灰度分布特征的棋盘格角点检测[J].激光与光电子学进展.2020,(1).DOI:10.3788/LOP57.011204.

[8]王沛然,常连玉.基于改进驾驶员模型的车道保持控制模型[J].中国安全科学学报.2018,(7).DOI:10.16265/j.cnki.issn1003-3033.2018.07.003.

[9]罗莉华.基于MPC的车道保持系统转向控制策略[J].上海交通大学学报.2014,(7).

[10]李海丰,刘景泰.一种优化的消失点估计方法及误差分析[J].自动化学报.2012,(2).DOI:10.3724/SP.J.1004.2012.00213.文章来源地址https://www.toymoban.com/news/detail-447237.html

到了这里,关于基于OpenCV的实时车道线分割&车道保持系统(源码&教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Opencv和Python的车道线检测系统(带UI界面),附演示视频和下载链接

    在自动驾驶中,让汽车保持在车道线内是非常重要的,所以这次我们来说说车道线的检测。我们主要用到的是openCV, numpy, matplotlib几个库。主要包括下面这么几个步骤: 图像加载; 图像预处理:图片灰度化,高斯滤波; Cany边缘检测; 感兴趣区域检测; 霍夫直线检测 ; .直线

    2024年02月04日
    浏览(43)
  • 基于Opencv的人脸&姓名&表情&年龄&种族&性别识别系统(源码&教程)

    性别识别是利用计算机视觉来辨别和分析图像中的人脸性别属性。一直以来,人脸性别识别的发展虽然很迅速但是应用范围目前并不是很广,在身份证识别上的应用是主体应用。伴随的还有视频检索和机器人视觉,它们也是应用的重要领域。所以目前针对人脸性别识别的研究

    2024年02月11日
    浏览(47)
  • 【实战精选】基于OpenCV的果实检测与果径测算系统(源码&教程)

    项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着农业技术的不断发展,果实的检测和测量对于果树种植和果实质量评估变得越来越重要。果实的检测和测量可以提供重要的信息,如果实的数量、大小、形状和颜色等,这些信息对于果树种植者和

    2024年02月05日
    浏览(33)
  • [超详细]基于YOLO&OpenCV的人流量统计监测系统(源码&部署教程)

    [YOLOv7]基于YOLO&Deepsort的人流量统计系统(源码&部署教程)_哔哩哔哩_bilibili (1)获取原始视频帧 (2)利用目标检测器对视频帧中的目标进行检测 (3)将检测到的目标的框中的特征提取出来,该特征包括表观特征(方便特征对比避免ID switch)和运动特征(运动特征方 便卡尔

    2024年02月04日
    浏览(39)
  • 计算机毕业设计:基于python人脸识别考勤系统 OpenCV+Dlib(包含文档+源码+部署教程)

    [毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人 。 Python语言、dlib、OpenCV、Pyqt5界面设计、sqlite3数据库 方法实现、实现步骤 1、实例化人脸检测

    2024年02月04日
    浏览(61)
  • 基于python+pyqt的opencv汽车分割系统

    目录 一、实现和完整UI视频效果展示 主界面: 识别结果界面: 查看分割处理过程图片界面: 二、原理介绍: 加权灰度化 ​编辑 二值化 滤波降噪处理 锐化处理  边缘特征提取 图像分割 完整演示视频: 完整代码链接   图像灰度化的目的是为了简化矩阵,提高运算速度。彩

    2024年02月10日
    浏览(32)
  • 基于OpenCV和改进深度学习网络的香菇分级图像分割系统

    项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 近年来,随着计算机视觉和深度学习的快速发展,图像分割技术在各个领域中得到了广泛应用。图像分割是将图像划分为不同的区域或对象的过程,对于图像理解、目标检测和图像识别等任务具有重要

    2024年02月03日
    浏览(44)
  • python基于opencv的车道线检测左右转弯原理详解

    给定一组棋盘图像计算相机校准矩阵和畸变系数。 对原始图像应用失真校正。 使用颜色变换、渐变等来创建阈值二值图像。 应用透视变换来校正二进制图像(“鸟瞰图”)。 检测车道像素并拟合以找到车道边界。 确认检测到的线与现实和之前的线一致,即它们具有相似的

    2024年02月03日
    浏览(41)
  • 基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(五)

    本项目依赖于Keras深度学习模型,旨在对手语进行分类和实时识别。为了实现这一目标,项目结合了OpenCV库的相关算法,用于捕捉手部的位置,从而能够对视频流和图像中的手语进行实时识别。 首先,项目使用OpenCV库中的算法来捕捉视频流或图像中的手部位置。这可以涉及到

    2024年02月07日
    浏览(40)
  • 基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(一)

    本项目依赖于Keras深度学习模型,旨在对手语进行分类和实时识别。为了实现这一目标,项目结合了OpenCV库的相关算法,用于捕捉手部的位置,从而能够对视频流和图像中的手语进行实时识别。 首先,项目使用OpenCV库中的算法来捕捉视频流或图像中的手部位置。这可以涉及到

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包