Не могу передать измененную геометрию QLabel из класса - PullRequest
0 голосов
/ 31 мая 2019

Я использую PyQt5 и OpenCV.Я хочу создать класс, который читает кадр видео и выполняет растягивание резинкой, чтобы сгенерировать геометрию, которая будет использоваться другим классом для обрезки видеопотока (этот второй класс не включен в этот пример).

В этом примере изображение захватывается из потока веб-камеры, а затем отображается.Резинка, натянутая на изображение, создает геометрию, которая будет напечатана.Геометрия печатается без проблем в пределах класса ReGeomVid, но не в пределах main().Мне нужно получить геометрию в main().Помощь приветствуется.

import sys, cv2
from PyQt5.QtWidgets import QRubberBand, QApplication, QLabel
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import QRect, QSize

class ReGeomVid (QLabel):
    def __init__(self, cap, parent=None):
        super(ReGeomVid, self).__init__(parent)
        self.cap = cap
        self.currentQRect = QRect()
        self.initUI()

    def initUI (self):        
        ret, frame = self.cap.read() #First frame read is black
        ret, frame = self.cap.read() #Second frame read is normal
        if ret == True:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img = QImage(frame,frame.shape[1], frame.shape[0], QImage.Format_RGB888)
            pix = QPixmap.fromImage(img)
            self.setPixmap(QPixmap(pix))

    def mousePressEvent (self, eventQMouseEvent):
        self.originQPoint = eventQMouseEvent.pos()
        print(self.originQPoint)
        self.currentQRubberBand = QRubberBand(QRubberBand.Rectangle, self)
        self.currentQRubberBand.setGeometry(QRect(self.originQPoint, QSize()))
        self.currentQRubberBand.show()

    def mouseMoveEvent (self, eventQMouseEvent):
        self.currentQRubberBand.setGeometry(QRect(self.originQPoint, eventQMouseEvent.pos()).normalized())

    def mouseReleaseEvent (self, eventQMouseEvent):
        self.currentQRubberBand.hide()
        self.currentQRect = self.currentQRubberBand.geometry()        
        self.currentQRubberBand.deleteLater()
        self.croppedPixmap = self.pixmap().copy(self.currentQRect)
        print("In mouserelease: Geometry = ", self.currentQRect)

if __name__ == '__main__':
    myQApplication = QApplication(sys.argv)
    stream = cv2.VideoCapture(0)
    x = ReGeomVid(stream)
    x.show()
    pixMainGeom = x.currentQRect
    print("In main: Geometry = ", x.currentQRect)
    sys.exit(myQApplication.exec_())

1 Ответ

2 голосов
/ 31 мая 2019

Ваша переменная self.currentQRect установлена ​​в mouseReleaseEvent.Таким образом, когда print в вашей сети выполняется, он все еще недействителен.

Используйте сигнал для запуска кода в вашей сети, когда self.currentQRect будет готов:

class ReGeomVid (QLabel):
    currentQRectChanged = pyqtSignal(QRect)
...
    def mouseReleaseEvent (self, eventQMouseEvent):
        ...
        self.currentQRectChanged.emit(self.currentQRect)

def printCurrentQRect(rect):
    print("In main: Geometry = ", rect)


if __name__ == '__main__':
    myQApplication = QApplication(sys.argv)
    stream = cv2.VideoCapture(0)
    x = ReGeomVid(stream)
    x.show()
    x.currentQRectChanged.connect(printCurrentQRect)
    sys.exit(myQApplication.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...