cv2 и Flask, окно не открывается после функции destroywindows - PullRequest
0 голосов
/ 03 января 2019

У меня проблема, я создаю скрипт для сохранения фотографии с помощью cv2, когда существует запрос get на Flask api (get), изображение отправляется на ftp-сервер и отправляет имя файла в json.

Проблема в том, что первый запрос работает нормально, но при отправке второго запроса приложение все время загружается, не отправляет ошибку и фрейм открывается, я думаю, что cv2 сохраняет другой экземпляр или процесс destroywindow не завершен. enter image description here

Это мой код и процесс прокомментирован.

from flask import Flask, jsonify
import numpy as np
import ftplib as ftp
from cv2 import cv2
import datetime
import os



app = Flask(__name__)

@app.route('/image')
def get_images():

    user = "user"
    password = "pass"
    server = ftp.FTP()

    server.connect('1.1.1.1', 21)
    try:
        print("Logging in...")
        server.login(user, password)
    except: 
        return jsonify({ "error": "error: not acces ftp " }), 500

    try:
        cam = cv2.VideoCapture(0)
        if not cam.isOpened():
            raise NameError('Just a Dummy Exception, write your own')
    except cv2.error as e:
        print("cv2.error:", e)
    except Exception as e:
        print("Exception:", e)
    else:
        print(cam.isOpened())

    try:
        cv2.namedWindow("test")
    except cv2.error as e:
        print("cv2.error:", e)
    except Exception as e:
        print("Exception:", e)
    else:
        print("no problem reported")


    while(cam.isOpened()):
        retval, frame = cam.read()

        if retval != True:
            raise ValueError("Can't read frame")
            break

        print("cam read")
        cv2.imshow("test", frame)
        print("show image")
        now=datetime.datetime.now().strftime("%Y%m%d%H%M%S")
        img_name = "opencv_frame_{}.png".format(now)
        cv2.imwrite(img_name, frame)
        print("{} written!".format(img_name))
        with open(img_name, 'rb') as f:  
            try:
                server.storbinary('STOR '+img_name, f)
                print("save image on FTP Server")
                print("Delete Local image")
                os.remove(img_name)
                break
            except ftp.all_errors as e:
                return json.dumps({ "error": "Error writing ftp server:"+e}), 500 
                break
    print("show image")
    cam.release()
    cv2.destroyWindow("test")
    server.quit()
    server.close()
    data=[{'image':img_name}]
    return jsonify(data) 

app.run(debug=True,host='0.0.0.0', port=5000)
...