将base64字符串转换为与OpenCV兼容的映像

Nat*_*ega 5 python opencv

我正在尝试将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)


Ant*_*nwu 9

你也可以尝试这个:

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)