基于OpenCV的视频道路车道检测

  • 基于OpenCV的视频道路车道检测
    • 前言
    • 综述
    • 运行方法
    • 车道检测的实现
      • 路面图像二值化
      • 基于透视变换提取车道区域
      • 基于二次多项式拟合车道线
      • 计算曲率半径与车辆的偏移距离
      • 用车道区域标注原始图像
    • 总结
    • End.

基于OpenCV的视频道路车道检测

前言

本篇博客作为博主对数字图像处理课程设计的总结,如果对某些内容有疑问,欢迎大家在评论区进行讨论,不吝赐教。

综述

据统计近年来将近一半的交通事故与车辆行驶偏离正常车道有关。驾驶员注意力不集中或者疲劳驾驶,导致车辆无意识的偏离是交通事故的主要原因,由此汽车驾驶过程中车道偏离的自动检测也成为业界研究热点。

基于以上的实际需要,本设计完成了一种基于视频道路的车道检测方法,用于对车道的信息进行检测。主要研究内容如下:

  1. 利用颜色空间变换、Sobel算子创建阈值化二值图像,检测出的目标线可能是车道线的一部分;
  2. 应用透视变换校正二值图像,获得车道的鸟瞰图,裁剪原始图像中最有可能具有车道线像素的区域;
  3. 基于二次多项式对车道线进行拟合,确定车道边界;
  4. 确定车道曲率和车辆相对于中心的位置,使用从透视变换计算出的逆矩阵对原始图像进行覆盖;
  5. 向原始图像添加文本以显示车道线的曲率半径和车辆偏移距离。

运行方法

python line_fit_video.py

下面是项目文件的功能说明,项目文件博主会在稍后上传至GitHub与码云。

Input_Video.mp4 - 输入视频
Output_Video.mp4 - 输出视频
combined_thresh.py - 路面图像二值化实现
perspective_transform.py - 透视变换实现
line_fit.py - 基于二次多项式拟合车道线及曲率半径、车辆偏移距离实现
line_fit_video.py - 主文件

车道检测的实现

路面图像二值化

创建一个阈值化的二值图像,将未失真的图像作为输入。目标是识别可能是车道线一部分的像素。特别是执行以下操作:

  1. 应用以下带阈值的过滤器,以创建对应于每个单独过滤器的独立二进制图像:
    图像上的绝对水平Sobel算子;
    Sobel算子在水平和垂直方向,并计算其大小;
    Sobel算子计算梯度的方向;
  2. 把图像从RGB空间转换到HLS空间,阈值化S通道;
  3. 将上述二进制图像合并,创建最终的二进制图像。

下图所示便是利用多个过滤器的Sobel算子来对图像进行二值化处理的最终结果。

图一表示绝对水平Sobel算子过滤器相对应的二值图像
图二表示水平方向和垂直方向的Sobel算子过滤器相对应的二值图像
图三表示梯度方向的Sobel算子过滤器相对应的二值图像
图四表示HLS空间且对S通道设置阈值的过滤器相对应的二值图像
图五表示原图像
图六表示结合以上的二值图像创建的最终的二值图像

基于透视变换提取车道区域

给定阈值的二值图像,下一步是执行透视变换。目标是转换图像,使我们获得车道的鸟瞰图,这使我们能够将曲线拟合到车道线【例如多项式拟合】。同时裁剪原始图像中最有可能有车道线像素的区域。

为了完成透视变换,使用OpenCVgetPerspectiveTransform()warpPerspective()函数。同时对透视变换的源点和目标点进行了硬编码。源点和目的点通过人工检查直观地确定。

下图所示便是透视变换后的图像与透视空间逆变换后的图像。

基于二次多项式拟合车道线

给定上一步变换后的二进制图像,现在为左右车道线拟合一个二阶多项式。

