使用 OpenCV 和 Python 进行车道检测和物体检测(YOLO)

本项目旨在开发一个集车道检测与物体检测功能于一体的智能视觉分析系统,利用先进的计算机视觉技术和深度学习模型,实现实时的道路场景理解和目标识别。系统主要依托OpenCV这一强大的计算机视觉库,以及Python作为编程语言,融合了车道检测算法和YOLO(You Only Look Once)物体检测算法,以期达到高效、精准的视觉分析效果。

1. 车道检测

车道检测部分主要采用基于图像处理的技术,具体步骤包括:

  • 预处理:对输入的图像进行灰度化、高斯模糊、Canny边缘检测等操作,以增强图像的对比度和减少噪声干扰。

  • 兴趣区域提取:通过多边形掩模,只保留包含车道线的区域,忽略无关背景。

  • 霍夫变换:利用霍夫直线变换检测车道线,将边缘图像转换到参数空间,寻找直线的参数。

  • 后处理:对检测到的车道线进行拟合和平滑,确保车道线的连续性和准确性。

2. 物体检测(YOLO)

YOLO算法是一种实时的目标检测框架,其核心特点是在一次前向传播中同时预测物体的位置和类别,大幅提高了检测速度。本项目中,我们采用YOLOv4或YOLOv5作为基础模型,针对特定场景进行微调和优化,以提高检测精度和泛化能力。

实现流程

  1. 数据准备:收集大量的道路场景图像和视频,包括不同天气、光照条件下的样本,进行标注,构建训练数据集。

  2. 模型训练:使用标注好的数据集,训练车道检测模型和YOLO模型,调整超参数,优化模型性能。

  3. 系统集成:将车道检测和物体检测两个子系统整合到一起,设计合理的输入输出接口,确保两者的无缝协作。

  4. 测试与评估:在多种场景下测试系统性能,包括但不限于城市街道、高速公路、夜间环境等,评估检测精度、实时性和稳定性。

  5. 部署与优化:根据实际应用需求,将系统部署到目标平台,如自动驾驶车辆、监控系统等,并持续收集反馈,进行迭代优化。

应用前景

本项目成果可广泛应用于智能交通、自动驾驶、安防监控等领域,为实现更加安全、高效的交通系统提供技术支持。例如,在自动驾驶车辆中,车道检测与物体检测的结合可以帮助车辆实时理解周围环境,做出准确的决策;在城市监控系统中,则能辅助警察和安保人员快速识别异常情况,提升公共安全水平。

结语

通过融合车道检测与物体检测两大核心技术,本项目致力于打造一个全面、智能的视觉分析系统,推动计算机视觉技术在实际应用中的创新与发展。

关键代码部分

