这篇文章主要讲解了如何使用PyQt的QLabel组件实现选定目标框功能,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
, # 8195;及# 8195;基于<代码> PyQt5 代码>开发了一个可以用于目标跟踪的软件,在开发过程中遇到一个问题,就是如何在<代码> PyQt5> 代码的组件<代码> QLable> 代码中自主选定目标框,这个在<代码> opencv> 代码里面有专门的函数完成这个工作:<代码> cv2.selectROI() 代码>,我的目的就是在<代码> QLabel> 代码的基础上,实现类似函数<代码> cv2.selectROI() 代码>的功能,这样在运行程序的过程中,就能在视频框里面直接选取感兴趣区域。
具体要实现的功能,是在视频显示区域,点击鼠标左键,开启选择,按照鼠标左键,移动游标,慢慢地绘制出红色的目标框。释放鼠标左键就停止选择目标框。最开始以为<代码> PyQt> 代码好歹也会提供这样的类来进行开发吧,后来发现其实是没有的,没办法只能写一个<代码> QLabel> 代码类的子类了。子类的命名为<代码>标签> 代码,继承自<代码> QLabel> 代码类,在子类中重写鼠标事件函数,接受鼠标在标签<代码> 代码>对象上位置信号。<代码> PyQt 代码>本来就有自己的事件循环,当鼠标落在视频显示区域的时候,触发到<代码>标签> 代码的鼠标事件,那么就可以开始绘制目标框了。
这里要记录的就是鼠标按下左键时候的起始坐标<代码> pos_1> 代码和移动坐标<代码> pos_2 代码>,<代码> pos_1=(x0, y0) 代码>,<代码> pos_2=(x1, y1) 代码>。
重写按下鼠标事件按下鼠标左键,触发事件函数<代码> mousePressEvent() 代码>,事件函数打开绘制标志位<代码>自我。select_roi_flag> 代码,传入事件对象数据,初始化起始坐标<代码> x0, y0> 代码。
重写释放鼠标事件按下鼠标左键,触发事件函数<代码> mousePressEvent() 代码>,关闭绘制标志位<代码>自我。select_roi_flag> 代码。
绘制事件继承鼠标事件绘制类,创建画笔类对象,在这可以设置画笔的颜色,画线的粗细,如果绘制标志位<代码> self.select_roi_flag> 代码是打开的,那么将事件对象的位置数据传给<代码> (x1, y1> 代码。<代码> QRect> 代码类是是<代码> PyQt> 代码的内置数据结构,具体结构是这样的<代码>矩形=(x, y, w, h)> 代码,之后就调用画笔对象方法动态绘制目标框。直到绘制标志位被关闭,就是释放鼠标,则停止绘画。
具体实现代码:
。QtWidgets进口QLabel 从PyQt5。QtCore进口Qt, QRect 从PyQt5。QtGui进口QPainter QPen 类标签(QLabel): x0=0 y0=0 x1=0 日元=0 open_mouse_flag=False select_roi_flag=False draw_roi_flag=False clear_flag=False 矩形=QRect () #按下鼠标 def mousePressEvent(自我、事件): 如果自我。open_mouse_flag是正确的: self.select_roi_flag=True self.x0=event.x () self.y0=event.y () #释放鼠标 def mouseReleaseEvent(自我、事件): self.select_roi_flag=False #移动鼠标 def摇干(自我、事件): 如果自我。select_roi_flag是正确的: self.x1=event.x () self.y1=event.y () 如果自我。draw_roi_flag是正确的: self.update () #绘制事件 def paintEvent(自我、事件): super () .paintEvent(事件) 画家=QPainter(自我) painter.setPen (QPen (Qt。红色5 Qt.SolidLine)) 如果自我。clear_flag是正确的: self.x0=0 self.y0=0 self.x1=0 self.y1=0 自我。矩形=QRect(自我。x0,自我。y0, abs(自我。x1 - self.x0), abs(自我。y1 - self.y0)) painter.drawRect (self.rect) self.update ()
子类标签<代码> 代码>除了能自定义选择目标框,还要在更新内容是清除绘制内容,实现这个功能可以通过设置清空标志位<代码> clear_flag> 代码,当标志位打开的时候,将起始坐标和更新坐标重置为:(0,0)(0,0),这样绘制内容就被更新了。
具体实现代码:
#清除标签对象的绘制内容 def clear_label(自我): self.label_show。clear_flag=True self.label_show.clear ()
此外我还重写了键盘事件,通过敲击键盘来控制鼠标的绘制事件,这里的内容主要包括切换游标,开启绘制事件,确认绘制事件。
具体实现代码:
#重写键盘事件 def keyPressEvent(自我,QKeyEvent): 如果自我。open_keyboard_flag是真的:#当键盘事件为真的是才有键盘事件监控 如果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 如果QKeyEvent.key ()==Qt.Key_Q: #按下& # 39;提问# 39;键键盘监控关闭 self.label_show.unsetCursor () self.label_show。draw_roi_flag=False self.label_show。open_mouse_flag=False 自我。open_keyboard_flag=False如何使用PyQt的QLabel组件实现选定目标框功能