2017-08-28 76 views
0

我试图将JPEG的base64表示形式转换为可与OpenCV一起使用的图像。值得注意的是,我希望能够做到这一点,而不必亲自保存照片(我希望它保留在内存中)。有没有更新的方法来完成这个?将base64字符串转换为与OpenCV兼容的图像

我使用python 3.6.2和OpenCV 3.3

这里是输入类型的部分例子,我想转换:

/9j/4AAQSkZJRgABAQAASABIAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAA....

我已经尝试过的解决方案通过这些问题提供的,而是不断收到同样的“错误的参数类型,内置操作”错误:

+0

什么是引发不良参数异常?一旦你将base64转换为numpy数组,我认为你应该可以使用OpenCV的imdecode函数。 – LeopoldVonBuschLight

+0

将您自己的代码和图像数据添加到问题中,以便我们可以查看是否可以重新创建所获得的错误。 – zindarod

回答

1

我一直在现在当然,举步维艰这个问题了一段时间,有一次我张贴问题 - 我弄明白。

对于我的特殊用例,我需要将字符串转换为PIL图像以在将其转换为OpenCV中使用的numpy数组之前在另一个函数中使用。你可能会想,“为什么要转换成RGB?”。我加入了这个,因为当从PIL Image - > Numpy数组转换时,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) 
0

这里的Python 3.6使用的ImageIO代替PIL的例子。它首先加载一个图像并将其转换为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() 
相关问题