Flask с opencv-python: держите камеру включенной перед доступом к g @app.route и делайте снимок при отправке запроса GET

Я пытаюсь инициализировать камеру и запустить видеопоток, а затем открыть функцию @app.route, и кадр должен быть сохранен только тогда, когда я получаю URL-адрес из запроса GET.

Мой код:

from flask import Flask, jsonify
from flask import request
from flask_restful import Resource, Api, reqparse
from datetime import datetime
import time
import numpy as np
import glob
import os
import sys
import cv2

# initialize the flask application
app = Flask(__name__)


# initialize the camera and grab a reference to the raw camera capture
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

#RESTAPI for image
@app.route('/take_image')
def image():
    start_time = time.time()       
    jobnummer = request.args.get('JOB') #if key doesn't exist, returns None
            
    #save the frame when GET Request is sentt
    if jobnummer: 
        cv2.imwrite('test.jpg', frame) 
        
    end_time = time.time()
    time_tot = end_time-start_time
    res = {"jobnummer" : jobnummer,
           "time":time_tot
           }
    return jsonify(res) , 200
    
if __name__ == "__main__":
#     run flask application in debug mode
    app.run(debug=True,port=5000,host='0.0.0.0')

Но когда я запускаю это, из-за цикла while я не могу войти в функцию @app.route. Есть ли способ сохранить видео в рабочем состоянии, а затем получить доступ к @app.route?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот демонстрация, которая решает проблему:


from flask import Flask, render_template, Response
import cv2

app = Flask(__name__)

'''
for ip camera use - rtsp://username:password@ip_address:554/user=username_password='password'_channel=channel_number_stream=0.sdp' 
for local webcam use cv2.VideoCapture(0)
'''

camera = cv2.VideoCapture(0)


def gen_frames():  
    while True:
        success, frame = camera.read()  # read the camera frame
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  

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

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

if __name__ == "__main__":
    app.run(debug=True)

index.html (использует бутстрап, но не обязательно)

<!doctype html>
<html lang = "en">
<head>
    <!-- Required meta tags -->
    <meta charset = "utf-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
          integrity = "sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin = "anonymous">

    <title>Live Streaming Demonstration</title>
</head>
<body>
<div class = "container">
    <div class = "row">
        <div class = "col-lg-8  offset-lg-2">
            <h3 class = "mt-5">Live Streaming</h3>
            <img src = "{{ url_for('video_feed') }}" width = "100%">
        </div>
    </div>
</div>
</body>
</html>

Адаптировано из здесь с кодом здесь

Спасибо за ответ! Я попробую

Shameendra 15.12.2020 15:52

Другие вопросы по теме