重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了如何使用PyQt的QLabel组件实现选定目标框功能,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
10年积累的网站设计制作、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有西林免费网站建设让你可以放心的选择与我们合作。问题背景
基于PyQt5
开发了一个可以用于目标跟踪的软件,在开发过程中遇到一个问题,就是如何在PyQt5
的组件QLable
中自主选定目标框,这个在opencv
里面有专门的函数完成这个工作:cv2.selectROI()
,我的目的就是在QLabel
的基础上,实现类似函数cv2.selectROI()
的功能,这样在运行程序的过程中,就能在视频框里面直接选取感兴趣区域。
实现思路
具体要实现的功能是,在视频显示区域,点击鼠标左键,开启选择,按照鼠标左键,移动游标,慢慢地绘制出红色的目标框。释放鼠标左键就停止选择目标框。最开始以为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()
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。