-1073740791(0xC0000409)在QLabel上设置Pixmap时出错

时间:2018-08-14 11:16:23

标签: python pyqt5 opencv3.0 qlabel qpixmap

可悲的是,就像Python / PyQt并没有给出有关此类事件的特定错误消息一样,我只在运行代码时得到此错误代码。

  

进程以退出代码-1073740791(0xC0000409)完成

我正在使用PyQt和OpenCV来构建一个显示网络摄像头供稿的应用。

import sys
import cv2
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QDialog
from PyQt5.uic import loadUi
from qtpy import QtGui

class MainUI(QDialog):
    read=0;
    def __init__(self):
        super(MainUI,self).__init__()
        loadUi('MainUI.ui',self)
        self.image=None
        self.btnPlay.clicked.connect(self.start_webcam)
        self.btnStop.clicked.connect(self.stop_webcam)

    def start_webcam(self):
        self.capture=cv2.VideoCapture(0)
        self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
        self.capture.set(cv2.CAP_PROP_FRAME_WIDTH,640)

        self.timer=QTimer(self)
        self.timer.timeout.connect(self.update_frame())
        self.timer.start(5)

    def stop_webcam(self):
        self.timer.stop()

    def update_frame(self):
        #Take image from video feed
        ret,self.image = self.capture.read()
        self.image=cv2.flip(self.image,1)
        self.displayImage(self.image,1)

    def displayImage(self,img,window=1):
        qformat=QImage.Format_Indexed8
        if(len(img.shape)==3):  #[0]rows,[1]=cols,[2]=channels
            if img.shape[2]==4 :
                qformat=QImage.Format_RGBA8888
            else:
                qformat=QImage.Format_RGB888

        outImage=QImage(img,img.shape[1],img.shape[0],img.strides[0],qformat)
        #BGR>>RGB
        outImage = outImage.rgbSwapped()

        if window==1:
            #Problem occurs here V
            self.imgLabel.setPixmap(QPixmap.fromImage(outImage))
            self.imgLabel.setScaledContents(True)

if __name__=='__main__':
    app=QApplication(sys.argv)
    window = MainUI()
    window.setWindowTitle('PYQt Webcam feed')
    window.show()
    sys.exit(app.exec_())

我尝试使用不同的方法来进行此操作,并且已经完成了研究,但是我真的不明白自己在做什么错。 :(

我正在研究以下代码:

OpenCV Python GUI开发教程10:在QLabel上显示WebCam视频提要

https://www.youtube.com/watch?v=MUpC6z32bCA&feature=youtu.be&t=3m30s

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码有几个错误:

  • 在线:self.timer.timeout.connect(self.update_frame())正在传递评估函数,但必须传递不带()的函数名称。

  • 假设以上内容已得到纠正,您将遇到另一个问题,每次您按btnPlay时,您都在调用start_webcam,并且在该方法中,您正在创建一个新的QTimer,因此,如果按n次,则无法通过以下方法停止它由于先前计时器的引用已丢失,因此请按btnStop。

  • QTimer的创建必须从头开始,并且仅将按钮的单击信号连接到QTimer的开始和停止方法

  • 另一方面,取决于硬件,每5毫秒读取一次并不一定会生成图像,opencv表示该读取是正确的return ret,如果是这样,则表示读取成功了,您可以只需处理它即可。

  • image不必为类赋予属性,因为您仅在函数中使用它。


import sys
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets, uic

class MainUI(QtWidgets.QDialog):
    def __init__(self):
        super(MainUI, self).__init__()
        uic.loadUi('MainUI.ui', self)

        self.capture = cv2.VideoCapture(0)
        self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
        self.capture.set(cv2.CAP_PROP_FRAME_WIDTH,640)

        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.update_frame)
        timer.setInterval(5)

        self.btnPlay.clicked.connect(timer.start)
        self.btnStop.clicked.connect(timer.stop)

    def update_frame(self):
        #Take image from video feed
        ret, image = self.capture.read()
        if ret:
            image=cv2.flip(image, 1)
            self.displayImage(image, 1)

    def displayImage(self, img, window=1):
        qformat = QtGui.QImage.Format_Indexed8
        if len(img.shape) == 3:  #[0]rows,[1]=cols,[2]=channels
            if img.shape[2] == 4 :
                qformat = QtGui.QImage.Format_RGBA8888
            else:
                qformat = QtGui.QImage.Format_RGB888

        outImage = QtGui.QImage(img,img.shape[1],img.shape[0],img.strides[0],qformat)
        #BGR>>RGB
        outImage = outImage.rgbSwapped()

        if window == 1:
            self.imgLabel.setPixmap(QtGui.QPixmap.fromImage(outImage))
            self.imgLabel.setScaledContents(True)

if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MainUI()
    window.setWindowTitle('PYQt Webcam feed')
    window.show()
    sys.exit(app.exec_())

  

可悲的是,Python / PyQt并未给出具体的错误消息   关于这些事情,我只会在出现以下错误代码时   运行我的代码。

该问题不是Python或PyQt,而是您的IDE,许多IDE无法显示所有错误,因此我建议您从CMD或终端上运行它,然后在其中找到完整的错误消息。