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 相关文章推荐
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
linux环境下python中MySQLdb模块的安装方法
Jun 16 Python
一份python入门应该看的学习资料
Apr 11 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
Python @property使用方法解析
Sep 17 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 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 中dirname(_file_)讲解
2007/03/18 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
JavaScript中模拟实现jsonp
2015/06/19 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
js实现截图保存图片功能的代码示例
2017/02/16 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
vue select选择框数据变化监听方法
2018/08/24 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
Python编程之多态用法实例详解
2015/05/19 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
python3爬取torrent种子链接实例
2020/01/16 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
开学典礼感言
2014/02/16 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
muduo TcpServer模块源码分析
2022/04/26 Redis
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL