小工具——筛选图像小工具

news2024/11/25 7:06:06

最近在公司手动筛图片,需要将某些含有检测目标的图像手动筛选出来用于做新模型的测试。我最开始是两个文件夹,来回复制粘贴,后来感觉这种效率太低了,就随手写了一个图像筛查小工具。代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QAction, QFileDialog
from PyQt5.QtGui import QPixmap, QIcon, QImage
from PyQt5.QtCore import Qt, QDir


class ImageViewer(QMainWindow):
    def __init__(self):
        super().__init__()

        self.current_index = 0
        self.image_files = []
        self.input_folder_path = ""
        self.output_folder_path = ""

        self.init_ui()

    def init_ui(self):
        # 创建布局
        layout = QVBoxLayout()

        # 创建标签用于显示图像
        self.image_label = QLabel(self)
        layout.addWidget(self.image_label)

        # 创建主窗口
        main_widget = QWidget()
        main_widget.setLayout(layout)
        self.setCentralWidget(main_widget)

        # 创建菜单栏
        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("文件")
        self.open_input_folder_action = QAction("打开导入图像文件夹", self)
        self.open_output_folder_action = QAction("打开保存图像文件夹", self)
        file_menu.addAction(self.open_input_folder_action)
        file_menu.addAction(self.open_output_folder_action)

        # 绑定事件处理函数
        self.open_input_folder_action.triggered.connect(self.open_input_folder)
        self.open_output_folder_action.triggered.connect(self.open_output_folder)

        # 设置窗口属性
        self.setWindowTitle("图像筛查工具")
        self.setGeometry(100, 100, 800, 600)

    def open_input_folder(self):
        # 打开输入文件夹
        folder_path = QFileDialog.getExistingDirectory(self, "选择输入文件夹", QDir.homePath())
        if folder_path:
            self.input_folder_path = folder_path
            self.load_images()

    def open_output_folder(self):
        # 打开输出文件夹
        folder_path = QFileDialog.getExistingDirectory(self, "选择输出文件夹", QDir.homePath())
        if folder_path:
            self.output_folder_path = folder_path

    def load_images(self):
        # 加载文件夹中的图像文件
        self.image_files = QDir(self.input_folder_path).entryList(["*.png", "*.jpg", "*.jpeg"], QDir.Files)
        if self.image_files:
            self.current_index = 0
            self.show_current_image()

    def show_current_image(self):
        # 显示当前图像
        image_path = QDir(self.input_folder_path).filePath(self.image_files[self.current_index])
        image = QImage(image_path)
        if not image.isNull():
            pixmap = QPixmap.fromImage(image)
            self.image_label.setPixmap(pixmap.scaled(self.image_label.size(), Qt.KeepAspectRatio,
                                                     Qt.SmoothTransformation))
            self.setWindowTitle(f"图像筛查工具 - {self.current_index + 1}/{len(self.image_files)}")

    def keyPressEvent(self, event):
        # 键盘事件处理
        if event.key() == Qt.Key_Right:
            # 切换到下一张图像
            if self.current_index < len(self.image_files) - 1:
                self.current_index += 1
                self.show_current_image()
        elif event.key() == Qt.Key_Left:
            # 切换到上一张图像
            if self.current_index > 0:
                self.current_index -= 1
                self.show_current_image()
        elif event.key() == Qt.Key_Space:
            # 保存当前图像到输出文件夹
            if self.current_index < len(self.image_files):
                image_path = QDir(self.input_folder_path).filePath(self.image_files[self.current_index])
                output_path = QDir(self.output_folder_path).filePath(self.image_files[self.current_index])
                QDir().rename(image_path, output_path)
                self.image_files.pop(self.current_index)
                self.show_current_image()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    viewer = ImageViewer()
    viewer.show()
    sys.exit(app.exec_())

首先要选择两个文件夹,一个用来导入数据,另外一个用来保存数据。导入文件夹,文件夹里面有大量图像,点击键盘右键可以切换到下一张,左键上一张,点击空格可以把这个图像保存到另外一个文件夹中。不过到最后一张的时候可能回异常退出,不过不影响使用所以我就没进行改进了。

下面是该工具的效果:

点击2选择源图像文件夹

点击3选择保存文件夹

这里的操作是剪切操作,并非复制操作。

 随便文件夹是保存的文件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图论-图的深度优先遍历-Java

回顾力扣144/94//145/102/589/590/429&#xff0c;熟练掌握递归和非递归写法。 图论不强调非递归。 使用邻接表 1个连通分量 Graph.java package Chapt02_DFS; import java.io.File; import java.io.IOException; import java.util.TreeSet; import java.util.Scanner;///…

66.C++多态与虚函数

目录 1.什么是多态 2.多态的分类 3.对象转型 3.1 向上转型&#xff1a; 3.2 向下转型&#xff1a; 4.虚函数 1.什么是多态 生活中的多态&#xff0c;是指的客观的事物在人脑中的主观体现。例如&#xff0c;在路上看到⼀只哈士奇&#xff0c;你可以看做是哈士奇&#xf…

Unity实战(10):如何将某个相机的画面做成贴图(RenderTexture)

目录 前言 一、创建物体、材质与相机 二、将RenderTexture赋给材质 2.1 修改rt1的一些属性 2.2 将rtMat1材质的shader改为Unlit/Texture&#xff0c;并将rt1赋给这个材质 三、效果呈现 前言 本文记录如何将某个相机的画面做成贴图&#xff0c;即游戏某些场景中小地图做法…

时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测

时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测 目录 时序预测 | MATLAB实现ICEEMDAN-iMPA-BiLSTM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 ICEEMDAN-iMPA-BiLSTM功率/风速预测 基于改进的自适应经验模态分解改进海洋捕食者算法双向长短期记忆…

