потоковое видео через flask в Raspberry Pi - PullRequest
0 голосов
/ 22 февраля 2020

Привет, я создал программу на Flask, которая помогает мне получить потоковое видео в реальном времени:

Проверьте изображение здесь

Основная цель: основная идея создания этой программы, когда я нажимаю кнопку захвата, она захватывает изображение из живого видео с паром, поэтому я закодировал оба файла python ниже в flask, который работает на 0.0.0.0:5000, и поместил индекс. php файл на моем apache сервере, который работает на localhost: 80, поэтому на изображении выше, как вы можете видеть, есть файл iframe из индекса. php (работает на localhost: 80), который показывает видео, запущенное на 0.0.0.0:5000, и имеет кнопку захвата, которую можно использовать для захвата изображения с этого живого пропаривания, поэтому я разработал его таким образом, чтобы при нажатии на кнопку захвата он перенаправлял его на 0.0.0.0:5000/login и позади сцены, которые он захватывает изображение и перенаправляет обратно на localhost: 80, чтобы пользователь снова мог видеть потоковое видео в реальном времени

, файлы находятся ниже:

index. php из apache порт 80:

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

socket_connect($sock, "8.8.8.8", 53);

socket_getsockname($sock, $name); // $name passed by reference



$localAddr = $name;

$me="http://".$localAddr.":5000/login";
$video="http://".$localAddr.":5000/video";
?>

<html>

   <body>
  <iframe width="40%" height="80%"

<?php echo "src='$video'>"; ?>

</iframe>

<?php
   echo  "<form action ='$me'  method = 'post'>";
     ?>
      <input type = "submit" name="capture" value = "capture" />
      </form>

   </body>

</html>

main.py:

from flask import Flask, redirect, url_for, request
from flask import Flask, render_template, Response
import picamera
from picamera.array import PiRGBArray
from cameraa import VideoCamera
from picamera import PiCamera
from cameraa import VideoCamera
import cv2
import time
import socket
import io
import socket


s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip=s.getsockname()[0]
s.close()
text="http://"
ip=text+ip

app = Flask(__name__)

@app.route('/')
def hello():
    #return "Hello World!"
    return render_template('index.html')

def gen(cameraa):
    while True:
        frame = cameraa.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')
def video_feed():
    return Response(gen(VideoCamera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')



@app.route('/login',methods = ['POST', 'GET'])
def login():
   if request.method == 'POST':
      user = request.form['capture']
      camera = picamera.PiCamera()
      camera.capture('/root/Desktop/Umair/new/image.jpg')
      camera.close()
      return redirect(ip, code=302)

   else:
      user = request.args.get('capture')
      camera =picamera.PiCamera()
      camera.capture('/root/Desktop/Umair/new/image.jpg')
      camera.close()
      return redirect(ip, code=302)
if __name__ == '__main__':
   app.run(debug=True,host='0.0.0.0')

cameraa.py:

import cv2
import picamera
from picamera.array import PiRGBArray
import time


class VideoCamera(object):

    def __init__(self):
        self.camera = picamera.PiCamera()
        self.rawCapture = PiRGBArray(self.camera)
        self.car_cascade = cv2.CascadeClassifier('cars.xml')
        #self.video = cv2.VideoCapture('/root/Desktop/flask/virtualenv/project_env/car.mp4')   #cv2.VideoCapture(0)

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

    def get_frame(self):
        self.rawCapture.truncate(0)
        for frame in self.camera.capture_continuous(self.rawCapture, format="bgr", use_video_port=True):
            image = frame.array
            # convert to gray scale of each frames 
            gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
            # Detects cars of different sizes in the input image 
            cars = self.car_cascade.detectMultiScale(gray, 1.1, 1)
            # To draw a rectangle in each cars 
            for (x,y,w,h) in cars:
                cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)

            ret, jpeg = cv2.imencode('.jpg', image)
            return jpeg.tobytes()

но есть проблема или вы можете сказать ограничение, picamera не делает ' t разрешено открывать более 1 раза, что означает, что всякий раз, когда я нажимаю на кнопку захвата, происходит переход к 0.0.0.0:5000/login и выдает ошибку

нажмите здесь, чтобы посмотреть изображение

я настолько слаб в python, что не знаю, как его решить :( я просто хочу, чтобы всякий раз, когда я нажимал кнопку захвата, он захватывал изображение и перенаправлял обратно на localhost: 80 запусков там тоже отлично, так как localhost: 80 использует iframe, есть вероятность, что он выдаст ту же ошибку, что приложение уже использует камеру. : (

я так устал от этого, какое-нибудь решение?

...