【发布时间】:2019-08-13 20:34:00
【问题描述】:
我尝试了来自this 答案的代码,但它在一段时间(2-10 秒)后因错误Process finished with exit code -1073740771 (0xC000041D) 而崩溃,有时与0xC0000005 一起崩溃。如果我尝试拖动窗口,它会立即崩溃。
但是,当我将time.sleep(0.1) 放入run 时,它工作正常。如果我使用的睡眠时间短于 0.1,它会再次崩溃。
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel,QMessageBox
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QThread, pyqtSignal, pyqtSlot, Qt
import cv2
import sys
import time
class CamThread(QThread):
changemap = pyqtSignal('QImage')
def run(self):
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
while True:
ret, img_rgb = cap.read()
if ret:
self.rgb = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2RGB)
self.convert = QImage(self.rgb.data, self.rgb.shape[1], self.rgb.shape[0], QImage.Format_RGB888)
self.p = self.convert.scaled(640, 480, Qt.KeepAspectRatio)
self.changemap.emit(self.p)
#time.sleep(0.1)
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'webcam'
self.initUI()
@pyqtSlot('QImage')
def setImage(self, image):
self.label.setPixmap(QPixmap.fromImage(image))
def initUI(self):
self.setWindowTitle(self.title)
self.setGeometry(100, 100, 640, 480)
self.resize(640, 480)
self.label = QLabel(self)
self.label.resize(640, 480)
thr = CamThread(self)
thr.changemap.connect(self.setImage)
thr.start()
app = QApplication(sys.argv)
win = App()
#win.setAttribute(Qt.WA_DeleteOnClose, True)
win.show()
app.exit(app.exec_())
我认为问题出在信号/插槽中,但找不到任何相关内容。
Windows 10
Python - 3.7
Pyqt - 5.12
OpenCV - 3.4.5.20
【问题讨论】:
-
将
self.rgb更改为rgb,self.convert更改为convert和self.p更改为p -
试过了。没有任何改变
-
在 CMD 中执行它,你应该在那里给你更多的信息
-
仍然粉碎。在 CMD 中不显示任何内容,甚至是以前的错误。
-
嗯,你为什么要超过100ms的图像?,相机提供30FPS的图像是30ms,你相机的FPS是多少?
标签: python python-3.x opencv pyqt5 qthread