前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像标注版本2-多标注框

图像标注版本2-多标注框

作者头像
python与大数据分析
发布2023-09-04 18:48:48
2030
发布2023-09-04 18:48:48
举报
文章被收录于专栏:python与大数据分析

在网上能看到的图像标注版本多是图像标注版本1的代码,但图像标注不仅只保存一个标注框,通常都是多个标注框,而且要把这些标注框信息记录下来,当然代码也是在网上找到的,做了一些改动。

多标注的秘诀就在于增加一个bboxList列表,记录每次释放鼠标时的起始结束位置以及其他信息,在绘制事件中,将过往的bboxList存储的点位信息重新绘制出来。

一、在MyLabel初始化过程中,增加一个self.bboxList

代码语言:javascript
复制
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
        # 增加一个存储标注框坐标的列表
        self.bboxList=[]

二、鼠标点击事件和移动事件代码不做改变

代码语言:javascript
复制
# 单击鼠标触发事件
# 获取鼠标事件的开始位置
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()

三、在鼠标释放事件中,保存标注框起始结束位置到bboxlist中

在绘制事件中,重新勾画出来,这段脚本可用,但有些问题,会在版本3基础上做修正。

代码语言:javascript
复制
    # 鼠标释放事件
    def mouseReleaseEvent(self, event):
        # 将绘制标志设置为False
        self.flag = False
        self.x1 = event.pos().x()
        self.y1 = event.pos().y()
        # 将标注框的四个坐标轴存储到bboxList
        self.saveBBbox(self.x0,self.y0,self.x1,self.y1)

    # 绘制事件
    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter()
        # 增加绘制开始和结束时间
        painter.begin(self)
        # 遍历之前存储的标注框坐标列表
        for point in self.bboxList:
            rect = QRect(point[0], point[1], abs(point[0]-point[2]), abs(point[1]-point[3]))
            painter.setPen(QPen(Qt.red, 2, Qt.SolidLine))
            painter.drawRect(rect)
        # 绘制当前标注框的举行
        # 构造矩形框的起始坐标和宽度、高度
        tempx0 = min(self.x0, self.x1)
        tempy0 = min(self.y0, self.y1)
        tempx1 = max(self.x0, self.x1)
        tempy1 = max(self.y0, self.y1)
        width=tempx1-tempx0
        height=tempy1-tempy0
        currect = QRect(tempx0, tempy0, width, height)
        # 构造QPainter,进行矩形框绘制
        painter.setPen(QPen(Qt.blue, 1, Qt.SolidLine))
        painter.drawRect(currect)
        painter.end()

    # 保存到bbox列表
    def saveBBbox(self,x0,y0,x1,y1):
        tempx0 = min(x0, x1)
        tempy0 = min(y0, y1)
        tempx1 = max(x0, x1)
        tempy1 = max(y0, y1)
        bbox = (tempx0, tempy0, tempx1, tempy1)
        self.bboxList.append(bbox)

四、构建主窗口

代码语言:javascript
复制
代码语言:javascript
复制
# 测试类
class LabelV2(QWidget):
    def __init__(self):
        super(LabelV2, self).__init__()
        self.initUI()

    def initUI(self):
        self.resize(960, 540)
        self.move(100, 50)
        self.setWindowTitle('Label标注框2.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
复制
if __name__ == '__main__':
    app = QApplication(sys.argv)
    labelwin = LabelV2()
    sys.exit(app.exec())
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档