yolov8 目標追蹤 (源碼 +效果圖)

1.在代碼中 增加了s鍵開始追蹤 e鍵結束追蹤 顯示移動距離(代碼中可調標尺和像素的比值 以便接近實際距離)

2.繪制了監測區域 只在區域內的檢測

3.規定了檢測的類別 只有人類才繪制軌跡

import osimport cv2
from ultralytics import YOLO
from collections import defaultdict
import numpy as np
import json
import datetimedef drawTrajectory(boxes, track_ids, track_history, track_length, img, drawing, roi):# 繪制軌跡并計算軌跡長度for box, track_id in zip(boxes, track_ids):x, y, w, h = boxcenter = (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_lengthprint(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 = Falsewhile 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和類別IDboxes = 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' 類別的 IDperson_boxes.append(box)person_track_ids.append(track_id)# 檢測開始信號和結束信號key = cv2.waitKey(1) & 0xFFif key == ord('s'):  # 按下 's' 鍵表示開始信號drawing = Trueprint("開始繪制軌跡")# 清空軌跡歷史和軌跡長度track_history.clear()track_length.clear()elif key == ord('e'):  # 按下 'e' 鍵表示結束信號drawing = Falseprint("停止繪制軌跡")# 在保存截圖前繪制軌跡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.pswp.cn/web/70940.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70940.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70940.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2.5 運算符2

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請在顯著位置標明本文出處以及作者網名&#xff0c;未經作者允許不得用于商業目的 2.5.3 賦值運算符 賦值運算符將值存儲在左操作數指定的對象中。有兩種賦值操作&#xff1a; 1、簡單賦值&#xff0c;使用。其中第二…

地彈與振鈴

地彈&#xff08;Ground Bounce&#xff09;和振鈴&#xff08;Ringing&#xff09;是數字電路中常見的信號完整性問題&#xff0c;兩者都與高速開關和寄生參數有關&#xff0c;但表現形式和成因不同。以下是它們的對比及解決方法&#xff1a; 1. 地彈&#xff08;Ground Bounc…

解決Deepseek“服務器繁忙,請稍后再試”問題,基于硅基流動和chatbox的解決方案

文章目錄 前言操作步驟步驟1&#xff1a;注冊賬號步驟2&#xff1a;在線體驗步驟3&#xff1a;獲取API密鑰步驟4&#xff1a;安裝chatbox步驟5&#xff1a;chatbox設置 價格方面 前言 最近在使用DeepSeek時&#xff0c;開啟深度思考功能后&#xff0c;頻繁遇到“服務器繁忙&am…

二十三種設計模式

2 工廠方法模式 工廠模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的設計模式之一。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式。 在工廠模式中&#xff0c;我們在創建對象時不會對客戶端暴露創建邏輯&#xff0c;并且是通…

基于C語言對CAPL語法基礎的理解

.CAPL是基于C語言開發的&#xff0c;專門用于CANalyzer和CANoe工具環境&#xff0c;但是CAPL簡化了C語言&#xff0c;移除了復雜的指針概念&#xff0c;和一些不常用的關鍵字。 2.CAPL 腳本是基于事件驅動的&#xff0c;任何事件都有可能觸發CAPL腳本的執行&#xff0c;比如&a…

【Java SE】Java中String的內存原理

參考筆記&#xff1a; Java String 類深度解析&#xff1a;內存模型、常量池與核心機制_java stringx、-CSDN博客 解析java中String的內存原理_string s1 new string("ab");內存分析-CSDN博客 目錄 1.String初識 2.字符串字面量 3.內存原理圖 4. 示例驗證 4.…

Prometheus + Grafana 監控

Prometheus Grafana 監控 官網介紹&#xff1a;Prometheus 是一個開源系統 監控和警報工具包最初由 SoundCloud 構建。自 2012 年成立以來&#xff0c;許多 公司和組織已經采用了 Prometheus&#xff0c;并且該項目具有非常 活躍的開發人員和用戶社區。它現在是一個獨立的開源…

【Python爬蟲(95)】Python爬蟲進階:構建大型垂直領域爬蟲系統

【Python爬蟲】專欄簡介:本專欄是 Python 爬蟲領域的集大成之作,共 100 章節。從 Python 基礎語法、爬蟲入門知識講起,深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐,覆蓋網頁、圖片、音頻等各類數據爬取,還涉及數據處理與分析。無論是新手小白還是進階開發…

Node.js定義以及性能優化

Node.js Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行時&#xff0c;廣泛用于構建高性能的網絡應用。以下是一些常見的 Node.js 面試題及其解答&#xff0c;幫助你準備面試&#xff1a; 1. 什么是 Node.js&#xff1f; Node.js 是一個基于 Chrome V8 引擎的 JavaSc…

