Создание многопоточного потока OpenCV-камеры на сервере Flask - PullRequest
0 голосов
/ 30 октября 2019

Итак, у меня есть требование создания видеопотока с OpenCV. Я получаю доступ к своей камере ноутбука и отображаю каждый кадр на Flask. Кроме того, каждые 5 секунд делается снимок (имя файла - текущая временная метка).

У меня 2 проблемы:

  • Поток «время от времени» «отстает», потому чтоиз сделанного снимка, я думаю,
  • Только один клиент может получить доступ к потоку одновременно, поэтому, когда я открываю поток на своем ноутбуке и моем смартфоне (оба находятся в одной сети), новый клиентобслуживается, а старый зависает.

Вот мой исходный код:

server.py

from camera import VideoCamera
import time

app = Flask(__name__)


def gen(camera):
    last_recorded_time = time.time()
    while True:
        curr_time = time.time()
        frame = camera.get_encoded_frame()
        if curr_time - last_recorded_time >= 5:
            camera.save_encoded_frame(frame)
            last_recorded_time = curr_time
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')


@app.route('/')
def video_route():
    return Response(gen(VideoCamera()), mimetype='multipart/x-mixed-replace; boundary=frame')


if __name__ == '__main__':
    app.run(host='10.0.0.6', threaded=True, debug=True)

camera.py

import cv2
import datetime
import numpy as np

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

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

    def get_encoded_frame(self):
        _, image = self.video.read()
        return cv2.imencode('.jpg', image)[1].tobytes()

    def save_encoded_frame(self, frame_in_bytes):
        nparr = np.fromstring(frame_in_bytes, np.uint8)
        decoded_image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
        cv2.imwrite("{}.jpg".format(datetime.datetime.now().strftime('%y_%m_%d____%H_%M_%S')), decoded_image)

Я уже пробовал параметр "threadaded" в методе запуска Flask, но он не исправляет никаких проблем.

Буду признателен за любую помощь !!!

...