在网上能看到的图像标注版本多是图像标注版本1的代码,但图像标注不仅只保存一个标注框,通常都是多个标注框,而且要把这些标注框信息记录下来,当然代码也是在网上找到的,做了一些改动。
多标注的秘诀就在于增加一个bboxList列表,记录每次释放鼠标时的起始结束位置以及其他信息,在绘制事件中,将过往的bboxList存储的点位信息重新绘制出来。
一、在MyLabel初始化过程中,增加一个self.bboxList
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=[]
二、鼠标点击事件和移动事件代码不做改变
# 单击鼠标触发事件
# 获取鼠标事件的开始位置
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基础上做修正。
# 鼠标释放事件
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)
四、构建主窗口
# 测试类
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函数中,显示主窗口,其他功能暂时不需要
if __name__ == '__main__':
app = QApplication(sys.argv)
labelwin = LabelV2()
sys.exit(app.exec())
本文分享自 python与大数据分析 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!