PyQt5实现简单数据标注工具


Posted in Python onMarch 18, 2019

本文实例为大家分享了PyQt5实现简单数据标注工具的具体代码,分类用,供大家参考,具体内容如下

PyQt5实现简单数据标注工具

第一个最大的图片是当前要标注的类别,接下来的两个图片是对接下来会出现的图片的预览(方便连续点好几个)。分类之后的会保存到和按钮名字一样的文件夹里面,如果文件夹不存在就会自动新建一个(makedirs)。如果中断了标注,可以修改代码中的self.idx属性,从某个位置开始。

视频效果:地址链接

接下来是代码:

from PyQt5.QtWidgets import QApplication,QPushButton,QLabel,QMainWindow
from PyQt5.QtGui import QFont,QPixmap
import sys,os
import shutil
 
def copyfile(srcfile, dstfile):#用来复制文件,源文件会保留
 
  if not os.path.isfile(srcfile):
    print("%s not exist!" % srcfile)
  else:
    f_path, f_name = os.path.split(dstfile) # 分离文件名和路径
    if not os.path.exists(f_path):
      os.makedirs(f_path) # 创建路径
    shutil.copyfile(srcfile, dstfile) # 复制文件
    print("copy %s -> %s" % (srcfile, dstfile))
class mainForm(QMainWindow):
  def __init__(self):
    super(mainForm, self).__init__()
 
    self.img_path="faces/" #文件夹和py文件要再同一个目录下面
    self.img_list=os.listdir(self.img_path) #获取目录下的所有文件
    self.idx=0#可以改这里,选择程序运行的时候第一个显示的图片是哪一个
 
    self.initUI()
    self.show()
  def initUI(self):
    font=QFont()
    font.setPixelSize(20)#新建一个字体控件
 
    self.setWindowTitle("label_me")#设置窗体的标题
    self.setGeometry(0,0,900,600)#位置和大小
 
    button_list=["Chandler","Phoebe","Joey","Monica","Rachel","Ross","Others","Thing",]#这里是显示的按钮们,也是可能的类别数
 
    for idx, label_name in enumerate(button_list):
 
      button=QPushButton(label_name,self)
      button.move(idx*110+20,500)
      button.setFont(font)
      button.setFixedHeight(35)
 
      button.clicked.connect(self.classify)#动态控件绑定同一个事件,根据事件的sender判断是哪个按钮按下
 
    self.lbl_list=[]#存放显示图片的label 的list
    for i in range(self.get_remainder()):
 
      self.pix = QPixmap(self.img_path+self.img_list[self.idx+i])
      label_img = QLabel(self)
      label_img.setGeometry(360*i+10, 400-100*(3-i)+40, 100*(3-i)+40,100*(3-i)+40)
      label_img.setStyleSheet("border:2px solid red")
      label_img.setPixmap(self.pix)#设置label控件要显示的图片
      label_img.setScaledContents(True)
      self.lbl_list.append(label_img)
 
  def get_remainder(self):#打算是要显示3个label图片,如果是到了最后,显示不了那么多了。
    r=len(self.img_list)-self.idx
    if r>3:
      r=3
    return r
  def clear_lbls(self):#最后的时候会用到,不显示某些label
    for i in range(len(self.lbl_list)):
      self.lbl_list[i].hide()
 
  def classify(self):
 
    sender = self.sender()
    dir_path=sender.text()+"/"#获取按钮的text属性
 
    current_img_path=self.img_list[self.idx]#获取刚刚被分类的图片的路径
    copyfile(self.img_path+current_img_path , dir_path+current_img_path)
    self.idx +=1#下一个图片
    img_full_path = [self.img_path + self.img_list[self.idx + i]  for i in range(self.get_remainder())]
 
    self.clear_lbls()
    for i in range(self.get_remainder()):
 
      pix = QPixmap(img_full_path[i])
      self.lbl_list[i].setPixmap(pix)
      self.lbl_list[i].show()
    self.setWindowTitle("当前是第 %d 个图片"%self.idx)
 
app=QApplication(sys.argv)
f=mainForm()
sys.exit(app.exec())

如果有什么需要完善的地方,请提出。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
python数据处理实战(必看篇)
Jun 11 Python
python僵尸进程产生的原因
Jul 21 Python
Python中Numpy包的安装与使用方法简明教程
Jul 03 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
Python3内置模块random随机方法小结
Jul 13 Python
Django 路由控制的实现
Jul 17 Python
Python爬虫HTPP请求方法有哪些
Jun 03 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 Python
Python简单I/O操作示例
Mar 18 #Python
python实现简单图片物体标注工具
Mar 18 #Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 #Python
Python动态赋值的陷阱知识点总结
Mar 17 #Python
Python将字符串常量转化为变量方法总结
Mar 17 #Python
实例讲解Python中整数的最大值输出
Mar 17 #Python
python3+selenium自动化测试框架详解
Mar 17 #Python
You might like
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
js仿360开机效果
2019/12/26 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
python非递归全排列实现方法
2017/04/10 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
Python语言异常处理测试过程解析
2020/01/08 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
关于打架的检讨书
2014/01/17 职场文书
庆六一开幕词
2015/01/29 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
MySQL基于索引的压力测试的实现
2021/11/07 MySQL
Python OpenCV之常用滤波器使用详解
2022/04/07 Python