基于Opencv的车距检测系统(源码&教程)
由于图床过期,图片无法正常显示,有图阅览请移步以下Gitee/Github网址,文末获取【源码和部署教程】或者通过以下Gitee/Github的文末邮件获取
Gitee(推荐国内访问): https://gitee.com/qunmasj/projects
Github(推荐国外访问): https://github.com/qunshansj?tab=repositories
# 1.研究背景
对本车前方车辆的识别及距离检测是计算机视觉技术在智能网联汽车中的一个重要内容。要想在错综繁杂的交通环境中实现无人驾驶,对行车环境中其他车辆信息的获取是十分重要的。因此,对本车前方车辆的识别及距离检测是智能网联汽车研发和应用过程中必不可少的一个重要技术基础。该系统主要通过摄像头采集前方的道路环境,识别出前方行车环境中的车辆并计算出本车与前方车辆的距离,并将识别结果和测距结果显示在屏幕上,能警示驾驶员及时调整好车速,能够有效避免碰撞事故的发生,减轻车祸中人员伤亡情况和带来的经济财产损失。另外,对本车前方车辆的识别及距离检测也是自动驾驶技术的一个重要技术基础,对其的研究有助于传统汽车产业的变革创新,有助于自动驾驶技术的完善,有助于推动智能网联汽车产业化进程,有助于我国建立成为一个智能网联汽车强国。
2.图片演示
3.视频演示
基于Opencv的车距检测系统(源码&教程)_哔哩哔哩_bilibili
4.系统原理图
5.车辆识别分类器的设计
Adaboost 级联分类器
在对输入的图像通过积分图计算出多个矩形特征值之后,应用Adaboost算法从中选择出组合到一块可以更好的区分出车辆和非车辆的矩形特征。采用该博客提出的的训练算法是应用Adaboost的。Adaboost是一种迭代算法,其主要原理是将针对一个训练集训练出来不同的弱分类器级联起来形成一个更强的最终分类器。其具体的算法流程图如图所示,总的来说,整个Adaboost迭代算法可分为3步:
1、对将要进行训练的数据的权值进行初始化。假设样本总数为n,那么1/n便为每一个样本的权值。
2、训练弱分类器。在训练的过程中,每个样本点在下一个训练集的权值的变化与该样本是否被正确分类息息相关,若分类准确,则该样本点在下一个训练集的权值就会减小,最后将权值变化后的样本作为训练新的一个分类器的数据,如此迭代直到训练结束。
3、级联各个若分类器形成一个更强的最终分类器。训练结束以后,将得到的分类误差率相对较小的弱分类器的权值增大,以升高该分类器在最终分类器所占的比重。这样最终分类器的分类准确性才会相对提高。
代码实现
1 | class DecisionTreeClassifierWithWeight: |
6.OpenCV 中分类器的训练
将训练用的正负样本图像进行预处理
收集完正负样本之后,需要调用OpenCV的相关函数对样本图片进行归一化处理,将所有的正样本图像调整为20*20(OpenCV推荐训练样本的最佳尺寸是(20x20),对于负样本没有样本尺寸要求,只要不小于正样本的大小即可;对样本图像,除了归一化处理之外还需对所有样本图片其进行灰度化,以减少训练时占用的内存空间。应用OpenCV进行图像处理时,若只对一幅图片做归一化和灰度化处理其实会很简单,只需读入一张图片再调用相关函数即可。但正负样本两个文件夹,里面存着成百上千张文件名不规则的图片,关键在于如何一次性对文件夹里的所有无规律排列的图片进行图像处理。
本文在采用该博客提出的FindFile()函数,编程设计了一个小程序实现使用OpenCV批量处理图像,使某一个文件夹内全部图像一次性进行归一化和灰度化处理。下图为批量处理文件的算法流程图。
代码实现
1 | #!/usr/bin/perl |
7.车辆测距
将摄像头安装在试验车后视镜位置上,固定校对好拍摄角度,获取实验车前方的道路信息。为了计算实验车辆与目标车辆的距离,建立如图所示的车距检测模型示意图。
由图可以看出,在物坐标系中,点A为摄像头所在位置,点B是摄像头垂直方向与地面的交点,所以h表示摄像头安装位置距离地面的高度;点C和点D分别表示摄像头采集画面的最下边缘和最上边缘与地面的交点,所以长度α为摄像头采集画面的最下边缘与地面的交点C和摄像头垂直方向与地面的交点B之间的距离;实验车身前端垂直方向与地面的交点记为E,所以a为摄像头下视野与摄像头垂直方向的夹角,长度b为摄像头垂直方向与地面的交点B与实验车身前端垂直方向与地面的交点E之间的距离;
摄像头光轴所在直线与地面的交点记为О,前方目标车辆的位置记为P,所以角﹖是摄像头光轴所在直线与目标车辆和摄像头连线之间的夹角,长度c表示目标车辆所在位置与地面的交点Р和摄像头垂直方向与地面的交点B的距离,β为摄像头下视野与摄像头光轴所在方向的夹角,长度L为需要计算的实验车辆与目标车辆之间的距离。
根据成像的原理,摄像头拍摄图像的成像平面中,其中ST 的长度为图像的总高度d,可由摄像头的分辨率得到。点O既是像素坐标系中平面图像的中心点,又是图像坐标系的原点。由焦距的定义可得,点Ot到摄像头所在位置点A之间的距离即为相机的焦距f。又因为AO.是ST的中垂线,M、N分别为摄像机上下视野上的点,令MN垂直AO,可得AO也是MN的中垂线。P’是目标车辆在像坐标系的成像位置,点Q是P’的x轴方向延长线与像坐标系y轴的交点,所以QOt的长度为P’的y坐标减去O的y坐标,即 Py ‘-yt。本文中要计算的实验车辆与目标车辆之间的距离为:
参数b可以在实验之前测量出来,所以只要计算出表示目标车辆所在位置与地面的交点Р和摄像头垂直方向与地面的交点B的距离c就可以得到实验车辆与目标车辆之间的距离L。
可知图像坐标系和像素坐标系都在成像平面上,但是两个坐标系的原点和坐标系的度量单位均不相同。要想计算出距离L,就要先将公式中的图像坐标Py’和y,的物理单位(mm)转换为像素坐标中像素点对应的像素(pixel)单位。转换过程中,lpixel = dx mm。
代码实现
1 | #!usr/bin/python |
8.系统整合
9.参考文献
[1]中国汽车工业协会.2018年中国汽车产销量情况分析及行业发展趋势预测[EB/OL].
http://www.chyxx.com/industry/201807/662384.htm, 2018-07-25.
[2]张懿,刘焰.大数据时代下的智能网联汽车发展研究[J.江苏科技信息, 2016,(24):
7-9.
[3]郁捷安.智能网联汽车解读[J.时代汽车, 2019,(O1): 184-187.[4]智车科技.中国智能网联汽车产业发展报告[EB/OL].
http://www.elecfans.com/d/832963.html, 2018-12-17.
[5]李克强,王跃建,高峰,张磊.基于ITS技术的汽车驾驶安全辅助系统[C].2006中国
汽车安全技术国际研讨会, 2006:32-35.
[6]白侏,周艮.汽车雷达应用系统的行人标准物标及其雷达截面测量[J].汽车安全与
节能学报, 2013,(3): 223-227.
[7]镜头观察.车载摄像头市场现状及趋势[EB/OL].
https://www.sohu.com/a/234390687_100182354,2018-06-07.
[8]刘赟,周爽.人工智能与计算机视觉产业发展[J.现代商业, 2017,(24): 20-21.[9]陆志伟,王明革,赵瑞海.计算机视觉技术的研究与应用[J].数字技术与应用,
2016,(03): 109.
[10]陈丹.计算机视觉技术的发展及应用[J].电脑知识与技术, 2008,(35): 2449-2452.[11]周欣.汽车辅助驾驶系统中的计算机视觉技术[D].重庆:重庆大学, 2000.
[12]孙冰.“百度大脑”思考无人车的未来[J.中国经济周刊, 2016(37): 64-65.
[13]廖传锦,秦小虎,黄席樾.以人为中心的汽车主动安全技术综述[J.计算机仿真,
2004,21(9):152-156.
[14]Zelinsky A. Learning OpenCV-Computer Vision with the OpenCV Library[J]. Robotics
and Automation Magazine,IEEE.2009,16(3): 100-101.
[15]陈胜勇,刘盛.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社, 2008.
[16]陈胜勇,刘盛等.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社,2008.
[17]刘瑞祯,于仕棋. OpenCV教程[M].北京:北京航空航天出版社, 2007.