如何使用pyqt5捕获图像?

时间:2018-09-05 17:23:13

标签: python user-interface pyqt5

我在开发相机软件的程序时不熟悉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_())

任何建议都可以接受

1 个答案:

答案 0 :(得分:2)

它看起来像是一个线程问题。由于您的线程正在使用相机,因此您可能无法在主线程中读取它。尝试不启动线程,因为似乎没有用它,并且未在您的目标中说明。相反,如果您要连续获取帧并在单击按钮时保存它们,则必须编写一个插槽,该插槽与线程中发出的信号连接,然后放入一些逻辑以在按钮时保存单击。

此外,您似乎在click_picture中有一个无限循环,并且该方法中的读取语法应类似于:flag, frame = cap.read()

如果您对使用类似方法的项目感兴趣,请查看此内容(免责声明,我是作者之一。):https://github.com/natedileas/ImageRIT/blob/master/Server/qt_CameraWidget.py