我在开发相机软件的程序时不熟悉pyqt5,单击按钮以捕获图像。当我按Enter时,它单击图像并保存在磁盘中。当我按下按钮时,图像没有保存,并且关闭了程序,我无法弄清楚我犯的错误
错误是
进程以退出代码-1073740791(0xC0000409)完成
我的代码是
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import cv2
cap = cv2.VideoCapture(0)
class Thread(QThread):
changePixmap = pyqtSignal(QImage)
def run(self):
while (True):
ret, frame = cap.read()
rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
convertToQtFormat = QImage(rgbImage.data, rgbImage.shape[1], rgbImage.shape[0], QImage.Format_RGB888)
p = convertToQtFormat.scaled(640, 480, Qt.KeepAspectRatio)
self.changePixmap.emit(p)
class camera(QWidget):
def __init__(self):
super().__init__()
self.title = 'Camera'
self.left = 0
self.top = 0
self.width = 640
self.height = 480
self.cameraUI()
@pyqtSlot(QImage)
def setImage(self, image):
self.label.setPixmap(QPixmap.fromImage(image))
def cameraUI(self):
self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)
self.resize(1800, 1200)
# create a label
self.label = QLabel(self)
self.label.move(100, 120)
self.label.resize(640, 480)
camera_button = QPushButton("camera_click", self)
camera_button.move(50, 50)
camera_button.clicked.connect(self.click_picture)
th = Thread(self)
th.changePixmap.connect(self.setImage)
th.start()
self.show()
def click_picture(self):
while (True):
frame= cap.read()
img_name = "image.png"
cv2.imwrite(img_name,frame)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = camera()
ex.show()
sys.exit(app.exec_())
任何建议都可以接受
答案 0 :(得分:2)
它看起来像是一个线程问题。由于您的线程正在使用相机,因此您可能无法在主线程中读取它。尝试不启动线程,因为似乎没有用它,并且未在您的目标中说明。相反,如果您要连续获取帧并在单击按钮时保存它们,则必须编写一个插槽,该插槽与线程中发出的信号连接,然后放入一些逻辑以在按钮时保存单击。
此外,您似乎在click_picture中有一个无限循环,并且该方法中的读取语法应类似于:flag, frame = cap.read()
。
如果您对使用类似方法的项目感兴趣,请查看此内容(免责声明,我是作者之一。):https://github.com/natedileas/ImageRIT/blob/master/Server/qt_CameraWidget.py