PyQt5 QThread cv2 PyQtSignal,在拖动,调整应用程序大小时会崩溃QtGui.QPixmap.fromImage(frame)

时间:2018-12-03 21:42:32

标签: python multithreading pyqt5 qthread cv2

我有问题。我的PyQt5应用程序在我调整大小,拖动,最大化窗口时崩溃。这是线程:

class ImageCapturer(QtCore.QThread):
     changeImages = QtCore.pyqtSignal(QtGui.QImage, QtGui.QImage)
     lower_hsv = numpy.array([0,0,0])
     upper_hsv = numpy.array([180,255,255])
     cap = cv2.VideoCapture(1)

     def run(self):
        while True:
            ret, frame = self.cap.read()
            if ret:
                original = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

                #Some modification to frame

                height, width, channel = original.shape
                qt_img = QtGui.QImage(original, width, height, original.strides[0], QtGui.QImage.Format_RGB888)

                height, width, channel = frame.shape
                qt_img2 = QtGui.QImage(frame, width, height, res.strides[0], QtGui.QImage.Format_RGB888)
                self.changeImages.emit(qt_img, qt_img2)

    self.cap.release()

这也是与信号连接的功能:

@pyqtSlot(QtGui.QImage,QtGui.QImage)
def setImages(self, original, frame):
     qt_pixmap = QtGui.QPixmap.fromImage(original)
     self.original_image.setPixmap(qt_pixmap)

     qt_pixmap = QtGui.QPixmap.fromImage(res)
     self.processed_image.setPixmap(qt_pixmap)

这里的标签代码:

    self.original_image = QtWidgets.QLabel()
    self.original_image.setStyleSheet('border : 1px solid gray')
    self.original_image.setMinimumHeight(240)
    self.original_image.setMinimumWidth(320)
    self.original_image.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
    self.original_image.setScaledContents(True)

    self.processed_image = QtWidgets.QLabel()
    self.processed_image.setStyleSheet('border : 1px solid gray')
    self.processed_image.setMinimumHeight(240)
    self.processed_image.setMinimumWidth(320)
    self.processed_image.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
    self.processed_image.setScaledContents(True)

这里是我如何创建该线程的实例:

    self.getImagesThread = ImageCapturer(self)
    self.getImagesThread.changeImages.connect(self.setImages)
    self.getImagesThread.setTerminationEnabled(True)

我也是基于PyQt showing video stream from opencv

创建的

它不会一直发生,但最多会发生。有时我可以调整最大化大小以及所有这些。.而且我也没有收到任何异常消息或任何其他消息..因为一旦发生,我便从IDLE运行它,它只显示“ >>>”,基本上就是这样。有没有人有办法解决吗?我是这种事物的新手...当我使用self.msleep(500)说时,它也可以正常工作..但是,当我希望它平滑且我希望将其作为视频时,这有什么意义呢?

1 个答案:

答案 0 :(得分:0)

如果没有特别注意,则无法使用线程和GUI。除了主线程外,您不能从任何其他操作GUI对象。如果要将工作卸载到后台线程,请小心通过排队的信号插槽连接将结果传递到主线程。有关此信息,请参阅Qt文档-线程文档中有一些食谱。或看看这个问题:Background thread with QThread in PyQt