веб-камера на веб-странице с использованием колбы и Python - PullRequest
0 голосов
/ 20 февраля 2019

Я создал модель распознавания лиц, используя keras и tensorflow, и сейчас я пытаюсь преобразовать ее как веб-приложение, используя флешку и python.Мое требование заключается в том, что мне нужна живая веб-камера, отображаемая на веб-странице, и, нажав на кнопку, она должна сделать снимок и сохранить его в указанном каталоге, а с помощью этого изображения приложение должно распознать человека.если человек не найден в наборе данных, то на веб-странице должно отображаться сообщение о том, что неизвестная личность найдена.Чтобы выполнить эту работу, я начал изучать колбу, и после этого, когда дело доходит до требования, мне было очень трудно.кто-нибудь поможет мне решить эту ситуацию.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019
from flask import Flask,request,jsonify
import numpy as np
import cv2
import tensorflow as tf
import base64

app = Flask(__name__)
graph = tf.get_default_graph()


@app.route('/')
def hello_world():
    return """
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <video id="video" width="640" height="480" autoplay></video>
    <button id="snap">Snap Photo</button>
    <canvas id="canvas" width="640" height="480"></canvas>
    </body>
    <script>

    var video = document.getElementById('video');
    if(navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({ video: true }).then(function(stream) {
            //video.src = window.URL.createObjectURL(stream);
            video.srcObject = stream;
            video.play();
        });
    }

    var canvas = document.getElementById('canvas');
    var context = canvas.getContext('2d');
    var video = document.getElementById('video');

    // Trigger photo take
    document.getElementById("snap").addEventListener("click", function() {
        context.drawImage(video, 0, 0, 640, 480);
    var request = new XMLHttpRequest();
    request.open('POST', '/submit?image=' + video.toString('base64'), true);
    request.send();
    });



</script>
</html>
    """

# HtmlVideoElement

@app.route('/test',methods=['GET'])
def test():
    return "hello world!"

@app.route('/submit',methods=['POST'])
def submit():
    image = request.args.get('image')

    print(type(image))
    return ""`

я сделал так, но проблема в том, что при вызове API / submit в декораторе я сохраняю свое изображение как HTMLVideoElement при печати типа переменной изображения, я не знаю, как преобразовать его вФормат JPEG и использовать его для дальнейших целей.

0 голосов
/ 20 февраля 2019

То, что вы хотите сделать, это потоковая передача с Flask с помощью веб-камеры Stream и обрабатывать ее с помощью машинного обучения.Ваш основной сценарий для веб-сервера в флешке позволит вам загрузить файл index.html и затем потоковую передачу каждого кадра по пути / video_feed:

from flask import Flask, render_template, Response, jsonify
from camera import VideoCamera
import cv2

app = Flask(__name__)

video_stream = VideoCamera()

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

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

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

if __name__ == '__main__':
    app.run(host='127.0.0.1', debug=True,port="5000")

Затем вам понадобится класс VideoCamera, с которым вы будете работатькаждый кадр и где вы можете сделать каждый прогноз или обработку вы хотите на кадрах.Файл camera.py :

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

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

    def get_frame(self):
        ret, frame = self.video.read()

        # DO WHAT YOU WANT WITH TENSORFLOW / KERAS AND OPENCV

        ret, jpeg = cv2.imencode('.jpg', frame)

        return jpeg.tobytes()

И, наконец, страница, показывающая поток видео в html-файле index.html шаблонах папка):

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Video Stream</title>
  </head>
  <body>
  <img src="{{ url_for('video_feed') }}" />
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...