计算图像下半部分的直方图,将图像分成9个水平切片,从底部开始,在直方图的左峰和右峰周围围起一个200像素宽的窗口【将直方图垂直拆分为两半】,在水平窗口切片上查找可能是左车道和右车道一部分的像素,像素最多的位置作为车道线的起始位置,然后自定义窗口大小和个数向上做滑窗操作,滑动窗口自下往上计算在滑动窗口中的投影值, 取投影值最大的列和滑动窗口底边所在的行作为透视空间中的车道线坐标点,求出每个窗口中像素点的x和y坐标作为车道线的x,y坐标,当前窗口像素的平均x坐标作为下一个滑窗的中心位置。给定左车道线和右车道线候选像素,利用滑动窗口和车道线的坐标用cv2.fitpoly()函数拟合二阶多项式,表示估计的左车道线和右车道线。

滑窗的方法通常用于第一帧或者检测失败重新开始的检测方式,对计算资源浪费过多,检测时间长。由于连续帧图像之间相差不大,之后几帧的图像可以只对第一帧拟合的曲线周围检测,设置周围的margin,然后在该范围内寻找下一帧曲线的像素点从而拟合曲线。在最后处理每一帧图像时要设置标志位检测是否检测到拟合的曲线,检测到的话用tune_fit()方法,否则的话要用滑窗的方法重新寻找车道线。

由于我们的目标是从视频流中找到车道线,所以我们可以利用视频帧之间的时间相关性。给定从先前视频帧计算的多项式拟合,实现的方法是从先前预测的车道线水平搜索+ / -100像素。然后我们只需对快速搜索中找到的像素执行二阶多项式拟合。如果我们找不到足够的像素,我们可以返回一个错误【例如return None】,并且函数的调用方将忽略当前帧(即保持车道线不变),并确保在下一帧上执行完全搜索。总的来说,这将提高车道检测的速度。利用时间相关性的另一个好处是平滑多项式拟合参数,这样做的好处是使检测器对噪声输入更为鲁棒。对于最近的5个视频帧,使用了多项式系数的简单移动。

下图所示便是利用滑动窗口检测车道线的位置与二次多项式拟合后的左右车道线。

计算曲率半径与车辆的偏移距离

给出了左车道线和右车道线的多项式拟合,根据这里给出的公式计算每条线的曲率半径。将距离单位从像素转换为米,假设垂直方向每720像素30米,水平方向每700像素3.7米。最后平均左右车道线的曲率半径,并在最后的视频标注曲率半径值。

从给定的左车道线和右车道线拟合的多项式中计算出车辆的偏移量。车辆中心的偏移量在最后进行了注释。在把像素转换成米时利用同样的假设。为了计算车辆与车道线中心的偏移量,假设车辆的中心是图像的中心,计算左车道线底部x值和右车道线底部x值的平均值作为车道的中心。偏移量就是车辆的中心x值【即图像的中心x值】减去车道的中心x值。

用车道区域标注原始图像

给定以上所有内容,我们可以用车道面积以及关于车道曲率和车辆偏移的信息来注释原始图像。

  1. 创建一个空白图像,并绘制我们的拟合线【估计左右车道线】;
  2. 填充线条之间的区域【绿色】;
  3. 使用从透视变换计算的逆变换矩阵来取消上面的透视变换效果,使其与原始图像的透视对齐;
  4. 在原始图像上覆盖上述信息;
  5. 向原始图像添加文本以显示车道曲率和车辆偏移。

总结

本设计基于OpenCV实现了对视频道路的车道检测。基于HLS颜色空间和 Sobel边缘提取方法设置一定的阈值范围来对图像其进行有效分割,检测车道线的大概位置,接着基于透视变换在透视变换空间中提取车道线的坐标点,并用二次多项式拟合车道线,从给定的左车道线和右车道线拟合的多项式中计算出左右车道线的曲率半径、车辆的偏移量,并在原始图像上面对这些信息进行标注,有效地实现了对于车道的检测,鲁棒性较好。但是仍然存在着不足之处:当在有裂缝的道路上进行检测时,裂缝可能被误认为是车道线导致检测失误;前面的其他车辆也有可能诱使车道检测认为它是车道的一部分,导致检测失败。为了使车道检测系统鲁棒性更佳,我们可以结合深度学习中语义分割的方法对以上的问题进行解决,语义分割是在像素级别上的分类,属于同一类的像素都要被归为一类,因此语义分割是从像素级别来理解图像的,例如基于深度学习的语义分割来查找可能是车道的像素。

