OpenCV 与 YoloV3的结合使用:目标实时跟踪

目录

代码分析

1. YOLO 模型加载

2. 视频加载与初始化

3. 视频帧处理

4. 物体检测

5. 处理检测结果

6. 边界框和类别显示

7. 帧率(FPS)计算

8. 结果显示与退出

9. 资源释放

整体代码

效果展示

总结


代码分析

这段代码使用 YOLO(You Only Look Once)模型进行视频中的物体检测,并通过 OpenCV 显示检测结果。以下是代码的详细分析:

1. YOLO 模型加载

 
net = cv2.dnn.readNet('../../needFiles/yolov3.weights', '../../needFiles/yolov3.cfg')

  • 这行代码加载了预先训练的 YOLOv3 模型的权重文件(yolov3.weights)和配置文件(yolov3.cfg)。YOLOv3 是一个实时物体检测模型,能够检测多个类别的物体。
 
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]

  • getLayerNames() 获取网络的所有层名称。getUnconnectedOutLayers() 返回网络输出层的索引(通常是 YOLO 的 3 个输出层),通过索引列表,获取这些输出层的名称,用于后面的 forward 方法中。

2. 视频加载与初始化

 
video_path = 'D:/Dji/DJIneo.mp4'
cap = cv2.VideoCapture(video_path)

  • 使用 cv2.VideoCapture 来加载视频文件。如果视频路径正确,cap 将用于逐帧读取视频。
 
resize_scale = 0.3

  • 定义缩放比例为 0.3,用于后续缩小显示尺寸,以减少计算量。
 
prev_time = 0

  • 初始化变量 prev_time,用于计算帧率(FPS,Frames Per Second)。

3. 视频帧处理

 
while True:ret, frame = cap.read()if not ret:break

  • 逐帧读取视频内容,cap.read() 返回两个值,ret 是布尔值表示是否成功读取,frame 是当前帧图像。如果无法读取(如视频结束),则退出循环。
 
frame_resized = cv2.resize(frame, (0, 0), fx=resize_scale, fy=resize_scale)

  • 当前帧 frame 被缩小到原来的 30%(通过 resize_scale),用于加快后续处理。

