小编gaw*_*103的帖子

Flask 被 OpenCV 冻结

在我当前的烧瓶项目中,我正在尝试流式传输两个现场视频,这听起来很简单。问题是我只有一个视频源(相机)。目的是有两个视频流:一个没有任何修改,一个应用了人脸检测。如果用户想要进行人脸检测,那么通过单击按钮,他的相机视图将更改为应用了人脸检测的流。如果用户不想拥有它,那么他将看到没有它的流。非常重要的是 - 多个用户可以一次查看流。整个程序适用于 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)

python opencv flask python-3.x raspberry-pi

5
推荐指数
1
解决办法
374
查看次数

更改相机流时烧瓶损坏的管道

在我的烧瓶应用程序中,我经常遇到管道损坏错误(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)

python multithreading pipe flask python-3.x

5
推荐指数
0
解决办法
179
查看次数

标签 统计

flask ×2

python ×2

python-3.x ×2

multithreading ×1

opencv ×1

pipe ×1

raspberry-pi ×1