文章目录
前言
本文将介绍如何使用 Python 和 tkinter 构建一个简单的目标检测 GUI,以便用户可以上传图像并查看检测结果。即插即用!非常好用!
准备工作
首先,需要安装必要的库:
tkinter:用于创建 GUI
cv2:OpenCV 库,用于图像处理
PIL:Python Imaging Library,用于图像操作
ultralytics:用于目标检测模型
完整代码
init(self, root)
def __init__(self, root):
self.root = root
self.root.title("检测 GUI")
# 加载模型
start_load_time = time.time()
self.model = YOLO(r'D:\kehu\cheliang\ultralytics-main\CL\yolov8s.pt') ###这里填写自己的pt权重即可
end_load_time = time.time()
print(f"加载模型时间:{end_load_time - start_load_time:.2f}秒")
self.create_widgets()
create_widgets(self)
def create_widgets(self):
self.label = tk.Label(self.root, text="选择照片:")
self.label.pack()
self.image_path = tk.StringVar()
self.image_entry = tk.Entry(self.root, textvariable=self.image_path, width=50)
self.image_entry.pack()
self.browse_button = tk.Button(self.root, text="上传", command=self.browse_image)
self.browse_button.pack()
self.detect_button = tk.Button(self.root, text="检测目标", command=self.detect_objects)
self.detect_button.pack()
self.canvas = tk.Canvas(self.root, width=640, height=480)
self.canvas.pack()
browse_image
def browse_image(self):
file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg *.jpeg *.png")])
if file_path:
self.image_path.set(file_path)
self.display_image(file_path)
display_image
image = Image.open(image_path)
image = image.resize((640, 480), Image.LANCZOS) # 或者使用 resample=Image.LANCZOS
self.photo = ImageTk.PhotoImage(image)
self.canvas.create_image(0, 0, anchor=tk.NW, image=self.photo)
detect_objects
def detect_objects(self):
start_inference_time = time.time()
image_path = self.image_path.get()
if not image_path:
messagebox.showerror("Error", "Please select an image.")
return
results = self.model(image_path, save=True, conf=0.4, iou=0.4, imgsz=640, save_txt=True, device='cpu')
end_inference_time = time.time()
print(f"推理图片时间:{end_inference_time - start_inference_time:.2f}秒")
image = cv2.imread(image_path)
start_show_time =time.time()
for result in results:
boxes = result.boxes
for box in boxes:
xyxy = box.xyxy.squeeze().tolist()
x1, y1, x2, y2 = map(int, xyxy)
cls = int(box.cls)
conf = float(box.conf)
label = f"{result.names[cls]}, {conf:.2f}"
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 2)
end_show_time =time.time()
print(f"显示图片时间:{end_show_time - start_show_time:.2f}秒")
start_save_time = time.time()
result_image_path = r"result.jpg"
cv2.imwrite(result_image_path, image)
end_save_time = time.time()
print(f"保存图片时间:{end_save_time - start_save_time:.2f}秒")
self.display_image(result_image_path)
messagebox.showinfo("检测完成", f"结果保存在 {result_image_path}\n用时:推理图片:{end_inference_time - start_inference_time:.2f}秒,保存图片:{end_save_time - start_save_time:.2f}秒")
完整代码下载链接
免费!免费!免费!通用Yolov8检测GUI,直接替换权重即可