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之引用和类属性的初步理解
May 15 Python
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
Python实现给文件添加内容及得到文件信息的方法
May 28 Python
python+opencv识别图片中的圆形
Mar 25 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
利用ImageAI库只需几行python代码实现目标检测
Aug 09 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
python爬虫泛滥的解决方法详解
Nov 25 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
JS变量及其作用域
2017/03/29 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
利用Python开发微信支付的注意事项
2016/08/19 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
python中有函数重载吗
2020/05/28 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
村创先争优活动总结
2014/08/28 职场文书
工作散漫检讨书
2014/09/16 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
会议主持词结束语
2015/07/03 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
Python echarts实现数据可视化实例详解
2022/03/03 Python