当前位置: 首页 > news >正文

深度学习与图像处理 | 基于传统图像处理的自动驾驶车道线检测

阐述了基于OpenCV的传统图像处理算法在车道线检测技术中的应用。

本节将使用传统图像处理算法检测车道线,然后根据车道线方向逐帧调整小车运行状态。这个过程涉及两个方面:感知和动作规划。感知部分主要通过车道线检测来实现,动作规划则通过操控转向角度来实现。车道线检测的目的就是希望能够根据检测到的车道线位置来计算最终应该转向的角度,从而控制小车始终行驶在当前车道线内。

由于道路环境比较简单,可以进一步简化控制变量。对于油门值,可以在运行时保持低匀速,这样只需要控制转向角度即可,实现起来更加容易。这种模式类似于现实生活中在驾驶汽车时开启了定速巡航功能。

下面针对模拟环境采集到的图像,进行算法分析。

01、基于HSV空间的特定颜色区域提取

从仿真平台捕获的图像上进行分析,小车左侧是黄实线,右侧是白实线。最终目标是希望小车一直运行在这两条车道线中间。因此,首先要提取出这两条线才能定性分析出它们的斜率,从而为小车转向角度提供依据。具体的,可以通过颜色空间变换来提取车道线区域。为了方便将黄色线和白色线从图像中提取出来,可以将图像从RGB空间转换到HSV空间再处理。这里首先解释下RGB和HSV颜色空间的区别。

RGB是平时接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R)、绿色(G)和蓝色(B)。RGB颜色空间是图像处理中最基本、最常用的颜色空间,其利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,但是这三个分量是高度相关的,想对图像的颜色进行调整需要同时更改这三个分量才行。在图像处理领域,针对特定颜色提取问题,使用较多的是HSV颜色空间,它比RGB空间更接近人类对色彩的感知经验,可以非常直观地表达色彩的色调、鲜艳程度和明暗程度,方便进行颜色的对比。

HSV表达彩色图像的方式由三个部分组成:色调(Hue)、饱和度(Saturation)、明度(Value)。其中色调用角度度量表示,取值范围为0~360,不同角度代表不同的色彩信息,即所处的光谱颜色的位置。

如果想要提取出黄色线,可以将色调范围控制在30~90。注意,在OpenCV中色调取值范围是[0~180],因此上述黄色范围需要缩小1倍,即[15~45]。检测白色车道线也是采用类似的原理。读者可以自行查找色调表来找到特定颜色的色调范围。

具体实现代码如下(opencv_drive/img_analysis.py):

import cv2
import numpy as np
import math
#----------------------1.基于HSV空间的特定颜色区域提取------------------
# 读取图像并转换到HSV空间
frame = cv2.imread('test.jpg')
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 黄色线检测
lower_blue = np.array([15, 40, 40])
upper_blue = np.array([45, 255, 255])
yellow_mask = cv2.inRange(hsv, lower_blue, upper_blue)
cv2.imwrite('yellow_mask.jpg', yellow_mask)
# 白色线检测
lower_blue = np.array([0, 0, 200])
upper_blue = np.array([180, 30, 255])
white_mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 保存中间结果
cv2.imwrite('yellow_mask.jpg', yellow_mask)
cv2.imwrite('white_mask.jpg', white_mask)

上述代码首先将图像从BGR空间转换到了HSV空间,然后使用cv2.inRange()函数提取特定颜色范围内的图像区域。

特定颜色区域提取效果如图1.37所示。

■  特定颜色区域提取(从左至右:原图、白色提取区域、黄色提取区域)

02、基于高斯模糊的噪声滤除

观察前面的颜色区域提取效果,会发现有不少的离散噪声点,这些噪声会对后面的计算造成干扰,因此可以先提前用滤波算法处理一下。这里可以使用1.3节中介绍过的高斯模糊来消除这些高频噪声,具体可以通过OpenCV提供的现成的高斯模糊函数cv2.GaussianBlur()来实现。

http://www.dtcms.com/a/269567.html

相关文章:

  • XSLT注入与安全修复方法
  • 【快手】数据挖掘面试题0002:求某地铁站每日客流量,乘地铁经过、进出站人都包括在内
  • C#随机数生成全面详解:从基础到高级应用
  • 【ROS2 自动驾驶学习】03-ROS2常用命令
  • 网络安全护网实战:攻击手段解析与防御策略
  • 基于odoo17的设计模式详解---工厂模式
  • 阿里云mysql数据丢失,如何通过服务器备份在其他服务器上恢复数据,并获取mysql丢失数据,完成mysql数据恢复
  • Prompt Injection Attack to Tool Selection in LLM Agents
  • 深度剖析:向70岁老系统植入通信芯片——MCP注入构建未来级分布式通信
  • IP 能ping通,服务器是否开机?
  • Go语言反射机制详解
  • 基于ZYNQ7000的AD9226采集卡实现(3、PS LINUX DMA驱动实现)
  • vue3 el-table 行数据沾满格自动换行
  • 【debug】git clone 报错
  • Web前端: :is(通用选择器)
  • 图像轮廓检测与绘制:OpenCV 实战指南
  • claude code-- 基于Claude 4 模型的智能编程工具,重塑你的编程体验
  • 微软上线Deep Research:OpenAI同款智能体,o3+必应双王炸
  • Web后端开发-Mybatis
  • 玩转Docker | 使用Docker部署NotepadMX笔记应用程序
  • UDP的socket编程
  • unity 模型UV重叠问题相关(重新整理)
  • BUUCTF在线评测-练习场-WebCTF习题[GXYCTF2019]BabySQli1-flag获取、解析
  • 无法访问宝塔面板 - 特网科技
  • Coze智能体平台全景解析:从零构建企业级AI应用的实战指南
  • Spring Boot 企业项目技术选型
  • UI前端大数据可视化实战策略:如何设计符合用户认知的数据展示方式?
  • 京东携手HarmonyOS SDK首发家电AR高精摆放功能
  • 开发在线商店:基于Vue2+ElementUI的电商平台前端实践
  • 二刷(李宏毅深度学习,醍醐灌顶,长刷长爽)