如何 return fastAPI 中的图像
How to return an image in fastAPI
我正在尝试 return 在使用 Opencv 比较两个图像后在 fastAPI 中创建一个图像。
这是我到目前为止所做的:
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))
哪里出错了
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}
我做错了什么?
如果您只想 return 图像,则 return 图像本身在 header 中使用正确的编码请参阅 Return a Response Directly
如果您还需要 return 其他信息与 json 中的图像,请参阅此 SO 问题 How do you put an image file in a json object?(注意:解决方案在 javascript , 但它很容易适应 python)
是的,你可以 return 使用 FastAPI 制作图像,其实很简单。
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)
确保安装 aiofiles
和 pip install aiofiles
否则,您将收到如下错误:
AssertionError: 'aiofiles' must be installed to use FileResponse
如果您有字节图像,请考虑使用 StreamingResponse
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")
可以找到解决方案。您正在转换 Opencv 图像,然后在第 3 行对其进行编码。
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}
将 return_img
替换为 encoded_img
,一切都应该按预期工作。
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}
我正在尝试 return 在使用 Opencv 比较两个图像后在 fastAPI 中创建一个图像。
这是我到目前为止所做的:
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))
哪里出错了
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}
我做错了什么?
如果您只想 return 图像,则 return 图像本身在 header 中使用正确的编码请参阅 Return a Response Directly
如果您还需要 return 其他信息与 json 中的图像,请参阅此 SO 问题 How do you put an image file in a json object?(注意:解决方案在 javascript , 但它很容易适应 python)
是的,你可以 return 使用 FastAPI 制作图像,其实很简单。
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)
确保安装 aiofiles
和 pip install aiofiles
否则,您将收到如下错误:
AssertionError: 'aiofiles' must be installed to use FileResponse
如果您有字节图像,请考虑使用 StreamingResponse
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")
可以找到解决方案
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}
将 return_img
替换为 encoded_img
,一切都应该按预期工作。
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}