4. 物体检测

 
blob = cv2.dnn.blobFromImage(frame_resized, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outs = net.forward(output_layers)

  • YOLO 模型需要特定格式的输入。blobFromImage 将图像转换为 YOLO 需要的 4D blob,归一化比例为 0.00392,图像大小调整为 (416, 416)net.setInput(blob) 将处理后的 blob 输入到网络,net.forward(output_layers) 得到检测结果。

5. 处理检测结果

 
class_ids = []
confidences = []
boxes = []

  • 初始化三个列表:class_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:...

  • 遍历 YOLO 输出的 outs,每个 detection 包含检测到的一个物体的信息。检测结果中的前 4 个值是物体的位置信息,后面的值是类别的置信度。np.argmax(scores) 找出置信度最高的类别,confidence 存储该类别的置信度。如果置信度超过 0.5,则认为该物体被成功检测。

6. 边界框和类别显示

 
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
for i in indexes.flatten():x, y, w, h = boxes[i]label = str(class_ids[i])cv2.rectangle(frame_resized, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.putText(frame_resized, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

  • 使用非极大值抑制(NMS,Non-Maximum Suppression)去除重叠的边界框,减少冗余检测结果。然后,遍历保留下来的边界框,在图像上绘制矩形框和类别标签。

7. 帧率(FPS)计算

 
current_time = time.time()
fps = 1 / (current_time - prev_time)
prev_time = current_time
cv2.putText(frame_resized, f'FPS: {int(fps)}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

  • 通过计算两帧之间的时间差,实时计算并显示 FPS,以评估模型的运行效率。

8. 结果显示与退出

 
cv2.imshow('Object Detection', frame_resized)
if cv2.waitKey(1) & 0xFF == ord('q'):break

  • 使用 imshow 显示检测结果,按 'q' 键退出循环。

9. 资源释放

 
cap.release()
cv2.destroyAllWindows()

  • 释放视频资源并关闭所有窗口。

整体代码

import cv2
import numpy as np
import time# 加载 YOLO 模型
net = cv2.dnn.readNet('../../needFiles/yolov3.weights', '../../needFiles/yolov3.cfg')
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]  # 修正索引问题# 加载视频
video_path = 'D:/Dji/DJIneo.mp4'
cap = cv2.VideoCapture(video_path)# 缩小显示尺寸
resize_scale = 0.3# 初始化时间和帧计数器
prev_time = 0# 处理视频的每一帧
while True:ret, frame = cap.read()if not ret:break# 缩小当前帧frame_resized = cv2.resize(frame, (0, 0), fx=resize_scale, fy=resize_scale)# 检测对象blob = cv2.dnn.blobFromImage(frame_resized, 0.00392, (416, 416), (0, 0, 0), True, crop=False)net.setInput(blob)outs = net.forward(output_layers)# 处理检测结果class_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:  # 置信度阈值center_x = int(detection[0] * frame_resized.shape[1])center_y = int(detection[1] * frame_resized.shape[0])w = int(detection[2] * frame_resized.shape[1])h = int(detection[3] * frame_resized.shape[0])x = int(center_x - w / 2)y = int(center_y - h / 2)boxes.append([x, y, w, h])confidences.append(float(confidence))class_ids.append(class_id)# 应用非极大抑制来去除冗余框indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)for i in indexes.flatten():  # 展平索引x, y, w, h = boxes[i]label = str(class_ids[i])cv2.rectangle(frame_resized, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.putText(frame_resized, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 计算 FPScurrent_time = time.time()fps = 1 / (current_time - prev_time)prev_time = current_time# 显示 FPScv2.putText(frame_resized, f'FPS: {int(fps)}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)# 显示结果cv2.imshow('Object Detection', frame_resized)# 按 'q' 键退出if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

效果展示

YOLOV3实现目标识别

总结

这,呃,不总结了

 

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

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

相关文章

Linxu系统:kill命令

1、命令详解: kill命令是用于向进程发送信号,通常用来终止某个指定PID服务进程,kill命令可以发送不同的信号给目标进程,来实现不同的操作,如果不指定信号,默认会发送 TERM 信号(15)&…

ubuntu 和windows用samba服务器实现数据传输

1,linux安装samba服务器 sudo apt-get install samba samba-common 2,linux 配置权限,修改目录权限,linux下共享的文件权限设置。 sudo chmod 777 /home/lark -R 3. 添加samba用户 sudo smbpasswd -a lark 4,配置共享…

小程序页面整体执行顺序

首先执行 App.onLaunch -> App.onShow其次执行 Component.created -> Component.attached再执行 Page.onLoad -> Page.onShow最后 执行 Component.ready -> Page.onReady 你不知道的小程序系列之生命周期执行顺序

828华为云征文 | Flexus X实例与Harbor私有镜像仓库的完美结合

需要了解 本文章主要讲述在 华为云Flexus X 实例上搭建自己的企业级私有镜像仓库 Harbor,一键部署、搭建高可用安全可靠的容器镜像仓库选择合适的云服务器: 本文采用的是 华为云服务器 Flexus X 实例(推荐使用)连接方式&#xff1…

ctfshow-PHP特性

web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/",$num)){die("no no no"); #结束脚本呢执行输出指定信息}if(intval($num)){#把参数转换整数类型echo $flag;} } pr…

用面向对象的方法进行数据分析

项目从两个不同类型的文件&#xff08;文本文件和 JSON 文件&#xff09;读取销售数据&#xff0c;将其封装为 Record 对象&#xff0c;合并数据后&#xff0c;统计每天的销售总额&#xff0c;并通过 pyecharts 库生成一个包含每日销售额的柱状图&#xff08;Bar chart&#xf…

无线感知会议系列【1】【增强无线感知应用的鲁棒性】

前言&#xff1a; 这个是2021年 泛在可信智能感知论坛&#xff0c;汤战勇 &#xff08;西北大学物联网研究院 )教授的 一个讲座《wireless signals like WiFi, RFID and (ultra) sound as a powerful modality for ubiquitous sensing》 参考连接&#xff1a; 4.见微知萌—…

ollama 本地部署

ollama 本地模型部署 下载安装: [link](https://ollama.com/download)下载说明 部署使用在终端查看ollama是否安装完成终端查看ollama 命令说明查看当前支持下载的模型启动对话模式默认情况下&#xff0c;ollama启动了server 的api访问功能 外部 api访问使用postman网页版本for…

什么是Aware注入?

Spring容器可以在Bean初始化的时候&#xff0c;自动注入一些特定信息&#xff08;如beanfactory&#xff09;,使得bean可以轻松的访问其他Bean的实例&#xff0c;简化代码&#xff0c;避免了显式的注入。 Spring提供了很多Aware的接口,如下&#xff1a; 拿其中的BeanFactoryAwa…

全频段覆盖的卫星通信模块-灵活应对多应用场景

LoRa1121是采用SEMTECH的LR1121芯片&#xff0c;这是一款超低功耗、远程LoRa收发器&#xff0c;支持Sub-GHz和全球2.4GHz频谱中的地面ISM频段通信&#xff0c;且支持用于卫星连接的S频段。LoRa1121支持LoRa&#xff0c;(G)FSK调制&#xff0c;Sigfox协议&#xff0c;以及&#…

SRS流媒体服务器从入门到精通(其一,环境搭建)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 一、SRS简介二、SRS的应用场景三、环境搭建…

Leetcode - 周赛414

目录 一&#xff0c;3280. 将日期转换为二进制表示 二&#xff0c;3281. 范围内整数的最大得分 三&#xff0c;3282. 到达数组末尾的最大得分 四&#xff0c;3283. 吃掉所有兵需要的最多移动次数 一&#xff0c;3280. 将日期转换为二进制表示 本题就是简单的字符串和整数之…

爆改YOLOv8|利用yolov9的ADown改进卷积Conv-轻量化

1&#xff0c;本文介绍 本文将利用YOLOv9的ADown模块改进卷积。 关于ADown的详细介绍可以看论文&#xff1a;https://arxiv.org/abs/2402.13616 本文将讲解如何将ADown融合进yolov8 话不多说&#xff0c;上代码&#xff01; 2&#xff0c; 将ADown融合进yolov8 2.1 步骤一…

【高中物理】用代码缩写胡克定律公式原理图

用代码缩写胡克定律公式原理图 代码实现了以下功能&#xff1a; 交互式滑块&#xff1a;用户可以通过滑块调整弹簧的弹性系数&#xff08;k&#xff09;、拉力大小&#xff08;F&#xff09;和弹簧的原长&#xff08;l0&#xff09;&#xff0c;实时观察弹簧的伸长和受力变化。…

在VB.net中,TimeSpan有什么属性与方法

标题 在VB.net中&#xff0c;TimeSpan有什么属性与方法 正文 在 VB.NET 中&#xff0c;TimeSpan 结构表示时间间隔&#xff0c;即一段时间&#xff0c;而不表示特定的时间点。TimeSpan 提供了多种属性来获取时间间隔的各个组成部分&#xff0c;以及一些方法来操作这些时间间隔。…

【观察者】设计模式:构建灵活且响应式的软件系统

引言 在软件开发中&#xff0c;我们经常面临需要在多个对象之间进行通信的挑战。特别是当一个对象的状态发生变化时&#xff0c;我们希望所有依赖于这个状态的对象都能自动更新。这就是观察者设计模式大显身手的地方。 简介 观察者模式是一种行为设计模式&#xff0c;它定义…

基于vue框架的城市交通管理系统的设计与实现9fcck(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,区域,车站信息,公交线路 开题报告内容 基于Vue框架的城市交通管理系统的设计与实现开题报告 一、研究背景与意义 1.1 研究背景 随着城市化进程的加速&#xff0c;城市交通问题日益严峻&#xff0c;包括交通拥堵、交通事故频发、…

“CSDN独家揭秘:AIGC技术在AI绘画领域的应用与学习攻略”

导语&#xff1a;人工智能的发展正推动着内容创作的革新&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;技术便是其中的佼佼者。本文将带您领略AIGC在AI绘画领域的魅力&#xff0c;并分享一些学习资源和路径&#xff0c;助您在艺术与技术交汇的旅途中更进一步。…

山东省行政执法证照片要求及图像处理方法

在山东省&#xff0c;行政执法证是执法人员身份的重要标识&#xff0c;其照片的规范性对于证件的有效性至关重要。本文将详细介绍山东省行政执法证照片的要求&#xff0c;并提供使用手机相机拍照的实用方法&#xff0c;以确保照片符合标准。 一、山东省行政人员执法证照片拍摄要…

表情迁移大法,LivePortrait 帮你快速处理图片!

LivePortrait 由快手可灵大模型团队开源&#xff0c;主要功能包括从单一图像生成生动动画、精确控制眼睛和嘴唇的动作、处理多个人物肖像的无缝拼接、支持多风格肖像、生成高分辨率动画等。该项目使用的是基于隐式关键点框架的 AI 肖像动画生成框架。它能够将驱动视频的表情和姿…