End.

项目地址:https://gitee.com/Ginomica/lane_detection

基于OpenCV的视频道路车道检测相关推荐

  1. python 视频人脸替换_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  2. python视频人脸检测_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  3. 基于OpenCV的视频处理 - 人脸检测

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.2.7 Las ...

  4. Python基于OpenCV实现视频的人脸检测

    前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt ...

  5. 基于OpenCV的视频场景切割神器

    环境 windows 10 64bit anaconda with python 3.7 pyscenedetect 0.5.5 简介 了解视频剪辑的小伙伴,应该都知道转场这个词.一个视频场景转换到另 ...

  6. Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)

    1.背景 指针式机械表盘具有安装维护方便.结构简单.防电磁干扰等诸多优点, 目前广泛应用于工矿企业.能源及计量等部门.随着仪表数量的增加及精密仪表技术的发展,人工判读已经不能满足实际应用需求.随着计算 ...

  7. Python基于Opencv的鱼群密度速度检测系统(源码&教程)

    1.研究背景 智慧渔业是大数据.物联网与人工智能等现代信息技术驱动下的渔业发展新模式,是水产养殖业供给侧结构性改革的重要方式,涉及养殖环境监测.生物环境监测与生物状态监测这几大方面的应用与需求.本文从 ...

  8. 调用笔记本的摄像头实现基于opencv的视频人脸识别(中文显示和英文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决

    @人脸识别代码和一些常见错误 基于opencv的视频人脸识别(中文显示)以及 index 480 is out of bounds for axis 0 with size 480错误的解决 参考了 ...

  9. 基于OpenCV的视频人物查找及剪辑*

    基于OpenCV的视频人物查找及剪辑 摘要:本项目是基于OpenCV的人脸识别技术,将一个完整的视频中自己想要了解的某个具体的人物片段,通过将视频分割成帧并且训练需要提取人物的面部特征,通过主成分分析 ...

最新文章

  1. 第二节 线程启动、结束、创建线程多个方法、join()、detach()
  2. 5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录...
  3. [转]分布式文件系统 MogileFS 安装手册
  4. 【读书笔记】 网页关闭确认框
  5. 神经网络训练中,错误数据集对模型结果的影响有多大
  6. spring - -
  7. uploader什么意思_【已解决】请问下uploader上传失败是什么原因
  8. 5.1.4 SELECT+RIGHT JOIN读取数据
  9. Vue Cli 3.x项目如何部署到IIS子站点下
  10. myelclipse Servers视图报错
  11. 2008.05.21 下午茶in萨贝尔
  12. linux下printf函数为什么不加\n就不能输出相关的内容 ?
  13. Ubuntu下安装VirtualBox和Android 安装到虚拟机中
  14. 单链表的逆置-C++实现(ok)
  15. Beego 使用笔记
  16. vs2010 中文版发布及下载地址
  17. 解决phpmyadmin加载慢问题
  18. Unity给小鳄鱼洗澡2D流体水实现
  19. 39岁了,我依然要谈梦想
  20. Navicat Premium 15 for Mac(数据库管理)

热门文章

  1. 股份制公司怎么分配股权
  2. 信息不对称状态下的动态零和博弈
  3. 钓鱼网站也在使用https加密,如何识别钓鱼网站?
  4. 怎么办理软件产品登记测试报告,软件产品登记有什么用
  5. # ldaps 与 ldap over TLS 的区别
  6. UGUI-- Text文本控件
  7. 仿UC头条首页-html+css+纯JS
  8. mysql查询一个经纬度一定范围内的数据
  9. 四川大学通报:现场挡获一男生在女卫生间偷拍!开除学籍!
  10. Web实现:装饰边框添加阴影