Я использую 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_())