yolov8 目标追踪 (源码 +效果图)

news2025/5/16 18:44:33

1.在代码中 增加了s键开始追踪 e键结束追踪 显示移动距离(代码中可调标尺和像素的比值 以便接近实际距离)

2.绘制了监测区域 只在区域内的检测

3.规定了检测的类别 只有人类才绘制轨迹

import os

import cv2
from ultralytics import YOLO
from collections import defaultdict
import numpy as np
import json
import datetime

def drawTrajectory(boxes, track_ids, track_history, track_length, img, drawing, roi):
    # 绘制轨迹并计算轨迹长度
    for box, track_id in zip(boxes, track_ids):
        x, y, w, h = box
        center = (int(x), int(y))  # 检测框的中心点

        # 检查中心点是否在 ROI 内
        if roi[0] < center[0] < roi[2] and roi[1] < center[1] < roi[3]:
            if drawing:
                track = track_history[track_id]
                track.append((float(x), float(y)))  # 添加中心点到轨迹历史

                # 计算轨迹长度
                if len(track) > 1:
                    for i in range(1, len(track)):
                        track_length[track_id] += np.linalg.norm(np.array(track[i]) - np.array(track[i - 1]))

            # 绘制轨迹(无论是否正在更新轨迹历史)
            if track_id in track_history:
                track = track_history[track_id]
                if len(track) > 1:
                    points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
                    cv2.polylines(img, [points], isClosed=False, color=(230, 230, 230), thickness=2)

                # 在图像上显示轨迹长度
                actual_length = 0.5  # 实际长度(单位:米)
                pixel_length = 1000  # 标尺在图像中的像素长度
                pixel_to_meter_ratio = actual_length / pixel_length
                print(f"ID:{track_id},移动了轨迹长度{track_length[track_id] * pixel_to_meter_ratio:.2f}")
                cv2.putText(img, f"ID: {track_id}: length={track_length[track_id] * pixel_to_meter_ratio:.2f} m",
                            (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

if __name__ == "__main__":
    # 加载配置文件
    with open("config.json", "r", encoding="utf-8") as f:
        config = json.load(f)

    # 从配置文件中读取参数
    video_path = config["video_path"]
    roi = config["roi"]
    model_path = config["model_path"]

    # 加载 YOLO 模型
    model = YOLO(model=model_path)

    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    # 用于存储轨迹历史
    track_history = defaultdict(lambda: [])
    # 用于存储轨迹长度
    track_length = defaultdict(lambda: 0)

    # 状态标志,表示是否正在绘制轨迹
    drawing = False

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

        # 运行目标追踪(禁用默认的边界框绘制)
        result = model.track(source=frame, persist=True, show=False, show_boxes=False)
        # img = frame.copy()  # 使用原始帧,而不是 YOLO 绘制的帧
        img = result[0].plot()

        # 获取边界框、轨迹ID和类别ID
        boxes = result[0].boxes.xywh.cpu()
        track_ids = result[0].boxes.id.int().cpu().tolist()
        class_ids = result[0].boxes.cls.int().cpu().tolist()

        # 过滤出类别为 'person' 的检测结果
        person_boxes = []
        person_track_ids = []
        for box, track_id, class_id in zip(boxes, track_ids, class_ids):
            if class_id == 0:  # 0 是 'person' 类别的 ID
                person_boxes.append(box)
                person_track_ids.append(track_id)

        # 检测开始信号和结束信号
        key = cv2.waitKey(1) & 0xFF
        if key == ord('s'):  # 按下 's' 键表示开始信号
            drawing = True
            print("开始绘制轨迹")
            # 清空轨迹历史和轨迹长度
            track_history.clear()
            track_length.clear()
        elif key == ord('e'):  # 按下 'e' 键表示结束信号
            drawing = False
            print("停止绘制轨迹")

            # 在保存截图前绘制轨迹
            drawTrajectory(person_boxes, person_track_ids, track_history, track_length, img, drawing, roi)

            # 定义文件夹名称
            output_folder = "output_images"

            # 如果文件夹不存在,则创建文件夹
            if not os.path.exists(output_folder):
                os.makedirs(output_folder)
            # 获取当前时间戳并格式化为字符串
            timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
            # 将时间戳拼接到文件名中,并保存到指定文件夹
            output_image_path = os.path.join(output_folder, f"output_frame_{timestamp}.png")
            cv2.imwrite(output_image_path, img)
            print(f"当前帧已保存为: {output_image_path}")
        elif key == 27:  # 按下 ESC 键退出
            break

        # 绘制 ROI 矩形
        cv2.rectangle(img, (roi[0], roi[1]), (roi[2], roi[3]), (0, 255, 0), 2)

        # 绘制轨迹并计算轨迹长度(仅对 ROI 内的 persons)
        drawTrajectory(person_boxes, person_track_ids, track_history, track_length, img, drawing, roi)

        # 显示图像
        cv2.imshow("demo", img)

    cap.release()
    cv2.destroyAllWindows()

源码如上 现在AI遍地都是 想改写复制源码交给AI就改了 

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

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

相关文章

基于Python的web漏洞挖掘,漏洞扫描系统(附源码,部署)

本次技术通过利用Python技术来开发一款针对web漏洞挖掘扫描的技术&#xff0c;通过web漏洞的挖掘扫描来实现对网站URL的漏洞检测&#xff0c;通过高中低风险的判断来实现对一款网站中存在的漏洞进行可视化的分析&#xff0c;从而能够找到问题并且尽快的实现问题的解决。 博主介…

岳阳市美术馆预约平台(小程序论文源码调试讲解)

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xff0c;以及让来访用户可以花费更多时间停留在系统上&#xff0c;则表明该系统设计得比较专…

ubuntu22.04系统如何自建2级ntp服务器

一&#xff1a;ntp服务器详情 服务器型号 系统版本 IP地址 主机名 ntp服务版本 虚拟机8c-32g-1T Ubuntu22.04 10.20.30.2 DMZ-NTP-SERVER 4.2.8p15 二&#xff1a;ntp服务端部署配置脚本 #!/bin/bash # 脚本信息 echo "--------------------------…

DeepSeek赋能智慧社区:提升社区治理,优化资源配置,带来全新变革

在数字化浪潮的推动下&#xff0c;智慧社区正逐渐成为城市发展的重要方向。作为一款先进的人工智能大模型&#xff0c;DeepSeek凭借其强大的多模态数据分析和智能决策能力&#xff0c;正在为智慧社区的建设注入新的活力。 标准规范及顶层设计指南、供应商整体解决方案合集、供应…

spring注解开发(Spring整合MyBatis——Mapper代理开发模式、(Spring、MyBatis、Jdbc)配置类)(6)

目录 一、纯MyBatis独立开发程序。 &#xff08;1&#xff09;数据库与数据表。 &#xff08;2&#xff09;实体类。 &#xff08;3&#xff09;dao层接口。&#xff08;Mapper代理模式、无SQL映射文件——注解配置映射关系&#xff09; &#xff08;4&#xff09;MyBatis核心配…

【MySQL】数据库-图书管理系统(CC++实现)

一.预期功能 该图书管理系统设计提供基本的设计模版&#xff0c;涉及数据库的增删查改等操作&#xff0c;包含登录功能&#xff0c;图书管理功能&#xff0c;图书借阅功能&#xff0c;用户管理功能等基础功能&#xff0c;详细功能查看以下菜单表&#xff0c;共包含三个菜单&am…

VSCode轻松调试运行C#控制台程序

1.背景 我一直都是用VS来开发C#项目的&#xff0c;用的比较顺手&#xff0c;也习惯了。看其他技术文章有介绍VS Code更轻量&#xff0c;更方便。所以我专门花时间来使用VS Code&#xff0c;看看它是如何调试代码、如何运行C#控制台。这篇文章是一个记录的过程。 2.操作 2.1 V…

python-leetcode-下一个排列

31. 下一个排列 - 力扣&#xff08;LeetCode&#xff09; class Solution:def nextPermutation(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# Step 1: Find the first decreasing element …

Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效

目录标题 Jsmoke &#x1f6ac;&#x1f6ac; by Yn8rt使用方式界面预览功能特性支持的敏感信息类型 Jsmoke &#x1f6ac;&#x1f6ac; by Yn8rt ​ 该插件由 Yn8rt师傅 开发&#xff0c;插件可以理解为主动版的hae和apifinder&#xff0c;因为其中的大多数规则我都引用了&a…

iphone上ios设备开启safari开发者debug模式,配合mac电脑使用

1.mac操作 mac的safari上打开开发者模式&#xff0c;打开显示网页开发者功能 2.开启IPhone的Safari调试模式 启用 Web 检查 功能&#xff0c;打开 iPhone 依次进入 设置 > Safari浏览器 > 高级 > 网页检查器 > 启用。 3.调试步骤 先用IPhone 的Safari打开要调试…

Datawhale 数学建模导论二 笔记5 多模数据与智能模型

主要涉及到的知识点有&#xff1a; 数字图像处理与计算机视觉 计算语言学与自然语言处理 数字信号处理与智能感知 10.1 数字图像处理与计算机视觉 视觉信息是我们第一种非常规的数据模式&#xff0c;在Python当中可以使用opencv处理数字图像&#xff0c;并提取出视觉特征用…

如何在一台服务器上搭建 mongodb副本集1主2从节点

在一台服务器上搭建 MongoDB 副本集&#xff08;1 主节点 2 从节点&#xff09;可以通过运行多个 MongoDB 实例并使用不同端口和数据目录来实现。以下是详细步骤&#xff1a; 1. 准备工作 确保已安装 MongoDB。为每个实例创建独立的数据目录和日志文件。 2. 创建数据目录和…

TikTok隐私保护措施:确保用户安全

TikTok隐私保护措施&#xff1a;确保用户安全 在这个信息爆炸的时代&#xff0c;社交媒体平台的隐私保护问题日益成为公众关注的焦点。TikTok&#xff0c;作为全球领先的短视频平台&#xff0c;拥有庞大的用户群体&#xff0c;因此&#xff0c;其隐私保护措施显得尤为重要。本…

Apollo Cyber 学习笔记

目录 0 Introduction What Why Advantage 1 Example 2 Concept 3 Flow Chart 4 Module 4.1 Transport 4.1.1 Share Memory 4.1.1.1 Segment 4.1.1.1.1 State 4.1.1.1.2 Block 4.1.1.1.3 Common 4.1.1.2 Notifier 4.1.1.2.1 ConditionNotifier 4.1.1.2.2 Multi…

mamba_ssm和causal-conv1d详细安装教程

1.前言 Mamba是近年来在深度学习领域出现的一种新型结构&#xff0c;特别是在处理长序列数据方面表现优异。在本文中&#xff0c;我将介绍如何在 Linux 系统上安装并配置 mamba_ssm 虚拟环境。由于官方指定mamba_ssm适用于 PyTorch 版本高于 1.12 且 CUDA 版本大于 11.6 的环境…

Ruby基础

一、字符串 定义 283.to_s //转为string "something#{a}" //定义字符串&#xff0c;并且插入a变量的值 something//单引号定义变量 %q(aaaaaaaaa) // 定义字符串&#xff0c;&#xff08;&#xff09;内可以是任何数&#xff0c;自动转义双引号%Q("aaaaa"…

Flutter的permission_handler插件检查iOS的通知权限不准确

今天&#xff0c;做好了一个功能&#xff0c;就是在app内检查用户有没有给当前APP打开通知权限&#xff0c; 如果没打开&#xff0c;就展示一个 banner &#xff0c;让用户去点击banner去打开权限 。 android上测试得非常顺利&#xff0c; 结果&#xff0c; 在iOS 上就是不…

vue使用a-table设置自定义合并字段实现某字段值相同则合并行

背景&#xff1a; 笔者前端使用ant-design-vue,二次开发了a-table,但a-table组件的属性方法都可以用&#xff1b; 业务需求&#xff1a;物资存放在不同的仓库&#xff0c;显示物资统计表格&#xff0c;以物资分组合并显示物资名称、总数量&#xff08;物资A在所有库房总数量&a…

Docker容器日常维护常用命令大全

友情提示&#xff1a;本文内容由银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台deepseek-v3模型生成&#xff0c;文中所有命令未进行验证&#xff0c;仅供参考。请根据具体情况和需求进行适当的调整和验证。 引言 Docker作为当前最流行的容器化技术&#xf…

《昇腾推理服务器+DeepSeek大模型》技术培训在图为科技成功举办

2月17日&#xff0c;华为政企业务团队受邀莅临图为科技深圳总部&#xff0c;并成功举办了一场聚焦于《昇腾推理服务器DeepSeek大模型》的专业知识培训。 此次培训活动不仅深化了双方的技术交流&#xff0c;更标志着昇腾AI与DeepSeek大模型的全面融合应用即将迈入实质性落地的新…