Как отправить и обновить переменную из Python в HTML (Flask)? - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю веб-приложение для интеллектуальной парковки, оно будет иметь две кнопки, которые будут отображать изображение или кадр того, что камера искала в момент нажатия, а другая отобразит сообщение, которое сообщит наличие каждого слота.

Это часть кода, которая отвечает за поиск доступности на парковке, прежде чем я вызвал функцию, которая сделала меня перспективным преобразованием для сохранения кода, но с помощью фляги у меня возникли проблемы при вызове метода.

smartparking.py

    def get_Disponibilidad(self):
        _, frame = self.cap.read()
        frame = cv2.resize(frame,(np.int(frame.shape[1]/2),np.int(frame.shape[0]/2)))
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        cv2.circle(frame, (65, 190), 5, (0, 0, 255), -1)
        cv2.circle(frame, (490, 200), 5, (0, 0, 255), -1)
        cv2.circle(frame, (30, 310), 5, (0, 0, 255), -1)
        cv2.circle(frame, (530, 310), 5, (0, 0, 255), -1)

        pts1 = np.float32([[65, 190], [490, 200], [30, 310], [530, 310]])
        pts2 = np.float32([[0, 0], [600, 0], [0, 500], [600, 500]])

        matrix = cv2.getPerspectiveTransform(pts1, pts2)
        result = cv2.warpPerspective(gray, matrix, (600, 500))

        v = np.median(result)    
        lower = int(max(0, (1.0 - 0.33) * v))
        upper = int(min(255, (1.0 + 0.33) * v))
    ##    edged = cv2.Canny(image, 50, 100)
        edges = cv2.Canny(result, lower, upper)

        estado = 0
        blancos = cv2.countNonZero(edges)
        if (blancos >= 6000):
            estado = 1
        #estado = disponibilidadPlaza(edges)
        return estado

    def get_Image(self):
        _, frame = self.cap.read()
        frame = cv2.resize(frame,(np.int(frame.shape[1]/2),np.int(frame.shape[0]/2)))        
        cv2.circle(frame, (65, 190), 1, (0, 0, 255), -1)
        cv2.circle(frame, (490, 200), 1, (0, 0, 255), -1)
        cv2.circle(frame, (30, 310), 1, (0, 0, 255), -1)
        cv2.circle(frame, (530, 310), 1, (0, 0, 255), -1)

        pts1 = np.float32([[65, 190], [490, 200], [30, 310], [530, 310]])
        pts2 = np.float32([[0, 0], [600, 0], [0, 500], [600, 500]])

        matrix = cv2.getPerspectiveTransform(pts1, pts2)
        result = cv2.warpPerspective(frame, matrix, (600, 500))
        _, jpeg = cv2.imencode('.jpg', frame)
        return jpeg.tobytes()

В следующем коде я вызываю функцию get_Availability () smartparking, которая должна возвращать 1 в случае занятости и 0 в противном случае, это значение должно отображаться в html при нажатии кнопки, но оно должно быть в курсе, если человек нажимает кнопку, когда на стоянке обнаруживается машина.

main.py

from flask import Flask, request, redirect, render_template, Response
from SmartParking import VideoCamera

app = Flask(__name__)

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

def disponible(parking):
        while True:                 
                availability = VideoCamera().get_Disponibilidad()
                render_template('index.htm',availability=availability)

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

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

Наконец, HTML, который теперь показывает в реальном времени, что видит камера, но идея состоит в том, чтобы при каждом нажатии кнопки показывать кадр видео, а также статус доступности.

<!DOCTYPE html>
<html>
  <head>
    <title>Smart-Parking</title>
  </head>
  <body>
    <h1>Smart Parking</h1> <h1 style="color: red;">LIVE STREAM</h1> 
    <img id="bg" src="{{ url_for('video_feed') }}">

    <h1>Slot 1:  {{availability}}</h1>

    <form method="POST"> 
      <button type="submit" name="Parking">Image</button>
      <button type="submit" name="Slots">Availability</button>
    </form>

    </body>
</html>

Доступность переменной принимает ее так, как если бы она была нулевой, и кнопки также не работают, поскольку я не знаю, как их вызывать в main.py

Imgur

1 Ответ

1 голос
/ 18 апреля 2019

def функция disponible (парковка) не имеет декоратора маршрута и никогда не вызывается. Вы визуализируете шаблон в функции index, у которой нет переменной доступности.

Отправка формы также нигде не читается. Вы должны посмотреть на контекст запроса колбы. Или, по крайней мере, указать новый маршрут.

Это даст вам доступ к обновлению без кнопки:

@app.route('/')
def disponible(parking):
                availability = VideoCamera().get_Disponibilidad()
                render_template('index.htm',availability=availability)

Параметр While True также никогда не сработает, поскольку он немедленно возвращается.

Что касается возврата кнопок в программу, вам необходимо отправить форму и указать ее в маршруте, на который указывает действие формы. То есть отправить на новый маршрут (/ изображение) или использовать запрос, чтобы получить отправленные аргументы

@app.route('/image/)
# Do some action that you want as a result of the image button

с кодом формы в вашем шаблоне:

<form name="image" action="/image"><button type=submit>image</button></form>

http://flask.pocoo.org/docs/1.0/reqcontext/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...