基于SSM的农产品推广应用网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

华为云云耀云服务器L实例评测|centos系统搭建git私服

搭建git私服 前言一、云服务器二、服务器安装git三、服务器git配置1.创建文件用于存放公钥2.设置文件权限3.配置本地公钥 四、服务器部署git仓库四、git仓库到本地总结 前言 之前一直想搭建一个属于自己的git私服&#xff0c;然后没赶上厂商的活动&#xff0c;这次正好赶上华为…

学习笔记——树上哈希

普通子树哈希 树上的很多东西都是转化成链上问题的&#xff0c;比如树上哈希 树上哈希&#xff0c;主要是用于树的同构这个东西上的 什么是树的同构&#xff1f; 如图&#xff0c;不考虑节点编号&#xff0c;三棵树是同构的 将树转化成链&#xff0c;一般有两种方式&#xf…

mongodb安装全过程详解

mongodb安装全过程详解 安装mongodb环境安装mongodb shell 安装mongodb环境 进入mongodb官网下载社区版服务器 点击跳转下载地址 选择适应自己系统的版本&#xff0c;然后下载 下图为下载后的文件&#xff0c;双击进行安装 需要注意的两个点 ①选择完整安装 ②不下载mongo…

C语言——指针进阶(二)

目录 七.函数指针数组 八.指向函数指针数组的指针 九.回调函数 结尾 七.函数指针数组 说白了函数指针数组就是函数指针名字后面添加[ ]&#xff0c;二者结合成为数组。 那么这个函数指针数组到底有什么用呢&#xff1f;先不用着急&#xff0c;下面用一个计算器功能代码为大…

【Linux】——网络基础:http协议

目录 前言 应用层 认识协议 协议的概念 传输结构化数据 序列化和反序列化 网络版本计算器 服务器端Server 客户端Client 协议定制 其它 运行效果 HTTP协议 HTTP的简介 认识URL urlencode和urldecode HTTP协议格式 HTTP请求 HTTP响应 HTTP的方法 GET和POST…

时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化

时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于LMD局部均值分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LMD局部均值分解 直接替换Excel即可运行包含频谱图相关系数图 Matlab语言 1.算法新颖…

UMA 2 - Unity Multipurpose Avatar☀️七.UMA API介绍

文章目录 🟥 UMA Data DNA参数引用位置🟥 UMA API介绍🟥 UMA Data DNA参数引用位置 我们想通过代码去控制如图所示参数,达到捏脸的目的.下面就是可以控制的代码: _dna["headSize"].Set(1); _avatar.BuildCharacter();我们观察发现操控代码类似Material去设置…

01_瑞萨GUI(LVGL)移植实战教程之软件和硬件准备

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 1. 软件和硬件准备 1.1 本节要点 本节学习如何搭建开发环境&#xff0c;硬件接线&#xff0c;为我们后续的学习做好基础必要的准备。 1.2资料准备 本文档所有用到…

flink 端到端一致性

背景 我们经常会混淆flink提供的状态一致性保证和数据端到端一致性保证的关系&#xff0c;总以为他们表达的是同一个意思&#xff0c;事实上&#xff0c;他们不是一个含义&#xff0c;flink只能保证其维护的内部状态的一致性&#xff0c;而数据端到端的一致性需要数据源&#…

Python下载、安装及如何配置Pycharm(Windows 11)详细教程

本文介绍在Windows 11系统Python的下载、安装及配置Pycharm 一、下载 官网地址&#xff1a;https://www.python.org/downloads/windows/ 1、选择Python 3.10.5版本下载 二、安装 1、选择自定义安装 2、全部默认勾选&#xff0c;点击Next 3、自定义安装路径 建议勾选inst…

il2cpp分析-gobal-metadata.dat解密

gobal-metadata.dat解密 工具:010Editor,IDA 7.5,Jadx,VS Code 样本Last Island of Survival_6.3_Apkpure.xapk 分析Il2cpp文件 打开ida,把libil2cpp拖到ida中按快捷键ShiftF12等待字符串分析完后,搜索global-metadata.dat 双击搜索出来的结果 点击aGlobalMetadata 然后…

【并发编程八股】进程、线程、并发编程三大特性

目录 进程与线程的概念&#xff1f;串行、并行、并发的概念&#xff1f;同步异步、阻塞非阻塞的概念&#xff1f;线程的创建的方式&#xff1f;继承 Thread 类&#xff0c;重写 run 方法实现Runnable接口&#xff0c;重写 run 方法实现Callable&#xff0c;重写 call 方法&…

蚂蚁链发布全新Web3品牌ZAN,涉及RWA、合规等服务

9月8日&#xff0c;在外滩大会见解论坛「从科幻到科技&#xff1a;Web3、元宇宙、AIGC」现场上&#xff0c;蚂蚁集团旗下的蚂蚁链联合Everest Ventures Group、HASHKEY、Morpheus labs发布全新Web3品牌ZAN。原蚂蚁链CTO张辉担任ZAN CEO。 该品牌致力于服务Web3机构客户与Web3应…

【数据结构】学习笔记

文章目录 绪论线性表栈、队列、数组串树与二叉树图查找排序 绪论 线性表 栈、队列、数组 串 树与二叉树 图 查找 排序

2023/9/9总结

nodejs Node.js 是基于chrome的v8引擎封装&#xff0c;独立执行于JavaScript代码的环境 Node.js环境中没有BOM和DOM 作用&#xff1a; 编写后端程序&#xff1a;提供数据和网页资源等 前端工程化&#xff1a;集成各种开发中使用的工具和技术 fs模块--读写文件 模块&#xf…