Получение изображения с помощью Fast API, обработка его с помощью cv2 и его возврат - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь создать API, который получает изображение и выполняет его базовую c обработку, а затем возвращает обновленную копию, используя Open CV и Fast API. До сих пор у меня получатель работал нормально, но когда я пытаюсь с помощью base64 закодировать обработанное изображение и отправить его обратно, мой мобильный интерфейс истекает.

В качестве практики отладки я попытался просто напечатать закодированную строку и выполнить вызов API с помощью Insomnia, но после 5 solid минут печати данных я убил приложение. Правильно ли здесь возвращать строку в кодировке base64? Есть ли более простой способ отправить изображение с открытым резюме через быстрый API?

class Analyzer(BaseModel):
    filename: str
    img_dimensions: str
    encoded_img: str

@app.post("/analyze", response_model=Analyzer)
async def analyze_route(file: UploadFile = File(...)):
    contents = await file.read()
    nparr = np.fromstring(contents, np.uint8)
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

    img_dimensions = str(img.shape)
    return_img = processImage(img)

    encoded_img = base64.b64encode(return_img)

    return{
        'filename': file.filename,
        'dimensions': img_dimensions,
        'encoded_img': endcoded_img,
    }

1 Ответ

0 голосов
/ 21 апреля 2020

@ Комментарий ZdaR сделал это для меня. Я смог заставить API-вызов работать, перекодировав его в PNG перед кодированием в строку base64.

Рабочий код выглядит следующим образом:

class Analyzer(BaseModel):
    filename: str
    img_dimensions: str
    encoded_img: str

@app.post("/analyze", response_model=Analyzer)
async def analyze_route(file: UploadFile = File(...)):
    contents = await file.read()
    nparr = np.fromstring(contents, np.uint8)
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)

    img_dimensions = str(img.shape)
    return_img = processImage(img)

    # line that fixed it
    _, encoded_img = cv2.imencode('.PNG', return_img)

    encoded_img = base64.b64encode(return_img)

    return{
        'filename': file.filename,
        'dimensions': img_dimensions,
        'encoded_img': endcoded_img,
    }
...