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参数和作用域的使用
Nov 01 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
Python计时相关操作详解【time,datetime】
May 26 Python
Python通用循环的构造方法实例分析
Dec 19 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
Python设计模式之工厂方法模式实例详解
Jan 18 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
python统计指定目录内文件的代码行数
Sep 19 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
Python unittest单元测试框架实现参数化
Apr 29 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
php实现简单四则运算器
2020/11/29 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
初始Nodejs
2014/11/08 NodeJs
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
图文详解vue框架安装步骤
2019/02/12 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
2019/10/23 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
Javascript如何实现双指控制图片功能
2020/02/25 Javascript
在Django的上下文中设置变量的方法
2015/07/20 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
Django 开发环境与生产环境的区分详解
2019/07/26 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
给老师的道歉信
2014/01/11 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
毕业设计论文评语
2014/12/31 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
2015元旦感言
2015/12/09 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis