J'essaie de renvoyer une image dans fastAPI après avoir comparé deux images à l'aide d'Opencv.
Voici ce que j'ai fait jusqu'à présent:
return_img = cv2.processImage(img) _, encoded_img = cv2.imencode('.PNG', return_img) encoded_img = base64.b64encode(return_img) return {"The similarity is": mat,'encoded_img': endcoded_img}
from fastapi import FastAPI , File, UploadFile import numpy as np from cv2 import * import os import base64 app = FastAPI(debug = True) @app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...),file1: UploadFile = File(...)): content = await file.read() nparr = np.fromstring(content, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) content1 = await file1.read() nparr1 = np.fromstring(content1, np.uint8) img1 = cv2.imdecode(nparr1, cv2.IMREAD_COLOR) akaze = cv2.AKAZE_create() kpts1, desc1 = akaze.detectAndCompute(img, None) kpts2, desc2 = akaze.detectAndCompute(img1, None) matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_BRUTEFORCE_HAMMING) matches_1 = matcher.knnMatch(desc1, desc2, 2) good_points = [] for m,n in matches_1: if m.distance < 0.7 * n.distance: good_points.append(m) mat = (round(len(kpts2)/len(good_points),2))
Qu'est-ce que je fais mal?
3 Réponses :
Si vous souhaitez renvoyer l'image uniquement, renvoyez l'image elle-même avec l'encodage correct dans l'en-tête, voir Renvoyer une réponse directement
Si vous avez besoin de renvoyer également d'autres informations avec l'image dans le json, consultez cette question SO Comment mettre un fichier image dans un objet json? (note: les solutions sont en javascript, mais il est assez facile de l'adapter pour python)
Oui, vous pouvez renvoyer une image avec FastAPI, c'est en fait si simple.
from io import BytesIO @app.post("/send_image") async def send(): image = BytesIO() img = # Do something here to create an image img.save(image, format='JPEG', quality=85) # Save image to BytesIO image.seek(0) # Return cursor to starting point return StreamingResponse(image.read(), media_type="image/jpeg")
Assurez-vous d'installer aiofiles
avec pip install aiofiles
sinon, vous obtiendrez une erreur comme celle-ci:
AssertionError: 'aiofiles' must be installed to use FileResponse
Si vous avez une image sous forme d'octets, envisagez d'utiliser StreamingResponse
from fastapi import FastAPI from fastapi.responses import FileResponse some_file_path = "some_image.jpeg" app = FastAPI() @app.get("/") async def main(): return FileResponse(some_file_path)
La solution peut être trouvée ici . Vous convertissez l'image Opencv avant de l'encoder sur la 3ème ligne.
return_img = cv2.processImage(img) _, encoded_img = cv2.imencode('.PNG', return_img) encoded_img = base64.b64encode(encoded_img) return {"The similarity is": mat,'encoded_img': endcoded_img}
Remplacez return_img
par encoded_img
et tout devrait fonctionner comme prévu.
return_img = cv2.processImage(img) _, encoded_img = cv2.imencode('.PNG', return_img) encoded_img = base64.b64encode(return_img) return {"The similarity is": mat,'encoded_img': endcoded_img}
Cela vous dérange-t-il de coller les exigences?
@MarceloTrylesinski, je veux renvoyer une image en utilisant fastapi, est-ce possible?
Comment renvoyer une image dans fastAPI? répondez à votre question?