Transmisión de la cámara Raspberry Pi a la página web HTML utilizando picamera y Flask


8

Estoy tratando de usar la API y el Frasco de picamera para implementar una transmisión Python pura (en vivo) del JPEG continuo desde el módulo de cámara Raspberry Pi para mostrarlo usando una plantilla HTML pero sigo recibiendo un "error 404 no encontrado".

Soy un poco inexperto con este tema en particular, disculpas de antemano.

 app.route('/test/')
    def vid():
            with picamera.PiCamera() as camera:
                    stream = io.BytesIO()
                    for foo in camera.capture_continuous(stream, format='jpeg'):

                            stream.truncate()
                            stream.seek(0)

                            if process(stream):
                                break

Aquí está el código HTML:

 <img src="{{ url_for('vid') }}"width='950px' height='450px'>

3
Un tipo 404 sugiere que podría estar utilizando la URL o el número de puerto incorrectos. ¿Puedes confirmar que puedes llegar a la página si su contenido está comentado?
goobering

Noté que coloqué la función render_template después de if name == ' main ': app.run (host = '169.254.21.3) pero recibo un nuevo error "werkzeug.routing.BuildError, BuildError: no se pudo construir la URL para el punto final 'vid'. ¿Quiso decir 'estático' en su lugar? " y gracias
crispy2k12

1
¿Podría intentar pegar un símbolo @ delante de 'app.route' y volver a ejecutar?
goobering

saludos, realmente debería verificar mi sintaxis, ahora mi página se muestra pero la transmisión no aparece.
crispy2k12

1
No está devolviendo nada de la función vid (): está recopilando archivos JPEG, pero no los pasa a la vista. Agregue la importación: from flask import send_file, y fuera del ciclo for , intente agregar: return send_file (stream, mimetype = 'image / jpeg')
goobering

Respuestas:


5

Leí un poco más y no creo que su enfoque funcione como se desea. El artículo de Miguel Grinberg aquí describe cómo lograr la transmisión de la cámara Raspberry Pi a Flask, y proporciona varios ejemplos útiles. Se proporciona un programa simple y completo (cámara no Pi) que muestra el uso de una función de generador y un tipo de respuesta de múltiples partes para lograr la transmisión animada:

#!/usr/bin/env python
from flask import Flask, render_template, Response
from camera import Camera

app = Flask(__name__)

@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')

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

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

Puede ver que la /video-feedruta devuelve un objeto de tipo de respuesta multiparte que la gen(camera)función genera continuamente . Sin este enfoque, sospecho que una imagen estática es todo lo que verás. Hay un ejemplo completo de una aplicación de transmisión picamera-to-Flask basada en el tutorial anterior aquí .


solo una nota menor, pero el ejemplo no está completo, requiere un archivo adicional ( camera.py) del tutorial.
machow

-1

Simplemente cambie la cámara de importación a picamera. Tienes que instalar ffpmeg ang mpeg-streamer. Si estos dos módulos no funcionan, instale también uv4l. Después de eso reinícialo y funciona

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.