開源|Documind協同文檔(接入deepseek-r1、支持實時聊天)

Documind &#x1f680; 項目介紹 Documind 一個支持實時聊天和接入deepseek-r1模型AI助手的協同文檔編輯項目 前端&#xff1a;NextJS React TailwindCSS ShadcnUl Tiptap Zustand后端&#xff1a;NextJS Convex Liveblocks Clerk項目預覽&#xff1a;Documind 預覽…

JVM內存模型詳解:各個區域的作用與原理

引言 Java虛擬機&#xff08;JVM&#xff09;是Java程序運行的核心環境&#xff0c;它負責管理程序的內存、執行字節碼以及提供跨平臺的支持。理解JVM的內存模型對于編寫高效、穩定的Java程序至關重要。本文將詳細介紹JVM的內存模型&#xff0c;并深入探討各個內存區域的作用和…

機器學習之集成學習思維導圖

學習筆記—機器學習-集成學習思維導圖 20250227&#xff0c;以后復習看&#xff08;周老師的集成學習&#xff09; PS&#xff1a;圖片看不清&#xff0c;可以下載下來看。 往期思維導圖&#xff1a; 機器學習之集成學習Bagging&#xff08;隨機深林、VR-樹、極端隨機樹&…

【http://noi.openjudge.cn/】4.3算法之圖論——1538:Gopher II

[【http://noi.openjudge.cn/】4.3算法之圖論——1538:Gopher II] 題目 查看提交統計提問 總時間限制: 2000ms 內存限制: 65536kB 描述 The gopher family, having averted the canine threat, must face a new predator. The are n gophers and m gopher holes, each at di…

Apache Spark中的依賴關系與任務調度機制解析

Apache Spark中的依賴關系與任務調度機制解析 在Spark的分布式計算框架中,RDD(彈性分布式數據集)的依賴關系是理解任務調度、性能優化及容錯機制的關鍵。寬依賴(Wide Dependency)與窄依賴(Narrow Dependency)作為兩種核心依賴類型,直接影響Stage劃分、Shuffle操作及容…

【計算機網絡】TCP協議相關總結,TCP可靠性的生動講解

TCP 可靠性 確保快遞不丟、不亂、不過載 機制作用&#xff08;快遞類比&#xff09;防止的問題檢驗和檢查包裹是否損壞&#xff0c;損壞就重新發數據出錯序列號給每個包裹編號&#xff0c;按順序整理亂序、重復確認應答每送到一件&#xff0c;就讓收件人簽收丟失滑動窗口控制…

Go基于協程池的延遲任務調度器

原理 通過用一個goroutine以及堆來存儲要待調度的延遲任務&#xff0c;當達到調度時間后&#xff0c;將其添加到協程池中去執行。 主要是使用了chan、Mutex、atomic及ants協程池來實現。 用途 主要是用于高并發及大量定時任務要處理的情況&#xff0c;如果使用Go協程來實現每…

杰發科技AC7801——滴答定時器獲取時間戳

1. 滴答定時器 杰發科技7801內部有一個滴答定時器&#xff0c;該定時器是M0核自帶的&#xff0c;因此可以直接用該定時器來獲取時間戳。 同樣&#xff0c;7803也可以使用該方式獲取時間戳。 2. 滴答定時器原理 SysTick是一個24位的遞減計數器&#xff0c;它從預設的重裝載值…

湖倉一體概述

湖倉一體之前&#xff0c;數據分析經歷了數據庫、數據倉庫和數據湖分析三個時代。 首先是數據庫&#xff0c;它是一個最基礎的概念&#xff0c;主要負責聯機事務處理&#xff0c;也提供基本的數據分析能力。 隨著數據量的增長&#xff0c;出現了數據倉庫&#xff0c;它存儲的是…

第十五屆藍橋杯單片機組4T模擬賽三(第二套)

本套試題在4T平臺中的名字為第15屆藍橋杯單片機組模擬考試三&#xff0c;不知道哪套是4T的模擬賽&#xff0c;所以兩套都敲一遍練練手感。 為了代碼呈現美觀&#xff0c;本文章前面的各個模塊在main函數中的處理函數均未添加退出處理&#xff0c;在最后給出的完整代碼中體現。 …

CT技術變遷史——CT是如何誕生的?

第一代CT(平移-旋轉) X線球管為固定陽極,發射X線為直線筆形束,一個探測器,采用直線和旋轉掃描相結合,即直線掃描后,旋轉1次,再行直線掃描,旋轉180完成一層面掃描,掃描時間3~6分鐘。矩陣象素256256或320320。僅用于顱腦檢查。 第二代CT (平移-旋轉) 與第一代無質…