如何使用opencv在pyqt5中同时在不同窗口中运行一个网络摄像头

Posted

技术标签:

【中文标题】如何使用opencv在pyqt5中同时在不同窗口中运行一个网络摄像头【英文标题】:how to run one webcam in different window simultaneously in pyqt5 using opencv 【发布时间】:2020-06-22 11:38:37 【问题描述】:

我想在 2 个窗口中并行运行我的笔记本电脑网络摄像头。但我不能同时运行两个相机。我可以一次运行一台摄像机。如何在 pyqt5 中单击按钮在两个窗口中运行一台摄像机。我听说可以通过“线程”来完成。但我没有这方面的经验。有人可以使用线程或其他方法帮助我解决此代码。我无法上传“main.ui”文件,这就是我提供图片的原因。

from PyQt5.QtGui import *
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import qdarkstyle  # builtin dark theme
import sys
import os
import cv2
import time
import datetime
from datetime import timedelta
from threading import Thread
import concurrent.futures as cf

# =======================
# load all ui file
# =======================

ui, _ = loadUiType( 'main.ui' )

class MainApp( QMainWindow, ui ):
    def __init__( self, parent = None ):
        QMainWindow.__init__( self )
        self.setupUi( self )
        self.connect = 0
        self.initUi()
        self.buttons()


def initUi( self ):
    self.setWindowTitle( 'webcam' )
 

def buttons( self ):
    self.connectWebcam1.clicked.connect(self.callCamera1 )
    self.connectWebCam2.clicked.connect(self.callCamera2)

def callCamera1(self):
   
   self.connectCamera1Entry()

def callCamera2(self):
   
   self.connectCamera2Exit()
   
   
def connectCamera1Entry( self ):
    
    cap = cv2.VideoCapture( 0 )
    
    while True:
        _, frame = cap.read()
        cv2.imshow('camera 1[Entry]', frame)
        
        if cv2.waitKey( 1 ) & 0xFF == ord( 'q' ):
            break
    
    cap.release()
    cv2.destroyAllWindows()

def connectCamera2Exit(self):
   
    cap = cv2.VideoCapture( 0 )
    
    while True:
        _, frame = cap.read()
        cv2.imshow('camera 2[Exit]', frame)
        
        if cv2.waitKey( 1 ) & 0xFF == ord( 'q' ):
            break
    
    cap.release()
    cv2.destroyAllWindows()


def main():
    app = QApplication( sys.argv )
    app.setStyleSheet( qdarkstyle.load_stylesheet_pyqt5() )  # load the builtin dark theme
    window = MainApp()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

这是不可能的。因为相机设备已经忙于 connectCamera1Entry(),所以在 connectCamera2Exit() 中读取会失败。

这个故障发生在 linux 的 v4l2 层而不是 Qt 层。

诸如关闭和打开设备之类的想法会起作用。

【讨论】:

我正在使用 Windows。只有一个设备(我的笔记本电脑网络摄像头)。但我想通过单击 connectWebcam1 和 connectWebcam2 按钮同时在 2 个窗口中显示相机。 使用 Directshow 层我猜你也会遇到同样的问题。据我所知,你可以有两个渲染器,从硬件读取数据只会一次。

以上是关于如何使用opencv在pyqt5中同时在不同窗口中运行一个网络摄像头的主要内容,如果未能解决你的问题,请参考以下文章

pyqt5 继承python类可以传递信号函数吗

使用 OpenCV 在同一窗口中显示多个图像

PyQt5番外篇:PyQt5与Opencv的小小融合

如何在 PyQt5 中同时读取和写入文件时正确执行多线程?

如何在pyqt5中的两个窗口之间传递参数?

如何在这个 pyqt5 窗口中使用 while 循环