|
|
from flask import Flask, render_template, request, Response |
|
|
import base64 |
|
|
import cv2 |
|
|
import numpy as np |
|
|
from datetime import datetime |
|
|
|
|
|
app = Flask(__name__) |
|
|
latest_frame = None |
|
|
|
|
|
@app.route('/') |
|
|
def index(): |
|
|
return render_template('test_streaming_index.html') |
|
|
|
|
|
@app.route('/upload_frame', methods=['POST']) |
|
|
def upload_frame(): |
|
|
global latest_frame |
|
|
data_url = request.json['image'] |
|
|
header, encoded = data_url.split(",", 1) |
|
|
img_bytes = base64.b64decode(encoded) |
|
|
nparr = np.frombuffer(img_bytes, np.uint8) |
|
|
frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR) |
|
|
latest_frame = frame |
|
|
return '', 204 |
|
|
|
|
|
def stream(): |
|
|
global latest_frame |
|
|
while True: |
|
|
if latest_frame is not None: |
|
|
_, buffer = cv2.imencode('.jpg', latest_frame) |
|
|
frame = buffer.tobytes() |
|
|
yield (b'--frame\r\n' |
|
|
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') |
|
|
else: |
|
|
yield b'' |
|
|
|
|
|
@app.route('/video_feed') |
|
|
def video_feed(): |
|
|
return Response(stream(), mimetype='multipart/x-mixed-replace; boundary=frame') |
|
|
|
|
|
if __name__ == '__main__': |
|
|
app.run(host='0.0.0.0', port=7860) |
|
|
|