2017-08-28 188 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() 
相關問題