import numpy as np
import cv2
from utils import *
import os
import time
import argparseparser = argparse.ArgumentParser()
parser.add_argument('--model_cfg', type = str, default = '',help = 'Path to config file')
parser.add_argument('--model_weights', type=str,default='',help='path to weights of model')
parser.add_argument('--video', type=str, default='',help='path to video file')
parser.add_argument('--src', type=int, default=0,help='source of the camera')
parser.add_argument('--output_dir', type=str, default='',help='path to the output directory')
args = parser.parse_args()# print the arguments
print('----- info -----')
print('[i] The config file: ', args.model_cfg)
print('[i] The weights of model file: ', args.model_weights)
print('[i] Path to video file: ', args.video)
print('###########################################################\n')
frameWidth= 640
frameHeight = 480net = cv2.dnn.readNet(args.model_weights, args.model_cfg)
classes = []
with open("coco.names", "r") as f:classes = [line.strip() for line in f.readlines()] # we put the names in to an arraylayers_names = net.getLayerNames()
output_layers = [layers_names[i[0] -1] for i in net.getUnconnectedOutLayers()]
colors = np.random.uniform(0, 255, size = (len(classes), 3))font = cv2.FONT_HERSHEY_PLAIN
frame_id = 0
cameraFeed= False
#videoPath = 'road_car_view.mp4'
cameraNo= 1
#frameWidth= 640
#frameHeight = 480if cameraFeed:intialTracbarVals = [24,55,12,100] #  #wT,hT,wB,hB
else:intialTracbarVals = [42,63,14,87]   #wT,hT,wB,hBoutput_file = ''
if cameraFeed:cap = cv2.VideoCapture(cameraNo)cap.set(3, frameWidth)cap.set(4, frameHeight)
else:cap = cv2.VideoCapture(args.video)output_file = args.video[:-4].rsplit('/')[-1] + '_Detection.avi'
count=0
noOfArrayValues =10
#global arrayCurve, arrayCounter
arrayCounter=0
arrayCurve = np.zeros([noOfArrayValues])
myVals=[]
initializeTrackbars(intialTracbarVals)#fourcc = cv2.VideoWriter_fourcc(*'XVID')
#video_writer = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))
video_writer = cv2.VideoWriter('output2.avi', cv2.VideoWriter_fourcc(*'XVID'), cap.get(cv2.CAP_PROP_FPS), (2 * frameWidth,frameHeight))
starting_time = time.time()
while True:success, img = cap.read()if not success:print('[i] ==> Done processing!!!')print('[i] ==> Output file is stored at', os.path.join(args.output_dir, output_file))cv2.waitKey(1000)break#img = cv2.imread('test3.jpg')if cameraFeed== False:img = cv2.resize(img, (frameWidth, frameHeight), None)imgWarpPoints = img.copy()imgFinal = img.copy()imgCanny = img.copy()imgUndis = undistort(img)imgThres,imgCanny,imgColor = thresholding(imgUndis)src = valTrackbars()imgWarp = perspective_warp(imgThres, dst_size=(frameWidth, frameHeight), src=src)imgWarpPoints = drawPoints(imgWarpPoints, src)imgSliding, curves, lanes, ploty = sliding_window(imgWarp, draw_windows=True)try:curverad =get_curve(imgFinal, curves[0], curves[1])lane_curve = np.mean([curverad[0], curverad[1]])imgFinal = draw_lanes(img, curves[0], curves[1],frameWidth,frameHeight,src=src)# AveragecurrentCurve = lane_curve // 50if  int(np.sum(arrayCurve)) == 0:averageCurve = currentCurveelse:averageCurve = np.sum(arrayCurve) // arrayCurve.shape[0]if abs(averageCurve-currentCurve) >200: arrayCurve[arrayCounter] = averageCurveelse :arrayCurve[arrayCounter] = currentCurvearrayCounter +=1if arrayCounter >=noOfArrayValues : arrayCounter=0cv2.putText(imgFinal, str(int(averageCurve)), (frameWidth//2-70, 70), cv2.FONT_HERSHEY_DUPLEX, 1.75, (0, 0, 255), 2, cv2.LINE_AA)except:lane_curve=00passimgFinal= drawLines(imgFinal,lane_curve)# Object detection success, frame = cap.read()frame = cv2.resize(frame, (frameWidth, frameHeight), None)frame_id += 1height, width, channels = frame.shape# Detect imageblob = cv2.dnn.blobFromImage(frame, 0.00392, (320, 320), (0,0,0), swapRB = True, crop = False)net.setInput(blob)start = time.time()outs = net.forward(output_layers)# Showing informations on the screenclass_ids = []confidences = []boxes = []for out in outs:for detection in out:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:#Object detectedcenter_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)# Rectangle coordinatesx = int(center_x - w / 2)y = int(center_y -h / 2)#cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0))boxes.append([x, y, w, h])confidences.append(float(confidence))# Name of the objectclass_ids.append(class_id)indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3)for i in range(len(boxes)):if i in indexes:x, y, w, h = boxes[i]label = "{}: {:.2f}%".format(classes[class_ids[i]], confidences[i]*100)color = colors[i]cv2.rectangle(frame, (x,y), (x+w, y+h), color, 2)cv2.putText(frame, label, (x,y+10), font, 2, color, 2)elapsed_time = time.time() - starting_timefps = frame_id / elapsed_timecv2.putText(frame, "FPS:" + str(fps), (10,30), font, 2, (0, 0, 0), 1)imgBlank = np.zeros_like(img)imgStacked = stackImages(0.7, ([imgUndis,frame],[imgColor, imgCanny],[imgWarp,imgSliding]))#final_frame = cv2.hconcat((frame,imgCanny))#video_writer.write(final_frame)#cv2.imshow('frame',final_frame)cv2.imshow("Image", frame)cv2.imshow("PipeLine",imgStacked)cv2.imshow("Result", imgFinal)

