from PIL import Image import tkinter as tk # 定义字体 font_title = ("Helvetica", 18, "bold") font_button = ("Helvetica", 30, "bold") def show_results(results): # 创建子界面 win = tk.Toplevel() # 修改子界面大小为800x800 win.geometry("1200x1200") win.title("预测结果") # 创建表格 table_frame = tk.Frame(win) table_frame.pack(pady=20) # 创建表头 # 修改字体大小为32 tk.Label(table_frame, text="X", font=("Helvetica", 32, "bold")).grid(row=1, column=0, padx=30) tk.Label(table_frame, text="Y", font=("Helvetica", 32, "bold")).grid(row=1, column=1, padx=30) tk.Label(table_frame, text="W", font=("Helvetica", 32, "bold")).grid(row=1, column=2, padx=30) tk.Label(table_frame, text="H", font=("Helvetica", 32, "bold")).grid(row=1, column=3, padx=30) tk.Label(table_frame, text="类别", font=("Helvetica", 32, "bold")).grid(row=1, column=4, padx=30) # 创建表格内容 for i, s1 in enumerate(results): tk.Label(table_frame, text=s1[0], font=("Helvetica", 32)).grid(row=i + 2, column=0, padx=30) tk.Label(table_frame, text=s1[1], font=("Helvetica", 32)).grid(row=i + 2, column=1, padx=30) tk.Label(table_frame, text=s1[2], font=("Helvetica", 32)).grid(row=i + 2, column=2, padx=30) tk.Label(table_frame, text=s1[3], font=("Helvetica", 32)).grid(row=i + 2, column=3, padx=30) tk.Label(table_frame, text=s1[4], font=("Helvetica", 32)).grid(row=i + 2, column=4, padx=30) # 定义选择结果函数 def select_result(result): print("选择的是:", result) # 创建选择按钮 for i, s1 in enumerate(results): # 修改字体大小为30 select_button = tk.Button(table_frame, text="选择", font=font_button, command=lambda s=s1: select_result(s)) select_button.grid(row=i + 2, column=5, padx=30) def site(source, pred, names): # 打开图像 img = Image.open(source) x1, x2 = img.size print([x1, x2]) results = [] # 获取预测结果 for i1 in pred: s = [] for i2 in i1.data.cpu().numpy(): s1 = [] s = list(i2) # 获取预测框中心点的坐标 x = s[0] = float(round((s[0] + s[2]) / 2 / x1, 4)) y = s[1] = float(round((s[1] + s[3]) / 2 / x2, 4)) # 预测框的宽和高 w = s[2] - s[0] h = s[3] - s[1] s1.append(str(x)) s1.append(str(y)) s1.append(str(w)) s1.append(str(h)) s1.append(names[int(s[5])]) if s[4] < 0.5: break results.append(s1) # 创建GUI界面 window = tk.Tk() # 修改主界面大小为800x800 window.geometry("800x800") window.title("目标检测结果") # 创建按钮框架 buttons_frame = tk.Frame(window) buttons_frame.pack(pady=30) # 创建按钮 for name in set([r[4] for r in results]): # 修改字体大小为30 button = tk.Button(buttons_frame, text=f"显示{name}的结果", font=font_button, command=lambda name=name: show_results([r[:4] + [name] for r in results if r[4] == name])) button.pack(pady=10) # 创建确定按钮 # 修改字体大小为30 confirm_button = tk.Button(window, text="退出", font=font_button, command=window.quit) confirm_button.pack(pady=30) window.mainloop() 详细分析这个程序是怎么实现的
时间: 2024-04-29 17:19:45 浏览: 51
这个程序主要是实现了一个目标检测结果的GUI界面。下面是这个程序的详细分析:
1. 引入了PIL模块和tkinter模块。
2. 定义了两个字体变量font_title和font_button,分别用于表格和按钮的字体设置。
3. 定义了show_results()函数,用于创建一个子界面,显示预测结果。这个函数接收一个参数results,其中每个元素是一个预测框的信息(包括中心点坐标、宽、高和类别),并在子界面中以表格的形式显示这些信息。同时,为每个预测框创建了一个“选择”按钮,用于选择对应的预测结果。
4. 定义了select_result()函数,用于在命令行中输出选择的预测结果。
5. 定义了site()函数,用于读取图像,获取预测结果,并调用show_results()函数显示预测结果。
6. 定义了一个GUI界面window,用于显示目标检测结果。这个界面包含一个按钮框架和一个确定按钮。按钮框架中包含了多个按钮,每个按钮对应一个类别的预测结果,点击按钮会调用show_results()函数显示对应的预测结果。
7. 运行主程序window.mainloop(),显示GUI界面。
总结:这个程序主要是通过tkinter模块实现了一个目标检测结果的GUI界面,方便用户直观地查看预测结果,并提供了选择预测结果的功能。
相关问题
import tkinter as tk from PIL import ImageTk, Image # 定义窗口的大小和标题 WINDOW_WIDTH = 500 WINDOW_HEIGHT = 500 WINDOW_TITLE = "点击图片进入应用程序" # 定义图片的大小和路径 IMAGE_WIDTH = 500 IMAGE_HEIGHT = 500 IMAGE_PATH = "background.jpg" # 定义标签的字体和大小 LABEL_FONT = ("Helvetica", 16) root = tk.Tk() root.geometry(f"{WINDOW_WIDTH}x{WINDOW_HEIGHT}") root.title(WINDOW_TITLE) bg_image = Image.open(IMAGE_PATH) bg_image = bg_image.resize((IMAGE_WIDTH, IMAGE_HEIGHT), Image.ANTIALIAS) bg_image = ImageTk.PhotoImage(bg_image) bg_label = tk.Label(root, image=bg_image) bg_label.place(x=0, y=0, relwidth=1, relheight=1) label = tk.Label(root, text="点击图片进入应用程序", font=LABEL_FONT) label.place(relx=0.5, rely=0.5, anchor="center") def enter_app(event): label.destroy() run_app() def run_app(): # 在这里添加你的应用程序代码 # ... bg_label.bind("<Button-1>", enter_app) root.mainloop()使此程序跳到下个程序时自动关闭窗口
要使程序在跳转到下一个程序时自动关闭窗口,可以将root的quit()方法绑定到enter_app函数中。这样,在enter_app函数中销毁标签后,调用root.quit()方法即可立即关闭窗口。下面是修改后的代码示例:
```
import tkinter as tk
from PIL import ImageTk, Image
# 定义窗口的大小和标题
WINDOW_WIDTH = 500
WINDOW_HEIGHT = 500
WINDOW_TITLE = "点击图片进入应用程序"
# 定义图片的大小和路径
IMAGE_WIDTH = 500
IMAGE_HEIGHT = 500
IMAGE_PATH = "background.jpg"
# 定义标签的字体和大小
LABEL_FONT = ("Helvetica", 16)
root = tk.Tk()
root.geometry(f"{WINDOW_WIDTH}x{WINDOW_HEIGHT}")
root.title(WINDOW_TITLE)
bg_image = Image.open(IMAGE_PATH)
bg_image = bg_image.resize((IMAGE_WIDTH, IMAGE_HEIGHT), Image.ANTIALIAS)
bg_image = ImageTk.PhotoImage(bg_image)
bg_label = tk.Label(root, image=bg_image)
bg_label.place(x=0, y=0, relwidth=1, relheight=1)
label = tk.Label(root, text="点击图片进入应用程序", font=LABEL_FONT)
label.place(relx=0.5, rely=0.5, anchor="center")
def enter_app(event):
label.destroy()
run_app()
root.quit() # 关闭窗口
def run_app():
# 在这里添加你的应用程序代码
# ...
bg_label.bind("<Button-1>", enter_app)
root.mainloop()
```
import tkinter as tk from tkinter import filedialog from PIL import ImageTk, Image # 创建窗口 window = tk.Tk() window.title("宝石预测") window.geometry("400x400") # 加载模型参数 para_state_dict = paddle.load("MyCNN") model = MyCNN() model.set_state_dict(para_state_dict) model.eval() # 加载标签字典 label_dict = train_parameters['label_dict'] # 创建预测函数 def predict(): # 获取待预测图片路径 img_path = filedialog.askopenfilename() img = Image.open(img_path) # 将处理后的图像数据转换为Image对象,并按照要求大小进行resize操作 img = Image.fromarray(np.uint8(img)).convert('RGB') img = img.resize((224, 224), Image.BILINEAR) img = np.array(img).astype('float32') img = img.transpose((2, 0, 1)) # HWC to CHW img /= 255 # 像素值归一化 img = np.array([img]) # 进行预测 img = paddle.to_tensor(img) out = model(img) label = np.argmax(out.numpy()) result = label_dict[str(label)] # 显示预测结果 result_label.config(text="预测结果:{}".format(result)) # 显示待预测图片 img = ImageTk.PhotoImage(Image.open(img_path).resize((200, 200))) img_label.config(image=img) img_label.image = img # 创建选择图片按钮 select_button = tk.Button(window, text="选择图片", command=predict) select_button.pack(pady=20) # 创建待预测图片区域 img_label = tk.Label(window) img_label.pack() # 创建预测结果区域 result_label = tk.Label(window, font=("Helvetica", 16)) result_label.pack(pady=20) # 进入消息循环 window.mainloop() 给这段代码添加使用cv2的均值滤波对彩色图片进行降噪的功能
可以在预测函数predict()中添加使用cv2的均值滤波对彩色图片进行降噪的功能,具体代码如下:
```python
import cv2
# 创建预测函数
def predict():
# 获取待预测图片路径
img_path = filedialog.askopenfilename()
img = Image.open(img_path)
# 均值滤波对彩色图片进行降噪
img = cv2.blur(np.array(img), (5,5))
# 将处理后的图像数据转换为Image对象,并按照要求大小进行resize操作
img = Image.fromarray(np.uint8(img)).convert('RGB')
img = img.resize((224, 224), Image.BILINEAR)
img = np.array(img).astype('float32')
img = img.transpose((2, 0, 1)) # HWC to CHW
img /= 255 # 像素值归一化
img = np.array([img])
# 进行预测
img = paddle.to_tensor(img)
out = model(img)
label = np.argmax(out.numpy())
result = label_dict[str(label)]
# 显示预测结果
result_label.config(text="预测结果:{}".format(result))
# 显示待预测图片
img = ImageTk.PhotoImage(Image.open(img_path).resize((200, 200)))
img_label.config(image=img)
img_label.image = img
```
在预测函数中,先使用cv2的blur函数对彩色图片进行均值滤波降噪,然后再将处理后的图像数据转换为Image对象,并按照要求大小进行resize操作,最后进行预测并显示结果。
阅读全文