前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图像标注版本1-基本标注框

图像标注版本1-基本标注框

作者头像
python与大数据分析
发布于 2023-09-04 10:48:24
发布于 2023-09-04 10:48:24
32800
代码可运行
举报
运行总次数:0
代码可运行

关于图像标注软件,业界已经有LabelImg、Labelme、VATIC、Label Studio、Prodigy、Datasaur等开源或商业的工具。

由于某种需要,本人需要开发一款数据标注工具,也尝试过阅读Labelme和LabelImg代码,但无奈水平有限放弃了,最后决定借鉴其标注界面和思想。

此外图像标注,之前试过simpleGUI,但交互性有点弱,决定用pyqt5重构一下,图像标注主要包括图像文件夹的选择,图像的预览,图像标注框选,图像标注Label选择,图像标注结果存储,甚至图像的放大缩小,子功能还是多的,关于图像的处理软件用QGraphicsView还是QLabel也有不同选择。

目前本人已经实现了四个版本:

第一个版本,最基本的图像标注,可以将标注框显示在图片上,这个版本在网上能见到的代码是最多的,也是最没什么难度的,参考了那么多代码,还是要感谢一下之前贡献的兄弟们。

第二个版本,最常见到的图像标注,多个标注框显示在图片上

第三个版本,实现了标注Label的选择,并且将结果保存下来

第四个版本,实现了基于当前位置双击后,被标注框的高亮显示和删除

第五个版本,对标注框结果进行各种类型的保存

这个图将以后作为标注的基准图片。

一、自定义一个QLabel

在QLabel中定义初始化、鼠标点击、鼠标移动、鼠标释放和图像绘制事件。

鼠标点击及按下意味着初始坐标

鼠标移动记录标注的动作,可以画也可以不画

鼠标释放记录标注框的终点

图像绘制事件中,主要交换了一下标注框的坐标,网上很多是错的,导致标注结果不对。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from PyQt5.QtWidgets import QWidget, QApplication, QLabel
from PyQt5.QtCore import QRect, Qt
from PyQt5.QtGui import QPixmap, QPainter, QPen
import sys

# 重定义QLabel,实现绘制事件和各类鼠标事件
class MyLabel(QLabel):
    def __init__(self, parent=None):
        '''
        :param parent:
        初始化基本参数
        '''
        super(MyLabel, self).__init__(parent)
        self.x0 = 0
        self.y0 = 0
        self.x1 = 0
        self.y1 = 0
        self.rect = QRect()
        self.flag = False

    # 单击鼠标触发事件
    # 获取鼠标事件的开始位置
    def mousePressEvent(self, event):
        # 将绘制标志设置为True
        self.flag = True
        self.x0 = event.pos().x()
        self.y0 = event.pos().y()

    # 鼠标移动事件
    # 绘制鼠标行进过程中的矩形框
    def mouseMoveEvent(self, event):
        if self.flag:
            self.x1 = event.pos().x()
            self.y1 = event.pos().y()
            self.update()

    # 鼠标释放事件
    def mouseReleaseEvent(self, event):
        # 将绘制标志设置为False
        self.flag = False

    # 绘制事件
    def paintEvent(self, event):
        super().paintEvent(event)
        # 构造矩形框的起始坐标和宽度、高度
        x0 = min(self.x0, self.x1)
        y0 = min(self.y0, self.y1)
        x1 = max(self.x0, self.x1)
        y1 = max(self.y0, self.y1)
        width = x1 - x0
        height = y1 - y0
        rect = QRect(x0, y0, width, height)
        # 构造QPainter,进行矩形框绘制
        painter = QPainter(self)
        painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))
        painter.drawRect(rect)

二、实例化标注框,在一个主界面中显示标注框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 窗口类
class LabelV1(QWidget):
    def __init__(self):
        super(LabelV1, self).__init__()
        self.initUI()

    def initUI(self):
        self.resize(960, 540)
        self.move(100, 50)
        self.setWindowTitle('Label标注框1.0版本')
        # 加载重定义的label
        self.lbl = MyLabel(self)
        # 构造QPixmap,加载待标注图片
        img = QPixmap('010.png')
        # 在自定义label中显示QImage
        self.lbl.setPixmap(img)
        self.lbl.setCursor(Qt.CrossCursor)
        self.show()

三、在一个main函数中,显示主窗口,其他功能暂时不需要

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == '__main__':
    app = QApplication(sys.argv)
    labelwin = LabelV1()
    sys.exit(app.exec())

最后的标注成果

