请帮助我,我不明白如何使用 yolo 和 tkinker 作为 gui 来制作用于实时检测的 gui。以及如何将边界框从 pytorch 渲染到 tkinker?
这里是代码:
import torch
from matplotlib import pyplot as plt
import numpy as np
import cv2
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
result = model(frame)
cv2.imshow('Screen', np.squeeze(result.render()))
if cv2.waitKey(10) & 0xff == ord('x'):
break
if cv2.getWindowProperty("Screen", cv2.WND_PROP_VISIBLE) <1:
break
cap.release()
cv2.destroyAllWindows()
当然,我们可以创建一个将 YOLOv5 与 tkinter 结合用于实时对象检测的 GUI。以下是分步指南以及带有说明的代码:
1. 安装必要的库
确保你已安装以下 Python 库。如果没有,你可以使用 pip 安装它们:
pip install tkinter opencv-python pillow torch
2. 代码
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import cv2
import torch
# 加载 YOLOv5 模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
class App:
def __init__(self, window, window_title):
self.window = window
self.window.title(window_title)
# 创建一个画布来显示视频流
self.canvas = tk.Canvas(window, width=640, height=480)
self.canvas.pack()
# 用于打开视频文件的按钮
self.btn_open = tk.Button(window, text="打开视频文件", command=self.open_video)
self.btn_open.pack(side="bottom")
# 用于启动/停止检测的按钮
self.btn_toggle = tk.Button(window, text="开始检测", command=self.toggle_detection)
self.btn_toggle.pack(side="bottom")
# 视频源(初始值为无)
self.vid = None
# 检测标志
self.detecting = False
self.window.mainloop()
def open_video(self):
# 打开文件对话框以选择视频文件
self.pause_detection()
self.video_path = filedialog.askopenfilename()
# 如果选择了文件,则开始处理视频
if self.video_path:
self.vid = cv2.VideoCapture(self.video_path)
self.process_video()
def process_video(self):
# 从视频中读取帧
ret, frame = self.vid.read()
if ret:
# 检测对象
if self.detecting:
frame = self.detect_objects(frame)
# 将帧转换为 RGB 并显示在画布上
self.photo = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
# 每 30 毫秒后调用自身以显示下一帧
self.window.after(30, self.process_video)
else:
# 如果视频结束,则释放视频捕获对象
self.vid.release()
def detect_objects(self, frame):
# 使用 YOLOv5 进行对象检测
results = model(frame)
# 处理结果并绘制边界框和标签
for *xyxy, conf, cls in results.xyxy[0]:
x1, y1, x2, y2 = map(int, xyxy)
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
label = f"{model.names[int(cls)]} {conf:.2f}"
cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
return frame
def toggle_detection(self):
# 切换检测标志
self.detecting = not self.detecting
if self.detecting:
self.btn_toggle.config(text="停止检测")
if self.vid:
self.process_video()
else:
self.btn_toggle.config(text="开始检测")
def pause_detection(self):
# 暂停检测
self.detecting = False
self.btn_toggle.config(text="开始检测")
# 创建主窗口
App(tk.Tk(), "YOLOv5 对象检测")
说明:
-
导入必要的库:
tkinter
用于 GUI,cv2
用于视频处理,PIL
用于在画布上显示图像,torch
用于 YOLO。 -
加载 YOLOv5 模型:
model = torch.hub.load(...)
加载预训练的 YOLOv5s 模型。你可以将其替换为任何其他 YOLOv5 模型。 -
创建
App
类: - 它初始化主窗口和按钮(“打开视频”和“开始检测”)。
-
open_video
函数打开文件对话框,使用户可以选择视频文件,并初始化视频处理。 -
process_video
函数从视频中读取帧,如果self.detecting
为真,则将其发送以进行对象检测,使用ImageTk
将其转换为 tkinter 兼容格式,并在画布上显示。 -
detect_objects
函数接收一个帧,使用 YOLOv5 进行对象检测,在检测到的对象周围绘制边界框和标签,并返回修改后的帧。 -
toggle_detection
函数启动和停止检测过程。 -
pause_detection
函数在需要时停止检测。 -
创建应用程序实例:
App(tk.Tk(), "YOLOv5 对象检测")
创建应用程序窗口并运行主事件循环。
现在,当你运行代码时,你将获得一个带有两个按钮的 GUI 窗口:“打开视频文件”和“开始检测”。你可以单击“打开视频文件”以选择视频文件或摄像头流,然后单击“开始检测”以开始对象检测。检测到的对象将带有边界框和标签叠加在视频流上。你可以再次单击“停止检测”来停止检测。
这就是在 tkinter 中使用 YOLOv5 的基本设置!你可以根据自己的需要扩展此功能,例如添加更多控件或改进 GUI。
标签:python,opencv,user-interface,tkinter,yolov5 From: 71970056