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!
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)
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.
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)
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