代码:

import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import cv2
from PIL import Image, ImageTk
import osclass ImageBoxApp:def __init__(self, master):self.master = masterself.master.title("Image Box Drawer")# 第一行:加载TXT文件夹和TXT路径显示self.txt_frame = tk.Frame(master)self.txt_frame.pack()self.load_txt_button = tk.Button(self.txt_frame, text="加载TXT文件夹", command=self.load_txt_folder)self.load_txt_button.pack(side=tk.LEFT)self.txt_path_label = tk.Label(self.txt_frame, text="TXT 文件夹路径: ")self.txt_path_label.pack(side=tk.LEFT)# 第二行:加载图像文件夹和图像路径显示self.img_frame = tk.Frame(master)self.img_frame.pack()self.load_img_button = tk.Button(self.img_frame, text="加载图像文件夹", command=self.load_img_folder)self.load_img_button.pack(side=tk.LEFT)self.img_path_label = tk.Label(self.img_frame, text="图像文件夹路径: ")self.img_path_label.pack(side=tk.LEFT)# 图像显示self.image_label = tk.Label(master)self.image_label.pack()# 最后一行:上一张、下一张按钮和当前图像路径显示self.button_frame = tk.Frame(master)self.button_frame.pack()self.prev_button = tk.Button(self.button_frame, text="上一张", command=self.prev_image)self.prev_button.pack(side=tk.LEFT)self.next_button = tk.Button(self.button_frame, text="下一张", command=self.next_image)self.next_button.pack(side=tk.LEFT)self.image_path_label = tk.Label(self.button_frame, text="当前图像路径: ")self.image_path_label.pack(side=tk.LEFT)self.txt_folder = Noneself.img_folder = Noneself.txt_files = []self.img_files = []self.current_index = 0def load_txt_folder(self):self.txt_folder = filedialog.askdirectory()if not self.txt_folder:returnself.txt_files = [f for f in os.listdir(self.txt_folder) if f.endswith('.txt')]if not self.txt_files:messagebox.showerror("错误", "该文件夹中没有TXT文件")else:self.txt_path_label.config(text=f"TXT 文件夹路径: {self.txt_folder}")def load_img_folder(self):self.img_folder = filedialog.askdirectory()if not self.img_folder:returnself.img_files = [f for f in os.listdir(self.img_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]if not self.img_files:messagebox.showerror("错误", "该文件夹中没有图像文件")else:self.img_path_label.config(text=f"图像文件夹路径: {self.img_folder}")self.current_index = 0self.show_image()def show_image(self):if self.img_files and self.txt_files:img_path = os.path.join(self.img_folder, self.img_files[self.current_index])txt_path = os.path.join(self.txt_folder, self.txt_files[self.current_index])self.image_path_label.config(text=f"当前图像路径: {img_path}")self.draw_boxes(img_path, txt_path)def draw_boxes(self, image_path, txt_path):image = cv2.imread(image_path)height, width, _ = image.shapewith open(txt_path, 'r') as f:lines = f.readlines()for line in lines:parts = line.strip().split()class_id = int(parts[0])x_center = float(parts[1]) * widthy_center = float(parts[2]) * heightbox_width = float(parts[3]) * widthbox_height = float(parts[4]) * heightx1 = int(x_center - box_width / 2)y1 = int(y_center - box_height / 2)x2 = int(x_center + box_width / 2)y2 = int(y_center + box_height / 2)cv2.rectangle(image, (x1, y1), (x2, y2), (255, 0, 0), 2)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image = Image.fromarray(image)image = ImageTk.PhotoImage(image)self.image_label.config(image=image)self.image_label.image = imagedef prev_image(self):if self.img_files and self.txt_files:if self.current_index == 0:messagebox.showinfo("提示", "已经是第一张图像")else:self.current_index -= 1self.show_image()def next_image(self):if self.img_files and self.txt_files:if self.current_index == len(self.img_files) - 1:messagebox.showinfo("提示", "已经是最后一张图像")else:self.current_index += 1self.show_image()if __name__ == "__main__":root = tk.Tk()app = ImageBoxApp(root)root.mainloop()

测试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/83102.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/83102.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/83102.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 文件覆盖机制与实践:以 mv 命令为切入点

