PyQt5中如何在lable中加载的图片上绘制矩形框呢?

我的程序是通过摄像头采集一帧图像,点击开始标记按钮后显示在按钮左侧的lable中(灰色框)。
我希望可以在lable中加载的一帧图像中通过点击鼠标左键开始绘制矩形,按住左键拖动时改变矩形的形状,松开左键后完成绘制。(和lableImg软件类似)。
请问如何实现上述功能呢?我目前找到的方法是使用QPainter来实现,但是在我的代码中该如何实现呢?万分感谢!

图片说明

附上我的完整代码如下:

# -*- coding: utf-8 -*-
import sys
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

# ~ class MyLabel(QLabel):
    # ~ def paintEvent(self, event):
        # ~ width = self.pos2[0]-self.pos1[0]
        # ~ height = self.pos2[1] - self.pos1[1]     
        # ~ qp = QPainter()
        # ~ qp.begin(self)           
        # ~ qp.drawRect(self.pos1[0], self.pos1[1], width, height)        
        # ~ qp.end()

    # ~ def mousePressEvent(self, event):
        # ~ self.pos1[0], self.pos1[1] = event.pos().x(), event.pos().y()
        # ~ print("clicked")

    # ~ def mouseReleaseEvent(self, event):
        # ~ self.pos2[0], self.pos2[1] = event.pos().x(), event.pos().y()
        # ~ print("released")
        # ~ self.update()

