Экземпляр веб-камеры не запускается даже после закрытия приложения pyqt - PullRequest
1 голос
/ 30 марта 2019

Я разработал приложение, которое содержит кнопку. При нажатии кнопки запускается веб-камера для захвата кадров с использованием OpenCV в бесконечном цикле. Программа освобождает экземпляр веб-камеры, когда пользователь нажимает «Q». Когда я закрываю приложение, приложение успешно закрывается, но экземпляр веб-камеры не освобождается и продолжает работать. Как сделать так, чтобы ресурсы веб-камеры высвобождались при закрытии приложения.

Webcam.py: -

import cv2

def hello():

    camera = cv2.VideoCapture(0)
    top, right, bottom, left = 10, 350, 225, 590
    num_frames = 0

    while True:
        _, frame = camera.read()

        clone = frame.copy()
        roi = frame[top:bottom, right:left]

        cv2.rectangle(clone, (left, top), (right, bottom), (0, 255, 0), 2)
        num_frames += 1
        cv2.imshow("Video Feed", clone)

        keypress = cv2.waitKey(1) & 0xFF

        if keypress == ord("q"):
            break

    camera.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    hello()

Application.py: -

from PyQt5 import QtCore, QtGui, QtWidgets
from Webcam import hello
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        self.window = MainWindow
        self.window.setObjectName("self.window")
        self.window.resize(800, 600)

        self.centralwidget = QtWidgets.QWidget(self.window)
        self.centralwidget.setObjectName("centralwidget")

        self.startButton = QtWidgets.QPushButton(self.centralwidget)
        self.startButton.setText("&Start")
        self.startButton.clicked.connect(self.open_cam)

        self.window.setCentralWidget(self.centralwidget)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def open_cam(self):
        hello()

class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, parent=None):

        super(MyWindow, self).__init__(parent)
        self.setupUi(self)

    def closeEvent(self, event):
        result = QtWidgets.QMessageBox.question(self,
                      "Confirm Exit...",
                      "Are you sure you want to exit ?",
                      QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No)
        event.ignore()
        if result == QtWidgets.QMessageBox.Yes:
            event.accept()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MyWindow()
    w.show()
    sys.exit(app.exec_())

1 Ответ

1 голос
/ 02 апреля 2019

Это может быть проблема с камерой. Я бы попробовал изменить способ реализации вашей камеры на основе этого примера https://stackoverflow.com/a/11449901/8150685.. Я также рекомендовал бы изменить камеру на класс, чтобы вы могли контролировать, как она настроена и как она умирает.

Примечание: Я не на компьютере с Qt, поэтому это не проверено. Я могу отладить или это может не сработать.

import cv2

class Camera:
    def __init__(self):

        self.alive = True
        self.vc = None


    def run(self):

        self.vc = cv2.VideoCapture(0)
        if self.vc.isOpened(): # try to get the first frame
            self.rval, self.frame = self.vc.read()
        else:
            self.rval = False

        while self.rval:
            cv2.imshow("preview", self.frame)
            self.rval, self.frame = self.vc.read()
            key = cv2.waitKey(20)
            if key == ord("q"): # exit on q
                break
        self.destroy()

    def destroy(self):
        if self.alive and self.vc:
            cv2.destroyWindow("preview")
            self.vc.release()
            self.alive = False

Теперь в Qt вы можете создать объект Camera.

from PyQt5 import QtCore, QtGui, QtWidgets
from Webcam import Camera
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow, camera):

        self.camera = camera
        self.window = MainWindow
        self.window.setObjectName("self.window")
        self.window.resize(800, 600)

        self.centralwidget = QtWidgets.QWidget(self.window)
        self.centralwidget.setObjectName("centralwidget")

        self.startButton = QtWidgets.QPushButton(self.centralwidget)
        self.startButton.setText("&Start")
        self.startButton.clicked.connect(self.open_cam)

        self.window.setCentralWidget(self.centralwidget)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def open_cam(self):
        self.camera.run() # Run the camera

class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):

    def __init__(self, camera, parent=None):
        self.camera = camera
        super(MyWindow, self).__init__(parent)
        self.setupUi(self, self.camera) # Pass our camera pointer

    def closeEvent(self, event):
        result = QtWidgets.QMessageBox.question(self,
                      "Confirm Exit...",
                      "Are you sure you want to exit ?",
                      QtWidgets.QMessageBox.Yes| QtWidgets.QMessageBox.No)
        event.ignore()
        if result == QtWidgets.QMessageBox.Yes:
            self.camera.destroy() # Destroy the camera if it is not already
            event.accept()


if __name__ == "__main__":
    cam = Camera()
    app = QtWidgets.QApplication(sys.argv)
    w = MyWindow(cam)
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...