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操作CouchDB的方法
Oct 08 Python
Python脚本实现自动将数据库备份到 Dropbox
Feb 06 Python
pandas表连接 索引上的合并方法
Jun 08 Python
用python爬取租房网站信息的代码
Dec 14 Python
Python中拆分字符串的操作方法
Jul 23 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
利用Python实现kNN算法的代码
Aug 16 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
python numpy库np.percentile用法说明
Jun 08 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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循环输出数据库内容的代码
2008/05/24 PHP
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
Thinkphp搜索时首页分页和搜索页保持条件分页的方法
2014/12/05 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
JS 树形递归实例代码
2010/05/18 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
2013/01/24 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
Javascript验证方法大全
2015/09/21 Javascript
js实现继承的5种方式
2015/12/01 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
[00:57]深扒TI7聊天轮盘语音出处5
2017/05/11 DOTA
python3.x实现发送邮件功能
2018/05/22 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
沃达丰英国有限公司:Vodafone英国
2019/04/16 全球购物
新闻发布会主持词
2014/03/28 职场文书
中层干部考核评语
2015/01/04 职场文书
教师节感谢信
2015/01/22 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书