class Ui_train_window(QtWidgets.QWidget):
    def setupUi(self, train_window):
        train_window.setObjectName("train_window")
        train_window.resize(690, 600)
        train_window.setMaximumSize(QtCore.QSize(690, 600))
        self.horizontalLayoutWidget = QtWidgets.QWidget(train_window)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 10, 681, 80))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.lab_enter_name = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.lab_enter_name.setObjectName("lab_enter_name")
        self.horizontalLayout.addWidget(self.lab_enter_name)
        self.le_username = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
        self.le_username.setObjectName("le_username")
        self.horizontalLayout.addWidget(self.le_username)
        self.lab_enter_pw = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.lab_enter_pw.setObjectName("lab_enter_pw")
        self.horizontalLayout.addWidget(self.lab_enter_pw)
        self.le_userpw = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
        self.le_userpw.setObjectName("le_userpw")
        self.le_userpw.setEchoMode(QLineEdit.Password)
        self.horizontalLayout.addWidget(self.le_userpw)
        self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.le_ipadr = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
        self.le_ipadr.setObjectName("le_ipadr")
        self.horizontalLayout.addWidget(self.le_ipadr)
        self.btn_openIPcam = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.btn_openIPcam.setMinimumSize(QtCore.QSize(50, 10))
        self.btn_openIPcam.setObjectName("btn_openIPcam")
        self.horizontalLayout.addWidget(self.btn_openIPcam)

        self.show = QtWidgets.QLabel(train_window)
        self.show.setGeometry(QtCore.QRect(15, 110, 531, 371))
        self.show.setObjectName("show")
        self.show.setStyleSheet(("border:2px solid lightgray"))

        self.verticalLayoutWidget = QtWidgets.QWidget(train_window)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(560, 100, 111, 381))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.btn_start = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.btn_start.setObjectName("btn_start")
        self.verticalLayout.addWidget(self.btn_start)
        self.combo_label = QtWidgets.QComboBox(self.verticalLayoutWidget)
        self.combo_label.setObjectName("combo_label")
        self.combo_label.addItem("")
        self.combo_label.addItem("")
        self.combo_label.addItem("")
        self.combo_label.addItem("")
        self.combo_label.addItem("")
        self.combo_label.addItem("")
        self.verticalLayout.addWidget(self.combo_label)
        self.btn_save = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.btn_save.setObjectName("btn_save")
        self.verticalLayout.addWidget(self.btn_save)
        self.btn_finish = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.btn_finish.setObjectName("btn_finish")
        self.verticalLayout.addWidget(self.btn_finish)
        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(train_window)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 500, 681, 71))
        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.lab_stepnum = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
        self.lab_stepnum.setObjectName("lab_stepnum")
        self.horizontalLayout_2.addWidget(self.lab_stepnum)
        self.le_stepnm = QtWidgets.QLineEdit(self.horizontalLayoutWidget_2)
        self.le_stepnm.setObjectName("le_stepnm")
        self.horizontalLayout_2.addWidget(self.le_stepnm)
        self.lab_batchsize = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
        self.lab_batchsize.setObjectName("lab_batchsize")
        self.horizontalLayout_2.addWidget(self.lab_batchsize)
        self.le_batchsize = QtWidgets.QLineEdit(self.horizontalLayoutWidget_2)
        self.le_batchsize.setObjectName("le_batchsize")
        self.horizontalLayout_2.addWidget(self.le_batchsize)
        self.btn_pretrain = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
        self.btn_pretrain.setObjectName("btn_pretrain")
        self.horizontalLayout_2.addWidget(self.btn_pretrain)
        self.btn_retrain = QtWidgets.QPushButton(self.horizontalLayoutWidget_2)
        self.btn_retrain.setObjectName("btn_retrain")
        self.horizontalLayout_2.addWidget(self.btn_retrain)
        self.show.raise_()
        self.horizontalLayoutWidget.raise_()
        self.verticalLayoutWidget.raise_()
        self.horizontalLayoutWidget_2.raise_()

        self.retranslateUi(train_window)
        self.btn_openIPcam.clicked.connect(self.IPinfo)
        self.btn_start.clicked.connect(self.labledata)
        QtCore.QMetaObject.connectSlotsByName(train_window)

    def retranslateUi(self, train_window):
        _translate = QtCore.QCoreApplication.translate
        train_window.setWindowTitle(_translate("train_window", "训练工具"))
        self.lab_enter_name.setText(_translate("train_window", "输入IP摄像头用户名:"))
        self.lab_enter_pw.setText(_translate("train_window", "输入IP摄像头密码:"))
        self.label.setText(_translate("train_window", "IP地址"))
        self.btn_openIPcam.setText(_translate("train_window", "连接IP摄像头"))
        self.show.setText(_translate("train_window", ""))
        self.btn_start.setText(_translate("train_window", "开始标记"))
        self.combo_label.setItemText(0, _translate("train_window", "a"))
        self.combo_label.setItemText(1, _translate("train_window", "b"))
        self.combo_label.setItemText(2, _translate("train_window", "c"))
        self.combo_label.setItemText(3, _translate("train_window", "d"))
        self.combo_label.setItemText(4, _translate("train_window", "e"))
        self.combo_label.setItemText(5, _translate("train_window", "f"))
        self.btn_save.setText(_translate("train_window", "保存"))
        self.btn_finish.setText(_translate("train_window", "标记结束"))
        self.lab_stepnum.setText(_translate("train_window", "迭代次数:"))
        self.lab_batchsize.setText(_translate("train_window", "batchsize:"))
        self.btn_pretrain.setText(_translate("train_window", "预训练"))
        self.btn_retrain.setText(_translate("train_window", "重新训练"))

    def IPinfo(self):
        username = self.le_username.text()
        password = self.le_userpw.text()
        ipaddress = self.le_ipadr.text()
        #cam_rtsp_addr = "rtsp://" + username + ":" + password + "@" + ipaddress + "/h264/ch33/main/av_stream"
        #self.camcapture = cv2.VideoCapture(cam_rtsp_addr)
        self.camcapture = cv2.VideoCapture(0)
        self.timer = QtCore.QTimer()
        self.timer.start()
        self.timer.setInterval(0.3) 
        self.timer.timeout.connect(self.camshow)

    def camshow(self):
        global showImage
        _ , camimg = self.camcapture.read()
        camimg = cv2.cvtColor(camimg, cv2.COLOR_BGR2RGB)
        showImage = QtGui.QImage(camimg.data, camimg.shape[1], camimg.shape[0], QtGui.QImage.Format_RGB888)

    def labledata(self):
        self.show.setPixmap(QtGui.QPixmap.fromImage(showImage))

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Window = QtWidgets.QWidget()
    ui = Ui_train_window()
    ui.setupUi(Window)
    Window.show()
    sys.exit(app.exec_())