识别道路边界的过程,即道路检测管道,主要包括以下步骤:

  1. 相机校准矩阵计算:首先,使用OpenCV库中的cv2.findChessboardCorners()函数计算相机的校准矩阵,以消除由镜头产生的畸变。这一校准步骤确保了车道检测算法能够适应不同类型的相机,提高算法的通用性。校准后,将校准矩阵应用于原始图像,进行畸变校正。

  2. 图像边缘检测与阈值处理:接着,通过一组基于梯度和颜色的阈值处理技术,使用cv2.Sobelcv2.cvtColor函数检测图像中的边缘,生成二值化的边缘图像。这一步骤有助于突出图像中的车道线条,为后续的车道边界识别奠定基础。

  3. 透视变换:为了更方便地提取车道边界,接下来会对处理后的图像进行透视变换,将其转换为鸟瞰视角。这种变换使得车道边界在图像中呈现出更为直观和易于识别的形式。

  4. 车道像素扫描与拟合:在鸟瞰图的基础上,系统会扫描整个图像,寻找属于车道边界的像素点。找到足够的像素点后,通过曲线拟合算法将它们拟合成车道边界。之后,再将检测到的车道边界反向映射回原始图像中,实现车道的可视化标识。

  5. 道路属性估算:最后,系统还会估算一些重要的道路属性,比如道路的曲率以及车辆在车道内的相对位置。这些信息对于自动驾驶车辆来说至关重要,能够帮助车辆更好地理解自身在道路上的位置和方向。

整个过程的快照可以这样描述:从原始图像开始,经过一系列精心设计的图像处理步骤,最终在图像中标记出清晰的车道边界,并提供关于道路状况的关键信息。这一系列操作构成了一个高效、准确的道路边界识别系统,是实现自动驾驶和智能交通系统的重要组成部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL索引教程(01):创建索引

文章目录 MySQL 创建索引索引介绍MySQL CREATE INDEX 语法MySQL 索引类型MySQL CREATE INDEX 实例结论 MySQL 创建索引 对于一个具有大量数据行的表,如果你根据某个查询条件检索数据时很慢,可能是因为你没有在检索条件相关的列上创建索引。 索引类似于…

FPC生产工艺全流程详解

FPC生产制作繁琐而且难度较大,与普通PCB比较,FPC单位面积电路的造价高很多,但是,由于FPC优异的柔性、轻薄和可靠性等特性,给众多领域的设备和产品提供了更广泛的实现空间和新的设计方案,比如沉金板在电子、…

android的activty冷启动和热启动差异是什么?

Android的Activity冷启动和热启动之间存在显著差异,这些差异主要体现在启动过程、资源加载、组件初始化以及用户体验等方面。以下是对两者差异的详细分析: 一、定义与过程差异 冷启动: 定义:冷启动是指应用程序完全退出后&#…

Java需要英语基础吗?

Java编程语言本身并不要求必须有很强的英语基础,因为Java的语法和逻辑是独立于任何特定语言的。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&am…

android开发引入jar包

我在为一个安卓设备开发一个APP,设备的厂家给我提供了一个jar包,我应该如何把它引入到项目之中呢? 很惭愧我以前几乎没做过android的开发,在此之前这么一个简单的问题也不会。 实践 我随手在Android studio中新建了一个项目。 你…

Java项目:基于SSM框架实现的共享客栈管理系统分前后台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的共享客栈管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能…

Splunk Enterprise for Windows 未授权任意文件读取漏洞复现(CVE-2024-36991)

0x01 产品简介 Splunk Enterprise是一款功能强大的数据分析引擎,旨在从所有IT系统和基础设施数据中提供数据搜索、报表和可视化展现。Splunk Enterprise能够收集、索引和利用所有应用程序、服务器和设备(包括物理、虚拟和云中环境)生成的快速移动型计算机数据。它允许用户从…

交易积累-比特币

在某些情况下,由于监管限制或个人选择,投资者可能会考虑购买与比特币相关的替代投资产品,如比特币矿业公司股票(例如Marathon Digital Holdings, Inc.,股票代码:MARA)或加密货币交易平台的股票&…

使用maven搭建一个SpingBoot项目

