PyQt5在小部件中显示来自openCV的视频流

时间:2018-12-21 11:17:28

标签: python opencv pyqt pyqt5

我正在构建一个PyQt应用程序,该应用程序应该使用openCV 2显示传入的视频流。如何将正确的参数传递给QT连接插槽?

使用imshow-method允许流工作,但是现在我想在MainWindow的小部件中显示流。openCV功能在单独的线程上运行。

我找到了关于该问题的this question,但对于PyQt4。由于我使用的是PyQt5,因此需要进行一些更改。我发现an answer to another question与此有关,并且我试图修改我的代码以进行这些更改,但是由于出现错误提示

,因此我不确定我是否一切正确
  

TypeError:setFrame()缺少1个必需的位置参数:“ frame”

class computerVisionThread(QtCore.QThread):

    changePixmap = QtCore.pyqtSignal(QtGui.QImage)

    def __init__(self, address):
        super().__init__()
        self.url = address

    def run(self):
        cap = cv2.VideoCapture("http://" + str(self.url) + ":8081")
        while True:
            ret, frame = cap.read()
            if ret:
                rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                convertToQtFormat = QtGui.QImage(rgbImage.data, rgbImage.shape[1], rgbImage.shape[0], QtGui.QImage.Format_RGB888)
                p = convertToQtFormat.scaled(640, 480, QtCore.Qt.KeepAspectRatio)
                self.changePixmap.emit(p)


class Window(QtWidgets.QMainWindow):

def __init__(self):
    #...
    self.show()

    @pyqtSlot(QtGui.QImage)
    def setFrame(self, frame):
        self.label.setPixmap(QtGui.QPixmap.fromImage(frame))

    self.video = computerVisionThread(self.IPAddressLineEdit.text())
    self.video.changePixmap.connect(setFrame)
    self.video.start()

0 个答案:

没有答案