其他几个版本会陆续把代码和思想放出来,敬请关注!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)
learn from 《PyQt5 快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Docs/PyQt5
Michael阿明
2022/05/10
2K0
PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)
QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备
Arya
2024/11/06
2640
QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备
PyQt5案例汇总(完整版)
PyQt5是一套绑定Qt5的应用程序框架。他在Python 2.x和3.x中都是可用的。该教程使用的是Python3.x。
victorfengming
2021/11/26
5.3K0
Qt截图软件3-实现矩形区域截图
首先我们先获取到当前桌面的完整图片,然后将其放到一个全屏的透明窗口之中,之后,我们在窗口上进行绘制矩形操作,然后获取到绘制的区域即可。
kdyonly
2023/03/03
1.3K0
PySide6 GUI 编程(43):自定义 QWidget
它在控件需要重新绘制时被调用,例如在窗口被遮挡后重新显示、控件大小改变、或调用 update() 方法时。
bowenerchen
2024/09/15
5182
PySide6 GUI 编程(43):自定义 QWidget
qt 气泡聊天界面_微信聊天气泡框素材
由于最近的项目需要,做了些相关IM的工作。所以聊天框也是必不可少的一部分。聊天框的制作分很多种,本文以QListWidget+QPainter绘制的Item做了一个Demo。该Demo只是做一个示例,代码已公布如下,需要的拿去!
全栈程序员站长
2022/08/18
3.2K0
qt 气泡聊天界面_微信聊天气泡框素材
浅谈基于QT的截图工具的设计与实现
在介绍截图工具设计与实现前,让我们先通过介绍QT的绘图基础知识,让读者有一个比较感性的认识。
w4ngzhen
2023/10/18
5660
浅谈基于QT的截图工具的设计与实现
pyqt4制作透明无边框窗体
http://blog.chinaunix.net/uid-25979788-id-3081886.html
bear_fish
2018/09/20
1.7K0
pyqt4制作透明无边框窗体
【QT】QT事件处理
QT中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等。QT中,任何QObject子类示例都可以接收和处理事件。实际编程中通常实现部件的paintEvent()、mousePressEvent()等事件处理函数来处理特定部件的特定事件。
半生瓜的blog
2023/05/13
1.7K0
【QT】QT事件处理
Python Qt GUI设计:QPainter、QPen、QBrush和QPixmap窗口绘图类(基础篇—17)
本篇博文主要介绍如何实现在窗口中绘图,在 PyQt5中,一般可以通过QPainter、QPen、QBrush和QPixmap这四个类来实现绘图功能。其中,QPixmap的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的。
不脱发的程序猿
2021/10/26
2.5K0
Qt入门系列(三)
选装父文件—>添加文件-->Qt--->设计师界面->命名smallWidget(简称sw)
用户9831583
2022/06/16
1.2K0
Qt入门系列(三)
PyQt 自定义窗口部件(三)
Y形管由abci、edcf 以及cihgf三部分组成,内部的颜色由流体的流速决定。各个部分均使用逻辑坐标系绘制。
用户6021899
2019/08/14
6400
Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
打印图像是图像处理软件中的一个常用功能,打印图像实际上是在QPaintDevice中画图,与平常在QWidget、QPixmap和Qlmage中画图一样,都是创建一个QPainter对象进行画图的,只是打印使用的是QPrinter,它本质上也是一个QPaintDevice(绘图设备)。
不脱发的程序猿
2021/10/29
1.1K0
Python Qt GUI设计:QPrinter打印图片类(基础篇—21)
小白白也能学会的 PyQt 教程 —— 图像类及图像相关基础类介绍
图,貌似是一个好看的 UI 中必不可少的东西,精美的 UI 中不可避免的会使用一些奇特的各种图像元素来提升用户体验。对于开发者而言,如何在应用程序中有效地显示和处理图像成为一个重要的课题。在Python中,PyQt库是一个强大而灵活的选择,它提供了丰富的图像处理类和功能。
繁依Fanyi
2023/05/20
3.1K0
Qt5-QtWidgets篇
//winLabel 你要对那个组件使用动画 geometry几何结构 QPropertyAnimation * an = new QPropertyAnimation(winLabel,”geometry”); //动画时间 an->setDuration(1000); //动画开始 an->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height())); //动画结束 an->setEndValue(QRect(winLabel->x(),winLabel->y() + 300,winLabel->width(),winLabel->height())); //动画方式 an->setEasingCurve(QEasingCurve::OutBounce); an->start();
她的店里只卖樱花
2022/10/31
1.6K0
相关推荐
PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验