1.首先创建一个maven项目 注意选择合适的jdk版本 2.添加依赖 2.在pom.xml中至少添加依赖 spring-boot-starter-web 依赖&#xff0c;目的是引入Tomcat&#xff0c;以及SpringMVC等&#xff0c;使项目具有web功能。 <!-- 引入 包含tomcat&#xff0c;SpringMVC&#xff0c…

【C++题解】1561. 买木头

问题&#xff1a;1561. 买木头 类型&#xff1a;省赛、数组问题、二分答案、贪心、2015江苏省青少年信息学奥林匹克竞赛复赛 题目描述&#xff1a; 有 n 个木材供应商&#xff0c;每个供货商有长度相同一定数量的木头。长木头可以锯短&#xff0c;但短木头不能接长。有一个客…

web前端之上传文件夹、webkitdirectory

MENU 前言element-ui写法input写法 前言 1、以下代码只实现的单个文件夹的上传&#xff0c;原本需求是实现选择多个文件夹上传&#xff0c;但是没找到实现的方法。如果想实现多个文件夹上传&#xff0c;可以给这些文件夹新建一个父级文件夹&#xff0c;点击上传的时候选择父级文…

14-36 剑和诗人10 - 用LLM构建 AI 代理平台

介绍 在当今快速发展的技术环境中&#xff0c;大型语言模型 (LLM) 和 AI 代理正在改变我们与信息交互、实现流程自动化以及应对不同行业复杂挑战的方式。随着这些强大的模型不断发展&#xff0c;对能够无缝集成和协调它们的强大平台的需求变得越来越重要。 让我们深入研究设计…

android2024 gradle8 Processor和ksp两种编译时注解实现

android编译时注解&#xff0c;老生常谈&#xff0c;外面的例子都是bindView&#xff0c;脑壳看疼了&#xff0c;自己学习和编写下。 而且现在已经进化到kotlin2.0&#xff0c;google也逐渐放弃kapt&#xff0c;进入维护状态。所以要好好看看本贴。 参考我的工程&#xff1a; h…

数据结构之算法的时间复杂度

1.时间复杂度的定义 在计算机科学中&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定量描述了算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比列&#xff0c;算法中的基本操作的执行次数&#xff0c;为算法的时间复杂度 例1&#xff1a; 计算Func1…

Linux:ollama大模型部署

目录 Ollama 是一个能在本地机器上轻松构建和运行大型语言模型的轻量级、可扩展框架&#xff0c;适用于多种场景&#xff0c;具有易于使用、资源占用少、可扩展性强等特点。 1.安装下载ollama 2.为 Ollama 创建一个用户 3.为ollama创建服务文件 4.启动ollama服务 5.拉取语…

Java 家庭物联网

家庭物联网系统的代码和说明&#xff0c;包括用户认证、设备控制、数据监控、通知和警报、日志记录以及WebSocket实时更新功能。 ### 项目结构 plaintext home-iot-system ├── backend │ └── src │ └── main │ └── java │ └…

图书馆数据仓库

目录 1.数据仓库的数据来源为业务数据库&#xff08;mysql&#xff09; 初始化脚本 init_book_result.sql 2.通过sqoop将mysql中的业务数据导入到大数据平台&#xff08;hive&#xff09; 导入mysql数据到hive中 3.通过hive进行数据计算和数据分析 形成数据报表 4.再通过sq…

【matlab】智能优化算法——求解目标函数

智能优化算法在求解目标函数方面发挥着重要作用&#xff0c;它通过迭代、筛选等方法来寻找目标函数的最优值&#xff08;极值&#xff09;。以下是关于智能优化算法求解目标函数的详细介绍&#xff1a; 一、智能优化算法概述 智能优化算法是一种搜索算法&#xff0c;旨在通过…

设置单实例Apache HTTP服务器

配置仓库 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vi rpm.repo仓库代码&#xff1a; [BaseOS] nameBaseOS baseurl/mnt/BaseOS enabled1 gpgcheck0[AppStream] nameAppStream baseurl/mnt/AppStream enabled1 gpgcheck0挂载 [rootlocalhost …

2.4G无线收发芯片 XL2401D,SOP16封装,集成单片机,高性价比

XL2401D 芯片是工作在2.400~2.483GHz世界通用ISM频段&#xff0c;片内集成了九齐 NY8A054E单片机的SOC无线收发芯片。芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块&#xff0c;并且支持一对多组网和带ACK的通信模式。发射输出功率、工作频道以及通信数据…