0

1个回答

emmmm……解决了……手动笑哭脸。
定义了一个QLable类,在这个类中定义鼠标事件。 然后将self.show(show这个名字起的很不好……改成了showimg)这个lable改为我们定义的lable。
然后只显示train-window界面即可。

1
yourgreatfather
Masec 回复eg_claymore: 我的博客里面有源码,我的问题是我显示了一个界面,却在另一个界面上绘制矩形框。所以不能显示
7 个月之前 回复
eg_claymore
eg_claymore 怎么解决的,可以分享下嘛?我最近也在做跟这个相同的功能的小工具
7 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
子类化QLabel显示图片并在label上画矩形截图并显示
子类化QLabel显示图片并在label上画矩形截图并显示,..a...d........
QT在Label上画矩形
一、首先定义一个mylabel.h,继承于QLabel #ifndef MYLABEL_H #define MYLABEL_H #include #include #include #include #include class mylabel : public QLabel { Q_OBJECT public: explicit myla
分别在QLabel和QWidget上绘制图片的示例
分别在QLabel和QWidget上绘制图片,并且图片能够跟随界面而放大缩小;其中QLabel的方式有点特殊,正常情况下直接布局在QWidget中,图片无法缩小,只能放大和还原;这里采用变通的方式处理。
QT 在QLabel上加载图片 并在其上绘制矩形
QLabel 加载图片并绘制矩形图案 发出起始和结束的坐标
qt中在QLabel上显示图像并画矩形框。
最主要的是重写paintEvent()函数,下面直接看代码mylabel.h# pragma execution_character_set("utf-8") #ifndef MYLABEL_H #define MYLABEL_H #include <list> #include <map> #include<QLabel> #include<QPoin...
用PyQt5做画矩形的GUI程序
首先,导入PyQt5模块: from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * import sys 应用名: __appname__ = 'painter' 声明矩形类,方便画的时候把握好其属性: class Rect: def __init__(s...
在QGraphicsScene上画矩形
CustomSense继承QGraphicsScene,QGraphicsView,重写了鼠标事件,在CustomSense上添加图片并画矩形标记出特定区域,是专门满足这个需求写的小测试例子,使用Qt5实现。
使用OpenCV在图片中画矩形框
一种画矩形的简单方法 import cv2 import math center=[] circumference=[] def drawCircle(action, x, y, flags, userdata):   # Referencing global variables    global center, circumference   # Action to b
matlab 在照片中画矩形框
initstate = [x y w h]; %-----------------------------------------Show the tracking result imshow(uint8(img1)); rectangle('Position',initstate,'LineWidth',4,'EdgeColor','r'); text(5, 18
opencv 在图中绘图(矩形框,线段,点,圆)
使用opencv处理图像时,经常会需要在图像上画点、线段、矩形框等,而在opencv画图中Point和Scalar是两个非常重要的结构体。1、Point表示由其图像坐标 x 和 y 指定的2D点。可定义为:Point pt;pt.x = 10;pt.y = 8;或者Point pt =  Point(10, 8);2、Scalar 表示了具有4个元素的数组。在OpenCV中被大量用于传递像素值。如...
C#中在picturebox中实时画矩形框
C#中在picturebox中实时画矩形框
Qt实现在QLabel上绘制2D图形
根据以往的经验,我们绘制图形的时候都是在paintevent()函数中实现的,每次移动或改变窗口都会调用该函数来实现绘制。 在paintevent函数中,通常需要设置QPainter对象,创建QPainter对象的同时需要指定绘图设备,即继承自QPainterDevice的子类作为绘图设备,绘制出来的图形将在这个设备上进行显示,Qt一共提供了4个这样的类,分别是QPixmap,QBitmap,QI
python图片画矩形框
根据图像标签。采用python对文件夹下所有图像画矩形框
Qt中在QLabel上载入图片后在上面画矩形框,并将矩形框选的区域显示
实在受不了了,网上搜的那些都只有框选,并没有把框选的区域显示,只能自己干了,希望能够帮到你们
pyqt 图片 用label的属性显示
ui设计: 设计好了,直接生成下py,之所以生成py是为了写代码的时候,IDE能够自动识别对象和函数,比较方便。 C:\Users\Administrator>pyuic4 -o pic.py  Pic.ui 业务代码: 这个里边有个重要的初始化过程,super 是集成父类的属性,能够直接调用我们ui设计界面对应的py文件的信息。 #!/usr
QT 在label上显示图片并话矩形
QT 在label上显示图片并话矩形
OPENCV实例:在图片上绘制矩形
鼠标绘制矩形,按c清除 程序流程: 1.读取图片srcImage 2.srcImage复制到img和tempImage 3.g_bDrawingBox为假不绘图 4.鼠标按下,g_bDrawingBox为真,开始绘图 5.读取pt1,pt2 6.srcImage实时复制到tempImage(目的:不让绘制的矩形产生重叠),根据pt1和pt2在tempImage绘制矩形,显示在temp...
pyqt5 使用label显示摄像头
  1. 安装opencv库 pip install opencv-python 2. 界面 3 .代码 界面设计: palette = QPalette() icon = QPixmap('c.jpg').scaled(800, 600) palette.setBrush(self.backgroundRole(), QBrus...
PyQt学习Ⅴ(在pyqt中拖放和绘制图形)
在PyQt5中拖放 在计算机图形用户界面中,拖放是单击虚拟对象并将其拖动到其他位置或另一个虚拟对象的动作(或支持其动作)。通常,它可用于调用多种操作,或在两个抽象对象之间创建各种类型的关联。拖放是图形用户界面的一部分。拖放操作使用户能够直观地执行复杂操作。通常,我们可以拖放两件事:数据或一些图形对象。如果我们将图像从一个应用程序拖到另一个应用程序,我们拖放二进制数据。如果我们在Firefox中拖...
MFC中在picture控件中绘制图像指定坐标区域矩形
void CddrwDlg::OnLButtonDown(UINT nFlags, CPoint point) {     // TODO: 在此添加消息处理程序代码和/或调用默认值     // TODO: 在此添加消息处理程序代码和/或调用默认值     CPen* oldPen=NULL;     CRect rect;     CWnd *pWnd = GetDlgItem(IDC_...
Qt中通过控件在Label标签中显示一张静态图片
Qt中通过控件在Label标签中显示一张静态图片
Qt 在任意Label上面绘制图形
这只是一个可以在lable上面绘图的demo,需要用到该只是的朋友可以试一下,改良一下,我也是学习别人的东西,免费分享,评论就可以拿回拿一分了,不是么
Pyqt5:Qpainter绘制基础图形(二):鼠标拖画
接着上文:绘制基础图形函数已经全部清楚,然后进阶鼠标拖画。 鼠标拖画,需要用到鼠标事件 鼠标事件: 与C++Qt一样,鼠标事件,需要重载鼠标事件函数如下: def mousePressEvent(self, e): print("鼠标按下事件") def mouseReleaseEvent(self, e): print("鼠标释放事件") ...
MATLAB GUI 打开一幅图像 在图像上画多边形和矩形
本程序是基于MATLAB GUI 的一个界面,实现了“打开一幅图像,在图像上画多边形和矩形”的功能,同时还可以选择不同的线型和颜色,是初步学习GUI的很好的例子。
label上画矩形框(圆形等)
在qt的label上画矩形,截取roi,配置一下opencv可以直接运行,或者可以摘取出来到自己工程中,也可以画圆形,只要把代码改成画圆函数就行,此工程是画矩形
Opencv在视频中静态、动态方式绘制矩形框ROI
Opencv视频处理中的目标跟踪经常用到要在视频上画一个矩形框ROI,标注出要跟踪的物体,这里介绍两种在视频中绘制矩形框的方法,一种是“静态的”,一种是“动态的”。 静态的是指在绘制过程中,视频暂停播放,画面定格在鼠标左键单击上去时候播放的画面,这时候按着鼠标左键并拖动出一个感兴趣的区域,鼠标左键抬起完成矩形框的绘制。在整个绘制过程中,矩形是连续显示出来的,跟随鼠标位置变化而变化。 过
matlab在图像上画矩形框并保存
clc,close all; file_path='pictures/'; image_name1='t1.jpg'; ref = imread(strcat(file_path,image_name1)); [rows,cols,depth] = size(ref); figure; set (gcf,'Position',[100,100,cols,rows]); imshow(ref,'...
Python3.x+Pyqt5实现绘图界面(matplotlib绘图;graphicview控件中)和业务逻辑分离案例04_自己写的,有UI界面源代码
Python3.x+Pyqt5实现绘图界面(MainWindow类型窗体;matplotlib 绘图控件嵌入PyQt5 graphicview控件中)和业务逻辑分离案例04_自己写的,有UI界面源代码
使用QLabel显示图片
QString path = QString("H:/temp/gg.png"); /*way1 QPixmap px; px.load(path); ui->label->setPixmap(px);*/ /*way2*/ QImage im; im.load(path); QPixmap px = QPixma...
pyqt5使用label显示图片
关于label的介绍很详细的地址:https://zhuanlan.zhihu.com/p/32134728 代码如下 import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QLabel from PyQt5.QtGui import QPalette, QBrush, QPixmap ...
Qt中插入图片并在label中显示
参考:http://blog.51cto.com/whylinux/1877629 参考Qt的帮助文档,可支持的类型,即可以直接读取并显示的格式有BMP、GIF、JPG、JPEG、PNG、TIFF、PBM、PGM、PPM、XBM、XPM。具体的步骤为:先打开一个图像;将图像文件加载进QImage对象中;再用QPixmap对象获得图像;最后用QLabel选择一个QPixmap图像对象显示。 第一...
Qt label上画方框实现任意移动
一般我们很好实现在Qt主界面上实现画图,通过paintEvent(QPaintEvent *event)就可以实现在界面上画各种图案,但是在label上该如何操作呢?下面向大家介绍如何在label上画方框。 这里通过自定义一个label类,在自定义label类mylabel中还是使用paintEvent(QPaintEvent *event)函数,对其进行重写,但是这个...
qt界面编程,画矩形框
代码实现使用qt画矩形框的功能,代码小巧玲珑,亲测可用
使用python在图片上画矩形框rectangle
我们使用opencv的rectangle实现,示例程序点击 import cv2 image = cv2.imread('1.jpg') cv2.rectangle(image, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2) cv2.imwrite('2.jpg', image)
在图像中画矩形框(matlab)
在图像中画矩形框(matlab)
android在java代码中绘制矩形框
android在java代码中绘制矩形框本篇博客主要介绍android中如何在java代码中绘制矩形框,下面是实现步骤:一、编写自定义控件DrawImageView:import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics
Matlab如何在图上画包围目标区域的矩形(或圆)
1.rectangle函数功能:创建二维矩形对象。 rectangle函数可以用来画矩形、椭圆、圆,画椭圆和圆时需要设置曲率。 rectangle('Position',[x,y,w,h]) 从点(x,y)开始绘制一个宽w高h的矩形,对坐标轴数据单元指定值。 rectangle(...,'Curvature',[x,y])指定矩阵边的曲率,可以使它从矩形到椭圆不同变化,水平曲率x为
在PyQt5中嵌入matplotlib画的图
小记:前段时间写程序,要在PyQt5中插入统计图,在网上查了很多资料,这里整理一下。 # coding:utf-8 import matplotlib # 使用 matplotlib中的FigureCanvas (在使用 Qt5 Backends中 FigureCanvas继承自QtWidgets.QWidget) from matplotlib.backends.backend_qt5agg i...
Pyqt打开图片并显示
PyCharm下利用pyqt对话框打开图片,显示
MFC中鼠标在picture控件中画矩形提取感兴趣区域
void CPicProcessDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 GetCursorPos(&sel_pos); GetDlgItem(IDC_Pic1)->GetWindowRect(&rect); if (rect.PtInRect(sel_...