Почему Flask Приложение не работает во второй раз? - PullRequest
0 голосов
/ 14 февраля 2020

Я создал Flask приложение для обнаружения объектов на видео. В этом приложении я принимаю видео от пользователя. Это видео обрабатывается нашим приложением, показывает обнаружение на экране и загружает видео после завершения процесса. Но когда я передаю то же видео или другое видео в том же приложении с тем же сеансом, это не работает. Это не показывает мне никакой ошибки. Здесь я приложил пример кода моего проекта.

Как передать другое видео после завершения процесса для первого видео в этом приложении?

from flask import Flask, render_template, request,  flash, redirect, url_for, send_from_directory
from werkzeug.utils import secure_filename
from PIL import Image
from os import listdir
import numpy as np
import pandas as pd
import cv2
import os
import matplotlib.pyplot as plt
import re
from pathlib import Path
app = Flask(__name__)
UPLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/uploads/'
DOWNLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/downloads/'
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['DOWNLOAD_FOLDER'] = DOWNLOAD_FOLDER
ALLOWED_EXTENSIONS = {'mp4'}
app.secret_key = 'random string'
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def my_func(filename):
    name = filename.split('/')[-1].split(".")[0]
    cap= cv2.VideoCapture(filename)
    i=0
    images = []
    while(cap.isOpened()):
        ret, frame = cap.read()
        if not ret: break
        font = cv2.FONT_HERSHEY_SIMPLEX
        org = (5,20)
        fontScale = 0.5
        color = (0, 0, 255)
        fontstroke = 2
        image1 = cv2.putText(frame, 'Done', org, font, fontScale, color, fontstroke)
        images.append(image1)
        i+=1
    height, width, channels = images[0].shape
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter('downloads/' + name + '.mp4', fourcc, 20, (width, height))
    for pic in images:
        out.write(pic)
        cv2.imshow('video',pic)
        if (cv2.waitKey(150) & 0xFF) == ord('q'): # Hit `q` to exit
            break
    out.release()
    cv2.destroyAllWindows()
@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == 'POST':
        if 'file' not in request.files:
           print('No file attached in request')
           return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            print('No file selected')
            return redirect(request.url)
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            my_func(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            os.remove(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('uploaded_file', filename=filename))
    return render_template('index.html')
@app.route('/downloaded/<filename>', methods=['POST', 'GET'])
def uploaded_file(filename):
    return send_from_directory(app.config['DOWNLOAD_FOLDER'], filename, as_attachment=True)
if __name__ == '__main__':
    app.run(debug = True)

Здесь я упоминаю код индекса. html file.

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <title>Model</title>
    </head>
    <body>
    <div align="center">
        <h1>Recognition</h1>
        <h2>Upload Video</h2>
        <form method="post" enctype=multipart/form-data>
            <p><input type=file name=file value="REFRESH">
                <input type=submit value=Upload></p>

        </form>
    </div>
    </body>
    </html>

1 Ответ

0 голосов
/ 14 февраля 2020

Две возможности:

  1. Загрузка нескольких файлов одновременно
  2. Перенаправление пользователя на форму загрузки после завершения первой загрузки

Вы не сможете обработать второй файл без триггера запроса.

С уважением, Томас

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