可悲的是,就像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
任何帮助将不胜感激。谢谢!
答案 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或终端上运行它,然后在其中找到完整的错误消息。