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转换摩斯密码示例
Feb 16 Python
python 读写txt文件 json文件的实现方法
Oct 22 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 Python
Python 从相对路径下import的方法
Dec 04 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Django实现文件上传和下载功能
Oct 06 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
Python @property装饰器原理解析
Jan 22 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
May 15 Python
pandas.DataFrame.drop_duplicates 用法介绍
Jul 06 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
Nov 24 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下过滤HTML代码的函数
2007/12/10 PHP
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
给网站上的广告“加速”显示的方法
2007/04/08 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
大三毕业自我鉴定
2014/01/15 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
Python中的 Set 与 dict
2022/03/13 Python
Go 中的空白标识符下划线
2022/03/25 Golang
Java获取字符串编码格式实现思路
2022/09/23 Java/Android