QLabel选定目标框功能实现

问题背景

基于PyQt5开发了一个可以用于目标跟踪的软件,在开发过程中遇到一个问题,就是如何在PyQt5的组件QLable中自主选定目标框,这个在opencv里面有专门的函数完成这个工作:cv2.selectROI(),我的目的就是在QLabel的基础上,实现类似函数cv2.selectROI()的功能,这样在运行程序的过程中,就能在视频框里面直接选取感兴趣区域。直接贴出实现的最终效果:

上图中的红色框框就是在QLabel的基础上实现的功能。

实现思路

具体要实现的功能是,在视频显示区域,点击鼠标左键,开启选择,按照鼠标左键,移动游标,慢慢地绘制出红色的目标框。释放鼠标左键就停止选择目标框。最开始以为PyQt好歹也会提供这样的类来进行开发吧,后来发现其实是没有的,没办法只能写一个QLabel类的子类了。子类的命名为Label,继承自QLabel类,在子类中重写鼠标事件函数,接受鼠标在Label对象上位置信号。PyQt本来就有自己的事件循环,当鼠标落在视频显示区域的时候,触发到Label的鼠标事件,那么就可以开始绘制目标框了。

这里要记录的就是鼠标按下左键时候的起始坐标pos_1和移动坐标pos_2,pos_1=(x0,y0),pos_2=(x1,y1)。

重写按下鼠标事件 按下鼠标左键,触发事件函数mousePressEvent(),事件函数打开绘制标志位self.select_roi_flag,传入事件对象数据,初始化起始坐标x0,y0。

重写释放鼠标事件 按下鼠标左键,触发事件函数mousePressEvent(),关闭绘制标志位self.select_roi_flag。

绘制事件 继承鼠标事件绘制类,创建画笔类对象,在这可以设置画笔的颜色,画线的粗细,如果绘制标志位self.select_roi_flag是打开的,那么将事件对象的位置数据传给x1,y1。QRect类是是PyQt的内置数据结构,具体结构是这样的Rect=(x,y,w,h),之后就调用画笔对象方法动态绘制目标框。直到绘制标志位被关闭,就是释放鼠标,则停止绘画。

具体实现代码:

from PyQt5.QtWidgets import QLabel

from PyQt5.QtCore import Qt,QRect

from PyQt5.QtGui import QPainter,QPen

class Label(QLabel):

x0=0

y0=0

x1=0

y1=0

open_mouse_flag=False

select_roi_flag=False

draw_roi_flag=False

clear_flag=False

rect = QRect()

#按下鼠标

def mousePressEvent(self, event):

if self.open_mouse_flag is True:

self.select_roi_flag=True

self.x0=event.x()

self.y0=event.y()

#释放鼠标

def mouseReleaseEvent(self, event):

self.select_roi_flag=False

#移动鼠标

def mouseMoveEvent(self, event):

if self.select_roi_flag is True:

self.x1=event.x()

self.y1=event.y()

if self.draw_roi_flag is True:

self.update()

#绘制事件

def paintEvent(self,event):

super().paintEvent(event)

painter = QPainter(self)

painter.setPen(QPen(Qt.red, 5, Qt.SolidLine))

if self.clear_flag is True:

self.x0=0

self.y0=0

self.x1=0

self.y1=0

self.rect = QRect(self.x0, self.y0, abs(self.x1 - self.x0), abs(self.y1 - self.y0))

painter.drawRect(self.rect)

self.update()

其他要注意的问题

子类Label除了能自定义选择目标框,还要在更新内容是清除绘制内容,实现这个功能可以通过设置清空标志位clear_flag,当标志位打开的时候,将起始坐标和更新坐标重置为:(0,0)(0,0),这样绘制内容就被更新了。

具体实现代码:

# 清除label对象的绘制内容

def clear_label(self):

self.label_show.clear_flag = True

self.label_show.clear()

此外我还重写了键盘事件,通过敲击键盘来控制鼠标的绘制事件,这里的内容主要包括切换游标,开启绘制事件,确认绘制事件。

具体实现代码:

# 重写键盘事件

def keyPressEvent(self, QKeyEvent):

if self.open_keyboard_flag is True: # 当键盘事件为真的是才有键盘事件监控

if QKeyEvent.key() == Qt.Key_S:

self.label_show.setCursor(Qt.CrossCursor) # 切换游标为十字型

self.label_show.open_mouse_flag = True

self.label_show.draw_roi_flag = True

if QKeyEvent.key() == Qt.Key_Q: # 按下'q'键键盘监控关闭

self.label_show.unsetCursor()

self.label_show.draw_roi_flag = False

self.label_show.open_mouse_flag = False

self.open_keyboard_flag = False

qlabel可以选中吗_QLabel选定目标框功能实现相关推荐

  1. qlabel可以选中吗_QLabel自定义类实现点击效果以及鼠标掠过字体的颜色变化效果...

    1.自定义实现QLabel的clicked()信号,以及实现hover的效果 头文件: class activityLabel:public QLabel { Q_OBJECT public: act ...

  2. yolov5目标框预测

    yolov5目标检测模型中,对模型结构的描述较多,也容易理解.但对如何获得目标预测方面描述较少,或总感觉云山雾罩搞不清楚.最近查阅一些资料,并加上运行yolov5程序的感受,总结一下对目标特征参数的预 ...

  3. PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态

    先看效果图,选中了几行,然后将选中的内容展示出来. 我设置两个有序序列,分别存储对应的复选框和行内容. 我的行内容是用的 label 标签. # 存储右边label组件的有序列表def get_L_b ...

  4. html 点击文本框则选中,JS事件 内容选中事件(onselect)选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行。...

    内容选中事件(onselect) 选中事件,当文本框或者文本域中的文字被选中时,触发onselect事件,同时调用的程序就会被执行. 如下代码,当选中用户文本框内的文字时,触发onselect 事件, ...

  5. 使用Disentangling形式的损失函数回归2D和3D目标框

    本文介绍一篇 ICCV 2019 的论文『 Disentangling Monocular 3D Object Detection』.详细信息如下: 论文链接:https://arxiv.org/ab ...

  6. 基础学习笔记之opencv(5):实现鼠标选定矩形框

    opencv编写程序中,用鼠标选定矩形框经常用到.编程时看似很简单的逻辑思路,如果对opencv中的Rect不是很了解的话,那实现的效果就不是特别理想,比如说虽然我们习惯性用鼠标从左上到右下选择,但是 ...

  7. 使用JavaScript(jQuery或Vanilla)选中/取消选中复选框?

    本文翻译自:Check/Uncheck checkbox with JavaScript (jQuery or Vanilla)? 如何使用JavaScript,jQuery或vanilla选中/取消 ...

  8. yolo数据集剪裁:切割目标框并将该框内的其他目标一并提取并转为可用数据集

    如上图所示,我们的目标是切割出所有的盘子,没个盘子单独储存为一张图片,并且里面的水果也还在该盘子的对应位置. 类似于这样 因为都标注了,有位置信息了,通过大目标框和小目标框的相对位置完全可以切出来.若 ...

  9. 代码理解网络选择候选区域及确定最终目标框的过程

    之前小鱼在获取Faster RCNN最终候选框坐标值中介绍怎么得到最终目标框的坐标值(左上角及右下角),但是因为还需要获取最终目标框的特征向量,所以简单的以为在代码中加入: fea=net.blobs ...

最新文章

  1. C语言如何实现泛型编程?
  2. Ubuntu 14.04 opencv 2.4.9 安装
  3. 城市“脑梗” 当前城市大脑面临的困境
  4. AI独角兽第四范式冲刺港交所IPO!集齐国有五大行入股,刚获宁德时代制造大单...
  5. 首个生物医疗开放大数据研究中心在沪成立
  6. CRM+Mysql+php初学
  7. 连锁商店 状态压缩dp(女赛)
  8. yolov3-tiny神经网络FPGA(ZYNQ7020)实现
  9. gin redis 链接不上_php + redis 高并发商品秒杀 完整业务模拟流程 实现方案
  10. 数据分析工具篇pyspark应用详解——Pyspark实现PCA主成分
  11. ThinkPHP redirect 页面重定向使用详解与实例
  12. linux启动写入了mbr,一、Linux系统启动(MBR)
  13. 单独得省级行政区数据
  14. 在Word中将A3大小的卷子拆成A4大小来打印的方法
  15. QQ聊天记录的备份和恢复(含迁移与合并)
  16. 创客教育发展中的科技造物原理
  17. transitive fanout与set_dont_touch_network
  18. java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
  19. 简易讨伐HashMap
  20. 手机消息同步+android屏幕镜像=电脑微信 for linux

热门文章

  1. 重定向和转发的区别及应用
  2. C++ int转string的多种方式
  3. [C] int转string
  4. Spring Security Oauth2的介绍与应用详解
  5. EBAZ4205 电源 J37I 整改TPS563XX
  6. MintUi项目实战(项目中BUG的处理)
  7. 【ZYNQ】IP核_关于视频IP核的详细介绍
  8. 计算机网络——课程简介
  9. onresize事件
  10. php解析微信接口,php微信公众平台交互与接口详解