首页 > 其他分享 >OpenCV 与 YoloV3的结合使用:目标实时跟踪

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

时间:2024-09-10 18:20:14浏览次数:3  
标签:YoloV3 frame resized cv2 实时 OpenCV time net class

目录

代码分析

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)

    # 计算 FPS
    current_time = time.time()
    fps = 1 / (current_time - prev_time)
    prev_time = current_time

    # 显示 FPS
    cv2.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()

效果展示

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="oqHBSRUh-1725890018997" src="https://live.csdn.net/v/embed/423260"></iframe>

YOLOV3实现目标识别

总结

这,呃,不总结了

 

标签:YoloV3,frame,resized,cv2,实时,OpenCV,time,net,class
From: https://blog.csdn.net/DDDDWJDDDD/article/details/142070366

相关文章

  • 【OpenCV】简介入门及资料文档,工具准备和环境部署
    OpenCV已更新到 4.x,计算机视觉和机器学习的软件库git地址:https://github.com/opencv/opencv1.跨平台:Linux,Windows,Android,MacOS2.由C和C++轻量级编写3.提供C++,Java,Python,Ruby,MATLAB,C#、Ch、Ruby,GO接口应用:图像处理(滤波、边缘检测等)视频处理(实时视频处理等)物体......
  • 实时监控windows服务端口连接并打印到一个文件上
    话不多说,直接上脚本,test.bat 文件,目录生成netstat_log.txt,文件里面直接时间和netstat 信息都打印在那了@echooffset"logfile=netstat_log.txt":loop  echo%date%%time%>>%logfile%  echo.>>%logfile%  netstat-ano>>%logfile%  echo.>>%lo......
  • SignalR实时消息推送
    后端创建一个Hub类,重写连接和断连方法ChatHub记录下每一位登录人连接SignalR的信息至Redis中引用的Microsoft.AspNetCore.App框架publicclassChatHub:Hub{//ConcurrentDictionary<string,HubUser>concurrentDictionary=newConcurrentDictionary<string,HubU......
  • 【机器学习】C++与OpenCV实战:创建你的第一个图片显示程序
    ......
  • el-table树形懒加载表格展开后 子节点修改数据后实时刷新
    问题描述在项目中遇到一个关于el-table的懒加载树型结构修改数据后需要刷新数据的问题,需要手动刷新页面之后才能刷新问题解决:1.首先创建map来用于存取数据,constloadMap=newMap();//存储load加载的子节点以能够编辑后更新2.在table展开子节点时,用map存下每次被加载......
  • qt5.15.2+opencv4.10+VS2019_64 均值滤波,高斯滤波算法详细分析
    目录 一.加载图像二.灰度图像三.均值滤波1.均值滤波均值滤波算法(MeanFiltering):    参数含义:    一句话总结:均值滤波特点:应用场景:缺点:2.高斯滤波高斯滤波算法(GaussianBlur):        高斯滤波计算过程:    参数含义:    ......
  • 实现一个基于 Spring Boot 和 Vue.js 的实时消息推送系统
    在现代互联网应用中,实时消息推送已经成为一个非常重要的功能。不论是即时通讯、通知系统,还是其他需要实时互动的应用场景,消息的实时性直接影响到用户的体验和应用的效率。在这篇文章中,我将详细介绍如何使用SpringBoot和Vue.js创建一个实时消息推送系统,并确保每个用户只......
  • RTOS实时操作系统(任务运行性能分析)
    1,查看任务运行状态:X:表示任务当前正在运行(eXecuting)。B:表示任务处于阻塞状态(Blocked),这意味着任务正在等待某个事件发生,比如等待信号量、互斥量、事件组、消息队列或者定时器。R:表示任务处于就绪状态(Ready),这意味着任务已经准备好运行,但是当前没有在运行,因为它被调度器分配给其......
  • opencv学习:图像轮廓识别及代码实现
    图像轮廓1.获取图像轮廓cv2.findContours()函数是OpenCV库中用于检测图像中轮廓的函数。它可以检测到图像中所有连通区域的边界,并返回这些轮廓的列表。从OpenCV3.4版本开始,这个函数的返回值和参数有所变化,以下是详细的参数说明:方法:contours,hierarchy=cv2.findCon......
  • 基于ARM芯片与OpenCV的工业分拣机器人项目设计与实现流程详解
    一、项目概述项目目标和用途本项目旨在设计和实现一套工业分拣机器人系统,能够高效、准确地对不同类型的物品进行自动分拣。该系统广泛应用于物流、仓储和制造业,能够显著提高工作效率,降低人工成本。技术栈关键词ARM芯片步进电机控制OpenCV图像识别无线通信模块......