python opencv pyqt pyqt5 qpixmap

python - PyQt que muestra la transmisión de video de opencv



pyqt5 qpixmap (2)

El problema es que la función que obtiene la imagen se ejecuta solo una vez y no actualiza la etiqueta.
La forma correcta es colocarlo dentro de un bucle, pero provocará el bloqueo de la ventana principal. Este bloqueo de la ventana principal se puede resolver utilizando la clase QThread y enviando una señal QImage para actualizar la etiqueta. Por ejemplo:

class Thread(QThread): changePixmap = pyqtSignal(QImage) def run(self): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if ret: # https://stackoverflow.com/a/55468544/6622587 rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgbImage.shape bytesPerLine = ch * w convertToQtFormat = QtGui.QImage(rgbImage.data, w, h, bytesPerLine, QtGui.QImage.Format_RGB888) p = convertToQtFormat.scaled(640, 480, Qt.KeepAspectRatio) self.changePixmap.emit(p) class App(QWidget): def __init__(self): super().__init__() [...] self.initUI() @pyqtSlot(QImage) def setImage(self, image): self.label.setPixmap(QPixmap.fromImage(image)) def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.resize(1800, 1200) # create a label self.label = QLabel(self) self.label.move(280, 120) self.label.resize(640, 480) th = Thread(self) th.changePixmap.connect(self.setImage) th.start()

Intente vincular la alimentación de video PyQt y Opencv, no puedo entender cómo aplicarlo mientras realiza un bucle para la transmisión continua de video. Solo toma una foto fija. Por favor, ¿alguien puede ayudar a resolver el problema?

  • PtQt = 5

  • Python = 3.6.1

class App(QWidget): def __init__(self): super().__init__() self.title = ''PyQt5 Video'' self.left = 100 self.top = 100 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.resize(1800, 1200) #create a label label = QLabel(self) cap = cv2.VideoCapture(0) ret, frame = cap.read() rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) convertToQtFormat = QtGui.QImage(rgbImage.data, rgbImage.shape[1], rgbImage.shape[0], QtGui.QImage.Format_RGB888) convertToQtFormat = QtGui.QPixmap.fromImage(convertToQtFormat) pixmap = QPixmap(convertToQtFormat) resizeImage = pixmap.scaled(640, 480, QtCore.Qt.KeepAspectRatio) QApplication.processEvents() label.setPixmap(resizeImage) self.show() if __name__ == ''__main__'': app = QApplication(sys.argv) ex = App() sys.exit(app.exec_())


Gracias Taimur Islam por la pregunta. Gracias eyllanesc por una respuesta maravillosa y he modificado un poco tu código. Utilicé PtQt = 4 Python = 2.7 y no utilicé opencv

import sys import numpy as np import flycapture2 as fc2 from PyQt4.QtCore import (QThread, Qt, pyqtSignal) from PyQt4.QtGui import (QPixmap, QImage, QApplication, QWidget, QLabel) class Thread(QThread): changePixmap = pyqtSignal(QImage) def __init__(self, parent=None): QThread.__init__(self, parent=parent) self.cameraSettings() def run(self): while True: im = fc2.Image() self.c.retrieve_buffer(im) a = np.array(im) rawImage = QImage(a.data, a.shape[1], a.shape[0], QImage.Format_Indexed8) self.changePixmap.emit(rawImage) def cameraSettings(self): print(fc2.get_library_version()) self.c = fc2.Context() numberCam = self.c.get_num_of_cameras() print(numberCam) self.c.connect(*self.c.get_camera_from_index(0)) print(self.c.get_camera_info()) m, f = self.c.get_video_mode_and_frame_rate() print(m, f) print(self.c.get_property_info(fc2.FRAME_RATE)) p = self.c.get_property(fc2.FRAME_RATE) print(p) self.c.set_property(**p) self.c.start_capture() class App(QWidget): def __init__(self): super(App,self).__init__() self.title = ''PyQt4 Video'' self.left = 100 self.top = 100 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.resize(800, 600) # create a label self.label = QLabel(self) self.label.move(0, 0) self.label.resize(640, 480) th = Thread(self) th.changePixmap.connect(lambda p: self.setPixMap(p)) th.start() def setPixMap(self, p): p = QPixmap.fromImage(p) p = p.scaled(640, 480, Qt.KeepAspectRatio) self.label.setPixmap(p) if __name__ == ''__main__'': app = QApplication(sys.argv) ex = App() ex.show() sys.exit(app.exec_())