引言:文件覆盖的本质 文件覆盖是 Linux 文件系统中常见的操作,指的是在目标路径已存在文件的情况下,将源文件的内容写入目标文件,导致目标文件的原有内容被替换。在 Linux 中,文件覆盖通常通过命令行工具(…

学习路之PHP--easyswoole操作数据库

学习路之PHP--easyswoole操作数据库 0、安装orm插件一、创建数据库二、创建模型三、控制器显示四、效果五、问题 0、安装orm插件 composer require easyswoole/orm一、创建数据库 表: CREATE TABLE cases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,titl…

手写multi-head Self-Attention,各个算子详细注释版

文章目录 MultiHeadAttentionFormal的实现操作详解1. 🔍 attention_mask2. 🔍 matmul✅ 其他实现方式1. 使用 运算符(推荐简洁写法)2. 使用 torch.einsum()(爱因斯坦求和约定)3. 使用 torch.bmm()&#xf…

尚硅谷redis7 41-46 redis持久化之AOF异常恢复演示

AOF每一秒钟写入一次。当内容才写了一小半,没有写完整时,突然,redis挂了,导致aof文件错误。 故意乱写正常的AOF文件,模拟网络闪断文件写error 重启 Redis 之后就会进行AOF文件的载入,发现启动都失败 首先cd /usr/local/bin 异常修复命令:redis-check-aof -- fix 进…

004时装购物系统技术解析:构建智能时尚消费平台

时装购物系统技术解析:构建智能时尚消费平台 在电商行业蓬勃发展的当下,时装购物系统凭借其便捷性与多样性,成为消费者选购时尚单品的重要渠道。该系统通过商品信息、订单管理等核心模块,结合前台展示与后台录入功能,…

数据湖 (特点+与数据仓库和数据沼泽的对比讲解)

数据湖就像一个“数据水库”,把企业所有原始数据(结构化的表格、半结构化的日志、非结构化的图片/视频)原样存储,供后续按需分析。 对比传统数据仓库: 数据仓库数据湖数据清洗后的结构化数据(如Excel表格&…

深度剖析Node.js的原理及事件方式

早些年就接触过Node.js,当时对于这个连接前后端框架就感到很特别。尤其是以独特的异步阻塞特性,重塑了了服务器端编程的范式。后来陆陆续续做了不少项目,通过实践对它或多或少增强了不少理解。今天,我试着将从将从原理层剖析其运行…

【AI预测】5月30日尼克斯大战前瞻:东部黑马能否再下一城?

🏀 随着赛季进入白热化阶段,5月30日尼克斯的这场比赛注定焦点十足。作为东部近年来少有的“黑马型”球队,尼克斯用硬朗的防守和团队配合让人重新认识了这支老牌劲旅。 这篇文章,我们将从数据模型球员表现战术执行力三个维度&…

人工智能赋能基础教育个性化学习的理论建构与实践探索

一、引言 1.1 研究背景与意义 随着科技的飞速发展,人工智能(Artificial Intelligence,AI)已逐渐成为推动社会进步的重要力量。在教育领域,人工智能的应用正逐步改变传统的教学模式,为个性化学习提供了新…

历年四川大学计算机保研上机真题

2025四川大学计算机保研上机真题 2024四川大学计算机保研上机真题 2023四川大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 分数求和 题目描述 有一分数序列: 2 / 1 2/1 2/1, 3 / 2 3/2 3/2, 5 / 3 5/3 5/3, 8 / 5 8/5 8/5, 13 /…

正点原子Z15I ZYNQ 开发板发布!板载PCIe2.0、SPFx2、MIPI CSI等接口,资料丰富!

正点原子Z15I ZYNQ 开发板发布!板载PCIe2.0、SPFx2、MIPI CSI等接口,资料丰富! 正点原子Z15I ZYNQ开发板,核心板全工业级设计,主控芯片的型号是XC7Z015CLG485-2I。开发板由核心板+底板组成,外设…

Ubuntu 22.04 上使用 Docker 安装 RagFlow

GitHub地址:添加链接描述 RAGFlow 是一款开源的检索增强生成(Retrieval-Augmented Generation,简称 RAG)引擎,旨在通过深度文档理解技术,结合大语言模型(LLM),为用户提供高质量、可溯源的问答服务。 🚀 快速入门 RAGFlow 提供了便捷的部署方式,支持 Docker 环境。…

【论文阅读】DanceGRPO: Unleashing GRPO on Visual Generation

DanceGRPO: Unleashing GRPO on Visual Generation 原文摘要 研究背景与问题 生成模型的突破:扩散模型和整流流等生成模型在视觉内容生成领域取得了显著进展。核心挑战:如何让模型的输出更好地符合人类偏好仍是一个关键问题。现有方法的局限性&#xff1…

Milvus可视化客户端Attu安装与使用指南

导读:在向量数据库运维管理中,开发者往往面临着复杂的命令行操作和繁琐的API调用挑战。作为Milvus向量数据库的官方图形化管理工具,Attu为这一痛点提供了优雅的解决方案。 本文深入解析Attu的核心架构和实用功能,重点介绍其在数据…

C# 结合PaddleOCRSharp搭建Http网络服务

Windows打开端口: 控制面板 > 系统和安全 > 防火墙> 高级设置 → 入站规则 → 右侧选择 → 新建规则 → 端口 → 协议类型 TCP→ 端口 using System; using System.Drawing; using System.IO; using System.Net; using System.Text; using System.Threadi…

【论文精读】2024 ECCV--MGLD-VSR现实世界视频超分辨率(RealWorld VSR)

文章目录 一、摘要二、问题三、Method3.1 Latent Diffusion Model3.2 Motion-guided Diffusion Sampling3.3 Temporal-aware Decoder Fine-tuning 四、实验设置4.1 训练阶段4.2 训练数据 贡献总结 论文全称: Motion-Guided Latent Diffusion for Temporally Consis…

初学c语言21(文件操作)

一.为什么使用文件 之前我们写的程序的数据都是存储到内存里面的,当程序结束时,内存回收,数据丢失, 再次运行程序时,就看不到上次程序的数据,如果要程序的数据一直保存得使用文件 二.文件 文件一般可以…

历年厦门大学计算机保研上机真题

2025厦门大学计算机保研上机真题 2024厦门大学计算机保研上机真题 2023厦门大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 数字变换过程的最大值与步数 题目描述 输入一个数字 n n n,如果 n n n 是偶数就将该偶数除以 2 2 2&…

MySql--定义表存储引擎、字符集和排序规则

示例: CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,email VARCHAR(100) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;注意事项: 字符集和排序规则可以按列覆盖表…

深耕数字化赛道,联众优车以创新风控体系构筑汽车金融护城河

近年来,在汽车金融市场规模持续扩大的行业背景下,企业风险管理能力已成为决定市场竞争格局的关键要素。面对快速扩张的市场需求,银保监会2024年发布的《汽车金融公司监管评级办法》明确要求行业强化风控能力建设,央行《金融科技发…