目录
import cv2
from ultralytics import YOLO
import tkinter as tk
from tkinter import filedialog
from tkinter import ttk
from tkinter import messagebox
# 初始化模型为 None
model = None
# 定义打开视频文件的函数
def open_video():
video_path = filedialog.askopenfilename() # 获取用户选择的视频文件路径
if video_path:
try:
cap = cv2.VideoCapture(video_path) # 尝试打开视频
track_video(cap) # 调用追踪视频函数
except Exception as e:
messagebox.showerror("错误", f"打开视频时出错:{e}") # 显示错误消息框
# 定义追踪视频的函数
def track_video(cap):
"""
追踪视频的函数
1. 当视频捕获对象 cap 打开时,进入循环。
2. 在循环中,读取视频的下一帧。
3. 如果读取帧时发生异常,则显示详细的错误消息框并退出循环。
4. 如果读取到帧,则使用 model.track 进行目标追踪,并获取追踪结果 results。
5. 使用 results[0].plot() 绘制追踪结果。
6. 在图像窗口中显示绘制后的追踪结果。
7. 如果用户按下 'q' 键,则退出循环。
8. 释放视频捕获对象 cap,并销毁所有窗口。
"""
while cap.isOpened(): # 当视频捕获对象打开时
try:
ret, frame = cap.read() # 读取下一帧
except Exception as e:
messagebox.showerror("错误", f"读取视频帧时出错:{e}") # 显示读取帧错误消息框
break
if ret:
if model: # 确保有模型被选择
try:
results = model.track(frame, persist=True) # 进行目标追踪
annotated_frame = results[0].plot() # 获取绘制后的追踪结果
cv2.imshow("YOLOv8 Tracking", annotated_frame) # 显示追踪结果
except Exception as ex:
messagebox.showerror("模型错误", f"模型应用时出错:{ex}") # 显示模型应用错误消息框
key = cv2.waitKey(1) # 等待按键
if key == ord('q'): # 如果按下 'q' 键
break
cap.release() # 释放视频捕获对象
cv2.destroyAllWindows() # 销毁所有窗口
# 创建主窗口
root = tk.Tk()
root.geometry("800x800") # 设置更大的窗口尺寸
# 创建顶部栏
top_bar = ttk.Frame(root, relief=tk.RAISED, borderwidth=2)
top_bar.pack(fill=tk.X)
# 创建标题标签
title_label = ttk.Label(top_bar, text="高级 YOLOv8 目标追踪系统", font=("Helvetica", 32, "bold"))
title_label.pack(side=tk.LEFT, padx=50, pady=20)
# 创建中间容器
mid_container = ttk.PanedWindow(root, orient=tk.VERTICAL)
mid_container.pack(fill=tk.BOTH, expand=True)
# 上半部分框架
upper_frame = ttk.Frame(mid_container)
mid_container.add(upper_frame)
# 创建说明标签
instruction_label = ttk.Label(upper_frame, text="在此处精心选择要追踪的视频文件", font=("Helvetica", 20), wraplength=500)
instruction_label.pack(pady=20)
# 创建视频列表框
video_listbox = tk.Listbox(upper_frame, height=5, width=40)
video_listbox.pack(pady=15)
# 创建打开视频文件的按钮
open_button = ttk.Button(upper_frame, text="智能打开视频", command&