![](/img/trans.png)
[英]What is the best way (performance) to send an numpy array (an image actually) by requests.post to an API? (python)
[英]send an image (as numpy array) 'requests.post'
我对一件非常简单的事情感到困惑:我正在使用在线服务进行图像处理并发送我正在使用的图像
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 格式时发送图像。
我应该如何转换我的图像以便能够通过请求发送?
在提供的链接中声明“支持的输入图像格式包括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调用中使用。
解决这个问题的一种方法是使用 OpenCV 库,也许它对某些人非常有用,因为在处理图像时,使用 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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.