如何使用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中同时在不同窗口中运行一个网络摄像头的主要内容,如果未能解决你的问题,请参考以下文章