我正在尝试将JPEG的base64表示形式转换为可与OpenCV一起使用的图像。问题是我希望能够做到这一点而不必实际保存照片(我希望照片保留在内存中)。有没有更新的方式来做到这一点?
我正在使用python 3.6.2和OpenCV 3.3
这是我要转换的输入类型的部分示例:
/ 9j / 4AAQSkZJRgABAQAASABIAAD / 4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAA ....
我已经尝试过这些问题提供的解决方案,但是仍然收到相同的“内置操作的错误参数类型”错误:
Nat*_*ega 10
我已经在这个问题上挣扎了一段时间,当然,一旦我发布了一个问题 - 我就明白了。
对于我的特定用例,我需要将字符串转换为 PIL 图像以在另一个函数中使用,然后再将其转换为 numpy 数组以在 OpenCV 中使用。您可能会想,“为什么要转换为 RGB?”。我添加了这个是因为当从 PIL Image -> Numpy array 转换时,OpenCV 默认为其图像使用 BGR。
无论如何,这是我的两个帮助函数,它们解决了我自己的问题:
import io
import cv2
import base64
import numpy as np
from PIL import Image
# Take in base64 string and return PIL image
def stringToImage(base64_string):
imgdata = base64.b64decode(base64_string)
return Image.open(io.BytesIO(imgdata))
# convert PIL Image to an RGB image( technically a numpy array ) that's compatible with opencv
def toRGB(image):
return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)
Run Code Online (Sandbox Code Playgroud)
你也可以尝试这个:
import numpy as np
import cv2
def to_image_string(image_filepath):
return open(image_filepath, 'rb').read().encode('base64')
def from_base64(base64_data):
nparr = np.fromstring(base64_data.decode('base64'), np.uint8)
return cv2.imdecode(nparr, cv2.IMREAD_ANYCOLOR)
Run Code Online (Sandbox Code Playgroud)
您现在可以像这样使用它:
filepath = 'myimage.png'
encoded_string = to_image_string(filepath)
Run Code Online (Sandbox Code Playgroud)
使用 open cv 加载它,如下所示:
im = from_base64(encoded_string)
cv2.imwrite('myloadedfile.png', im)
Run Code Online (Sandbox Code Playgroud)
小智 6
这是使用imageio而不是PIL的python 3.6的示例。它首先加载图像并将其转换为b64_string。然后可以发送此字符串,并按以下方式重建图像:
import base64
import io
import cv2
from imageio import imread
import matplotlib.pyplot as plt
filename = "yourfile.jpg"
with open(filename, "rb") as fid:
data = fid.read()
b64_bytes = base64.b64encode(data)
b64_string = b64_bytes.decode()
# reconstruct image as an numpy array
img = imread(io.BytesIO(base64.b64decode(b64_string)))
# show image
plt.figure()
plt.imshow(img, cmap="gray")
# finally convert RGB image to BGR for opencv
# and save result
cv2_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
cv2.imwrite("reconstructed.jpg", cv2_img)
plt.show()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12968 次 |
最近记录: |