web-dev-qa-db-fra.com

Lecture d'un fichier image (objet de stockage de fichiers) à l'aide de CV2

J'envoie une image par curl au serveur flask, j'utilise cette commande curl

curl -F "[email protected]" http://localhost:8000/home

et j'essaie de lire le fichier en utilisant CV2 côté serveur.

Côté serveur je gère l'image par ce code

@app.route('/home', methods=['POST'])
def home():
    data =request.files['file']
    img = cv2.imread(data)
    fact_resp= model.predict(img)
    return jsonify(fact_resp)

Je reçois cette erreur-

img = cv2.imread(data)
TypeError: expected string or Unicode object, FileStorage found

Comment lire le fichier en utilisant CV2 côté serveur?

Merci!

7

J'ai eu des problèmes similaires lors de l'utilisation d'Opencv avec le serveur flask, pour cela, j'ai d'abord enregistré l'image sur le disque et lu à nouveau cette image en utilisant le chemin de fichier enregistré en utilisant cv2.imread ()

Voici un exemple de code:

data =request.files['file']
filename = secure_filename(file.filename) # save file 
filepath = os.path.join(app.config['imgdir'], filename);
file.save(filepath)
cv2.imread(filepath)

Mais maintenant, j'ai une approche encore plus efficace de ici en utilisant cv2.imdecode () pour lire l'image du tableau numpy comme au dessous de:

#read image file string data
filestr = request.files['file'].read()
#convert string data to numpy array
npimg = numpy.fromstring(filestr, numpy.uint8)
# convert numpy array to image
img = cv2.imdecode(npimg, cv2.CV_LOAD_IMAGE_UNCHANGED)
19
flamelite

Après un peu d'expérimentation, j'ai moi-même trouvé un moyen de lire le fichier en utilisant CV2. Pour cela, j'ai d'abord lu l'image en utilisant la méthode PIL.image

Ceci est mon code,

@app.route('/home', methods=['POST'])
def home():
    data =request.files['file']
    img = Image.open(request.files['file'])
    img = np.array(img)
    img = cv2.resize(img,(224,224))
    img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)
    fact_resp= model.predict(img)
    return jsonify(fact_resp)

Je me demande s'il existe un moyen simple de le faire sans utiliser PIL.

3

Solution à deux lignes, changez les niveaux de gris en fonction de vos besoins

 npimg = numpy.fromfile(request.files['image'], numpy.uint8)
 # convert numpy array to image
 img = cv2.imdecode(npimg, cv2.IMREAD_GRAYSCALE)
1
Artem Ibragimov

Donc, au cas où vous voudriez faire quelque chose comme,

file = request.files['file']
img = cv2.imread(file) 

alors fais comme ça

import numpy as np
file = request.files['file']
npimg = np.fromfile(file, np.uint8)
file = cv2.imdecode(npimg, cv2.IMREAD_COLOR)

Maintenant, vous n'avez plus besoin de refaire cv2.imread (), mais vous pouvez l'utiliser dans la prochaine ligne de codes.

Cela s'applique pour opencv> 3

0
Sahana M