from PIL import Image import tkinter as tk def show_results(results): # 创建子界面 win = tk.Toplevel() win.geometry("400x400") win.title("子界面") # 创建表格 table = tk.Frame(win) table.pack() # 创建表头 tk.Label(table, text="X").grid(row=0, column=0) tk.Label(table, text="Y").grid(row=0, column=1) tk.Label(table, text="W").grid(row=0, column=2) tk.Label(table, text="H").grid(row=0, column=3) tk.Label(table, text="类别").grid(row=0, column=4) # 创建表格内容 for i, s1 in enumerate(results): tk.Label(table, text=s1[0]).grid(row=i + 1, column=0) tk.Label(table, text=s1[1]).grid(row=i + 1, column=1) tk.Label(table, text=s1[2]).grid(row=i + 1, column=2) tk.Label(table, text=s1[3]).grid(row=i + 1, column=3) tk.Label(table, text=s1[4]).grid(row=i + 1, column=4) # 创建选择按钮 select_button = tk.Button(table, text="选择", command=lambda s=s1: select_result(s)) select_button.grid(row=i + 1, column=5) # 定义选择结果函数 def select_result(result): print("选择的是:", result) 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() window.geometry("400x400") # 创建按钮 for name in set([r[4] for r in results]): tk.Label(window, text=name).pack() button = tk.Button(window, text="显示" + name + " 的结果", command=lambda name=name: show_results([r[:4]+[name] for r in results if r[4] == name])) button.pack() # 创建确定按钮 confirm_button = tk.Button(window, text="退出", command=window.quit) confirm_button.pack() window.mainloop()
时间: 2023-12-29 16:04:48 浏览: 38
这段代码是一个目标检测模型的GUI界面,可以显示检测结果并选择特定类别的检测结果进行查看。其中的函数 `site` 接收模型的预测结果,将其转化为可视化的框,并将不同类别的框分别通过按钮进行显示。函数 `show_results` 则是创建子界面用于显示检测结果的表格,每个结果都包括目标框的位置和大小,以及所属类别,并且可以选择不同的结果进行查看。
相关问题
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() 详细分析这个程序是怎么实现的
这个程序主要是实现了一个目标检测结果的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界面,方便用户直观地查看预测结果,并提供了选择预测结果的功能。
from PIL import Image import tkinter as tk def site(source, pred, names): img = Image.open(source) x1, x2 = img.size print(x1) print(x2) print(img.size) results = {} for i1 in pred: s = [] for i2 in i1.data.cpu().numpy(): s1 = [] s = list(i2) # 获取中心的(x,y)坐标 x = s[0] = float(round((s[0] + s[2]) / x1 / 2, 4)) y = s[1] = float(round((s[1] + s[3]) / x2 / 2, 4)) # 位置判断 if x < 0.5 and y < 0.5: w = "2 site" elif x < 0.5 and y > 0.5: w = "3 site" elif x > 0.5 and y > 0.5: w = "4 site" else: w = "1 site" s1.append(x) s1.append(y) s1.append(s[2] - s[0]) # 预测框的宽 s1.append(s[3] - s[1]) # 预测框的高 s1.append(names[int(s[5])]) if s[4] < 0.6: break s1.append(w) # 将信息按物体分组 if names[int(s[5])] not in results: results[names[int(s[5])]] = [] results[names[int(s[5])]].append(s1) # 创建GUI界面 window = tk.Tk() window.geometry("800x600") # 创建按钮 for name in results.keys(): tk.Label(window, text="Object " + name + ":").pack() button = tk.Button(window, text="Show " + name + " results", command=lambda name=name: show_results(results[name])) button.pack() # 创建确定按钮 confirm_button = tk.Button(window, text="Confirm and Exit", command=window.quit) confirm_button.pack() def show_results(results): # 创建子界面 win = tk.Toplevel() window.geometry("800x600") win.title("Results") # 创建表格 table = tk.Frame(win) table.pack() # 创建表头 tk.Label(table, text="x").grid(row=0, column=0) tk.Label(table, text="y").grid(row=0, column=1) tk.Label(table, text="width").grid(row=0, column=2) tk.Label(table, text="height").grid(row=0, column=3) tk.Label(table, text="class").grid(row=0, column=4) # 创建表格内容 for i, s1 in enumerate(results): tk.Label(table, text=s1[0]).grid(row=i + 1, column=0) tk.Label(table, text=s1[1]).grid(row=i + 1, column=1) tk.Label(table, text=s1[2]).grid(row=i + 1, column=2) tk.Label(table, text=s1[3]).grid(row=i + 1, column=3) tk.Label(table, text=s1[4]).grid(row=i + 1, column=4) # 创建选择按钮 select_button = tk.Button(table, text="Select", command=lambda s=s1: select_result(s)) select_button.grid(row=i + 1, column=5) # 定义选择结果函数 def select_result(result): print("Selected result:", result) window.mainloop()修改这个程序将控制台输出x,y,宽,高经摄像头不动机械臂动自动手眼标定后与类别一块输出
首先,需要修改site函数中对预测框的信息处理部分,将其保存到一个字典中,其中键为类别,值为包含该类别所有预测框信息的列表。具体修改如下:
```python
def site(source, pred, names):
img = Image.open(source)
x1, x2 = img.size
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]) / x1 / 2, 4))
y = s[1] = float(round((s[1] + s[3]) / x2 / 2, 4))
if x < 0.5 and y < 0.5:
w = "2 site"
elif x < 0.5 and y > 0.5:
w = "3 site"
elif x > 0.5 and y > 0.5:
w = "4 site"
else:
w = "1 site"
s1.append(x)
s1.append(y)
s1.append(s[2] - s[0])
s1.append(s[3] - s[1])
s1.append(names[int(s[5])])
if s[4] < 0.6:
break
s1.append(w)
if names[int(s[5])] not in results:
results[names[int(s[5])]] = []
results[names[int(s[5])]].append(s1)
return results
```
然后,在GUI界面中,需要修改按钮的回调函数,使其调用show_results函数显示所有预测框的信息,同时在表格中添加一列用于显示预测框的类别。具体修改如下:
```python
def button_callback(results):
win = tk.Toplevel()
win.geometry("800x600")
win.title("Results")
table = tk.Frame(win)
table.pack()
tk.Label(table, text="x").grid(row=0, column=0)
tk.Label(table, text="y").grid(row=0, column=1)
tk.Label(table, text="width").grid(row=0, column=2)
tk.Label(table, text="height").grid(row=0, column=3)
tk.Label(table, text="class").grid(row=0, column=4)
tk.Label(table, text="location").grid(row=0, column=5)
i = 1
for name, boxes in results.items():
tk.Label(table, text="Object " + name + ":").grid(row=i, column=0, columnspan=5)
i += 1
for box in boxes:
tk.Label(table, text=box[0]).grid(row=i, column=0)
tk.Label(table, text=box[1]).grid(row=i, column=1)
tk.Label(table, text=box[2]).grid(row=i, column=2)
tk.Label(table, text=box[3]).grid(row=i, column=3)
tk.Label(table, text=box[4]).grid(row=i, column=4)
tk.Label(table, text=box[5]).grid(row=i, column=5)
i += 1
confirm_button = tk.Button(win, text="Confirm and Exit", command=win.quit)
confirm_button.pack()
```
最后,在主程序中调用site函数获取预测框信息,并将其传递给按钮回调函数。具体修改如下:
```python
results = site(source, pred, names)
button = tk.Button(window, text="Show Results", command=lambda: button_callback(results))
button.pack()
```
这样,程序就会在GUI界面中显示所有预测框的信息,包括它们的位置、大小、类别和在图像中的位置。
阅读全文