发送图像(作为NumPy数组)的请求“requests.post”

5

我有一个非常简单的问题:我正在使用一个在线图像处理服务,为了发送我的图像,我使用的是

var_0 = requests.post(api_url, params=params, headers=headers, data=image_data)

其中image_data应当被编码为二进制字符串。例如,以下示例可以正常工作:

image_data = open(image_path, "rb").read()
var_0 = requests.post(api_url, params=params, headers=headers, data=image_data)

然而,在某些情况下,我需要在图像已经打开并且以numpy.array格式存在的情况下发送图像。

我应该如何将我的图像转换为能够通过请求发送的格式?


服务支持哪些图片格式? - JohanL
这是微软人脸识别API。它使用二进制图像格式:https://azure.microsoft.com/zh-cn/services/cognitive-services/emotion/ - Arnold Klein
2个回答

9
提供的链接指出:“支持的输入图像格式包括JPEG、PNG、GIF(第一帧)和BMP。”因此,您的数据必须是这些格式之一。Numpy数组不适合使用,需要将其转换为例如PNG图像。
最简单的方法是使用“matplotlib.pyplot.imsave()”函数来完成。但是,结果应保存到内存缓冲区(以发送到API),而不是保存到文件中。在Python中处理这个问题的方法是使用“io.BytesIO()”对象。
综上所述,解决问题的方法如下:
import io
import numpy as np
import matplotlib.pyplot as plt

buf = io.BytesIO()
plt.imsave(buf, image_np, format='png')
image_data = buf.getvalue()
var_0 = requests.post(api_url, params=params, headers=headers, data=image_data)

其中image_np是一个numpy数组形式的图像。

同时需要注意,image_data = buf.getvalue()这行代码并不必要。可以直接在API调用中使用缓冲区内容。


1

解决这个问题的一种方法是使用OpenCV库,对于那些处理图像的人来说,它可能非常有用。以下是我的解决方案:

import cv2, requests
import numpy as np
numpy_image = cv2.imread("/path/to/image.png")
api_url = "your_api_url"
_ , encoded_image = cv2.imencode('.jpg', numpy_image)
response = requests.post(api_url, data = encoded_image.tobytes()).json()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接