【问题标题】:how to capture an image using pyqt5? [duplicate]如何使用 pyqt5 捕获图像? [复制]
【发布时间】:2019-02-10 21:59:08
【问题描述】:

我是 pyqt5 的新手,当我在做一个开发相机软件的程序时,会给出一个点击按钮来捕捉图像。当我按下回车键时,它会单击图像并保存在磁盘中。当我按下按钮时,图像没有保存并且它关闭了程序我无法弄清楚我犯的错误

错误是

进程以退出代码 -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_())

欢迎提出任何建议

【问题讨论】:

    标签: python user-interface pyqt5


    【解决方案1】:

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

    另外,看起来你在 click_picture 中有一个无限循环,该方法中的读取语法应该类似于:flag, frame = cap.read()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多