繁体   English   中英

在 PyQt5 中为网络摄像头打开新的 window

[英]Open new window for webcam in PyQt5

我想制作网络摄像头 gui,这样当我单击摄像头按钮时,会弹出第二个 window 并开始播放视频。

当我单击返回按钮时,视频应该停止并且 go 到主窗口,但是当我尝试时,即使打印了标志,我也看不到视频。

import threading
import cv2
import threading
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtTest import *
from PyQt5 import QtWidgets
from PyQt5 import QtGui
from PyQt5 import QtCore


running = False


class MyApp(QMainWindow, QWidget):

    def __init__(self):
        super().__init__()
        self.second_UI = QDialog()
        self.label = QtWidgets.QLabel()
        self.first_UI()
        self.show()

    def first_UI(self):
        btn_start = QPushButton("cam on", self)
        btn_start.move(50, 50)
        btn_start.clicked.connect(self.cam_start)
        btn_start.clicked.connect(self.second_exc)
        self.sb = self.statusBar()
        self.sb.showMessage('Ready')

        # Window setting
        self.setWindowTitle('Select Servo Motor')
        self.setGeometry(300, 300, 1024, 768)
        self.show()

    def cam_run(self):
        global running
        print("Flag1")
        self.cap = cv2.VideoCapture(0)
        # 'http://192.168.66.1:9527/videostream.cgi?loginuse=admin&loginpas=admin')
        self.wid = 500
        self.hei = 500
        self.label.resize(self.wid, self.hei)
        while running:
            print("Flag2")
            self.ret, self.img = self.cap.read()
            if self.ret:
                self.img = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB)
                self.h, self.w, self.c = self.img.shape
                self.qImg = QtGui.QImage(self.img.data, self.w, self.h, self.w*self.c,
                                         QtGui.QImage.Format_RGB888)
                self.pixmap = QtGui.QPixmap.fromImage(self.qImg)
                self.label.setPixmap(self.pixmap)
                print("Flag3")
        self.cap.release()
        print("Thread end.")

    def cam_start(self):  # , UI_param):
        #UI_param = self.second_UI
        global running
        running = True
        self.th = threading.Thread(target=self.cam_run)
        self.th.start()
        print("started...")

    def second_exc(self):
        self.close()
        self.cam_run

        return_btn = QPushButton('Return', self.second_UI)
        return_btn.move(50, 700)  # set position
        # return_btn.resize(return_btn.sizeHint())
        return_btn.clicked.connect(self.first_UI)

        self.second_UI.setWindowTitle('Select User Mode')
        self.second_UI.setGeometry(300, 300, 1024, 768)
        self.second_UI.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex_ = MyApp()
    sys.exit(app.exec_())

看下面的编码。 它可以满足您的目标。 我建议使用 qt 设计器创建 ui,而不是摸索编码。

import cv2
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow, QApplication
cap = cv2.VideoCapture(0)

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        
        uic.loadUi(r"main_window.ui", self)

        self.btn_start_cam.clicked.connect(self.start_cam)
        self.btn_return.clicked.connect(self.stop_cam)

    def start_cam(self):
        #Initialize video capture
        #scaling factor
        scaling_factor = 0.5
        ret, frame = cap.read()
        # Resize the frame
        frame = cv2.resize(frame, None, fx=scaling_factor, 
        fy=scaling_factor, interpolation=cv2.INTER_AREA)
        # Display the image
        cv2.imshow('Webcam', frame)
    
    def stop_cam(self):
        # Release the video capture object
        cap.release()
        # Close all active windows
        cv2.destroyAllWindows()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM