1
votes

Comment renvoyer une image dans fastAPI

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}

où je reçois une erreur

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 commentaires

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?


3 Réponses :


0
votes

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)


0 commentaires

4
votes

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)


0 commentaires

0
votes

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}


0 commentaires