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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
python之wxPython菜单使用详解
Sep 28 Python
Python类的动态修改的实例方法
Mar 24 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
python使用正则来处理各种匹配问题
Dec 22 Python
python requests模拟登陆github的实现方法
Dec 26 Python
python3 实现口罩抽签的功能
Mar 11 Python
Python OrderedDict字典排序方法详解
May 21 Python
Python中的Cookie模块如何使用
Jun 04 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
解决pytorch 模型复制的一些问题
Mar 03 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
wamp安装后自定义配置的方法
2014/08/23 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
如何手工释放资源
2013/12/15 面试题
怎么写有吸引力的自荐信
2013/11/17 职场文书
党员承诺践诺书
2014/05/20 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
晚会闭幕词
2015/01/28 职场文书
公司出纳岗位职责
2015/03/31 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
Python实现打乒乓小游戏
2021/09/25 Python
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js