Как задать путь при работе с изображениями в Flask на localhost, а также в ibm cloud

#python-3.x #opencv #flask #ibm-cloud #cloudant

#python-3.x #opencv #flask #ibm-cloud #cloudant

Вопрос:

До вчерашнего дня это приложение работало нормально, но сегодня оно не работает. Никаких изменений в серверной части или интерфейсе не было внесено. Вывод сайта выглядит следующим образом. Я пытаюсь использовать open cv для извлечения 4 вложенных изображений из изображения, которое было загружено в папку ../static / uploads. Пока извлеченные 4 изображения хранятся в папке ../static/extracted. Теперь меня беспокоит то, что вчера код выполнялся, но сегодня он не работает. И при развертывании в ibm cloud я не смог найти open cv. «модуль cv2 не найден». Может кто-нибудь, пожалуйста, помочь мне улучшить этот код.

app.py код:

 from cloudant import Cloudant
from flask import Flask, render_template, request, jsonify
import atexit
import os
import json
from ocr_core import ocr_core


UPLOAD_FOLDER = '/static/uploads/'
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])

app = Flask(__name__,static_url_path='')

db_name = 'mydb'
client = None
db = None

if 'VCAP_SERVICES' in os.environ:
    vcap = json.loads(os.getenv('VCAP_SERVICES'))
    print('Found VCAP_SERVICES')
    if 'cloudantNoSQLDB' in vcap:
        creds = vcap['cloudantNoSQLDB'][0]['credentials']
        user = creds['username']
        password = creds['password']
        url = 'https://'   creds['host']
        client = Cloudant(user, password, url=url, connect=True)
        db = client.create_database(db_name, throw_on_exists=False)
elif "CLOUDANT_URL" in os.environ:
    client = Cloudant(os.environ['CLOUDANT_USERNAME'], os.environ['CLOUDANT_PASSWORD'], url=os.environ['CLOUDANT_URL'], connect=True)
    db = client.create_database(db_name, throw_on_exists=False)
elif os.path.isfile('vcap-local.json'):
    with open('vcap-local.json') as f:
        vcap = json.load(f)
        print('Found local VCAP_SERVICES')
        creds = vcap['services']['cloudantNoSQLDB'][0]['credentials']
        user = creds['username']
        password = creds['password']
        url = 'https://'   creds['host']
        client = Cloudant(user, password, url=url, connect=True)
        db = client.create_database(db_name, throw_on_exists=False)

# On IBM Cloud Cloud Foundry, get the port number from the environment variable PORT
# When running this app on the local machine, default the port to 8000
port = int(os.getenv('PORT', 5000))


def allowed_file(filename):
    return '.' in filename and 
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


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


@app.route('/upload', methods=['GET', 'POST'])
def upload_page():
    if request.method == 'POST':
        # check if the post request has the file part
        if 'file' not in request.files:
            return render_template('upload.html', msg='No file selected')
        file = request.files['file']
        if file.filename == '':
            return render_template('upload.html', msg='No file selected')

        if file and allowed_file(file.filename):
            file.save(os.path.join(os.getcwd()   UPLOAD_FOLDER, file.filename))
            extracted_text = ocr_core(file)
            return render_template('upload.html',
                                   msg='Successfully processed',
                                   extracted_text=extracted_text,
                                   img_src=UPLOAD_FOLDER   file.filename)
    elif request.method == 'GET':
        return render_template('upload.html')

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

ocr_py.py:

 try:
    from PIL import Image
except ImportError:
    import Image
import pytesseract
import cv2
from random import randint
import pandas as pd

#UPLOAD_FOLDER = '/static'
def ocr_core(filename):
    #text = pytesseract.image_to_string(Image.open(filename)) 
    val=str(filename)
    val=list(val)
    naam=""
    tt=0
    for i in range(15,len(val)):
            if(val[i]!="'"):
                naam =val[i]
                if(val[i]=='g'):
                    tt=1
            if(tt==1):
                break
    image = cv2.imread("/home/sahil/CheckCheque-deploy/static/uploads/"  str(naam))
    k=randint(0, 999999) 
    cropped1 = image[290:500, 320:1540]
    cv2.imwrite("/home/sahil/CheckCheque-deploy/static/extracted/name" str(k) ".png", cropped1)
    name=pytesseract.image_to_string(Image.open("/home/sahil/CheckCheque-deploy/static/extracted/name" str(k) ".png"))
    cropped2 = image[470:700, 670:2640]
    cv2.imwrite("/home/sahil/CheckCheque-deploy/static/extracted/amount" str(k) ".png", cropped2)
    amount=pytesseract.image_to_string(Image.open("/home/sahil/CheckCheque-deploy/static/extracted/amount" str(k) ".png"))
    cropped3 = image[850:1000, 480:1040]
    cv2.imwrite("/home/sahil/CheckCheque-deploy/static/extracted/acc_no" str(k) ".png", cropped3)
    acc_no=pytesseract.image_to_string(Image.open("/home/sahil/CheckCheque-deploy/static/extracted/acc_no" str(k) ".png"))
    cropped5 = image[500:850, 2940:4500]
    cv2.imwrite("/home/sahil/CheckCheque-deploy/static/extracted/amt_num" str(k) ".png", cropped5)
    amt_num=pytesseract.image_to_string(Image.open("/home/sahil/CheckCheque-deploy/static/extracted/amt_num" str(k) ".png"))
    acc_no1=""
    lnum=["1","0","2","3","4","5","6","7","8","9"]
    for i in range(0,len(acc_no)):
        if(str(acc_no[i]) in lnum):
            acc_no1 =acc_no[i]
    l=[name,acc_no,amt_num]
    df = pd.read_csv("/home/sahil/CheckCheque-deploy/jobchahiye.csv")
    df.loc[df.Account== int(l[1]), 'Amount'] -=int(l[2])
    df.loc[df.Name== str(l[0]), 'Amount']  =int(l[2])
    df.to_csv("/home/sahil/CheckCheque-deploy/jobchahiye.csv", index=False) 
    return l
  

Комментарии:

1. Приложение запускается как контейнер Docker / Kubernetes, на виртуальной машине или как Cloud Foundry? Как это было развернуто? Что в вашем requirements.txt ?

2. Он еще не развернут. Вчера при развертывании с использованием cloudant в ibm cloud я получил сообщение об ошибке, в котором говорится, что модуль с именем cv2 не найден. До вчерашнего дня на localhost все работало отлично. Сегодня он не запущен на самом localhost и, следовательно, не может быть запущен в облаке. Внутренняя работа выполнена, но на главной странице не загружается только изображение.

3. Как вы планируете развертывание? Какие команды вы пробовали? Каковы были точные сообщения об ошибках? Пожалуйста, добавьте, отредактировав свой вопрос.

Ответ №1:

Похоже, у вас есть зависимость от opencv-python или opencv-contrib-python . Таким образом, он должен быть установлен в качестве предварительного условия на любой машине, на которой вы хотите запустить свое приложение.

На localhost вы делаете это с помощью pip , но если вы не используете что-то подобное virtualenv , то все установки будут осуществляться в глобальном пространстве, и могут легко возникнуть конфликты, в результате чего вы не сможете ничего запустить.

Для облачных развертываний вы указываете предварительные условия pip в своем requirements.txt файле