在我当前的烧瓶项目中,我正在尝试流式传输两个现场视频,这听起来很简单。问题是我只有一个视频源(相机)。目的是有两个视频流:一个没有任何修改,一个应用了人脸检测。如果用户想要进行人脸检测,那么通过单击按钮,他的相机视图将更改为应用了人脸检测的流。如果用户不想拥有它,那么他将看到没有它的流。非常重要的是 - 多个用户可以一次查看流。整个程序适用于 RPi 4B 4gb。
我有一个 CamerasPool 类:
from .CameraHandler import CameraHandler
import cv2
class CamerasPool:
def __init__(self):
self.__cameras = []
def registerCamera(self, id, detection):
self.__cameras.append(CameraHandler(id, cv2.VideoCapture(0), detection))
print('Camera registered')
def getCamWithParameters(self, detection):
camera = None
for cam in self.__cameras:
if cam.getDetectionState() == detection:
camera = cam
break
return camera
Run Code Online (Sandbox Code Playgroud)
和 CamerasHandler 类:
import cv2
from time import sleep
class CameraHandler():
def __init__(self, id, cam, detectionState):
self.__id = id
self.__cam = cam
self.__current_frame = None
self.__shouldDetect = detectionState
print(f'Camera …Run Code Online (Sandbox Code Playgroud) 在我的烧瓶应用程序中,我经常遇到管道损坏错误(Errno 32)。我有一个在 RPi 上运行的 Flask 服务器,它有摄像头。应用程序非常简单:读取相机帧并在网站上显示流。但是我想要两个摄像头流:一个有对象检测,一个没有,所以为了实现这一点,我创建了两个类来表示它们。他们有带有相机帧的队列,他们所做的就是在 html 中生成帧。相机和流类在线程中工作。
下面是 Camera 类的样子:
from threading import Thread
from copy import deepcopy
import queue
import cv2
class Camera(Thread):
def __init__(self, cam, normalQue, detectedQue):
Thread.__init__(self)
self.__cam = cam
self.__normalQue = normalQue
self.__detectedQue = detectedQue
self.__shouldStop = False
def __del__(self):
self.__cam.release()
print('Camera released')
def run(self):
while True:
rval, frame = self.__cam.read()
if rval:
frame = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
_, jpeg = cv2.imencode('.jpg', frame)
self.__normalQue.put(jpeg.tobytes())
self.__detectedQue.put(deepcopy(frame))
if self.__shouldStop:
break
def stopCamera(self):
self.__shouldStop = True …Run Code Online (Sandbox Code Playgroud)