Многокамерное потоковое видео с использованием Flask и Opencv - PullRequest
0 голосов
/ 24 марта 2020

Я хотел разработать API, который будет передавать поток с камеры на модель ML для обнаружения лиц и рисовать ограничивающие рамки вокруг идентифицированных лиц, и один и тот же API должен быть доступен для более чем одного запроса API. Ниже приведен код, который я написал и работает совершенно нормально. Однако, когда я пытаюсь вызвать другой экземпляр API, пока первый еще не запущен, на второй запрос нет ответа. Я знаю, что сервер занят обработкой первого запроса, так как это потоковая передача с камеры на сервер в режиме реального времени. Не могли бы вы, пожалуйста, мне, как я могу сделать это для нескольких камер

import os
import sys
import cv2
import argparse
import json
import time
import numpy as np
from flask import Flask, redirect, url_for, request, Response, jsonify, redirect, render_template
from werkzeug.utils import secure_filename
from gevent.pywsgi import WSGIServer
from PIL import Image
from io import BytesIO
from camera import VideoCamera

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

app = Flask(__name__)

def gen(camera):
    while True:
        frame = camera.get_frame()
        frame = jpeg.tobytes()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')


@app.route('/')
def index():
    return render_template('index.html')

@app.route('/recognize', methods=['GET'])
def recognize():
    if request.method == 'GET':
        camera_id = int(request.values.get('camid'))
        return Response(gen(VideoCamera(camera_id)),mimetype='multipart/x-mixed-replace; boundary=frame') 


if __name__ == '__main__':
    http_server = WSGIServer(('0.0.0.0',5000), app)
    http_server.serve_forever()      

Ниже приведен файл camera.py

import cv2

class VideoCamera(object):
    def __init__(self,camid):
        self.camid = camid
        self.video = cv2.VideoCapture(self.camid)

    def __del__(self):
        self.video.release()

    def get_frame(self):
        success, image = self.video.read()

        return image
...