2017-08-28 12 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

私が質問を投稿したら、私は、今、そしてもちろん、しばらくの間、この問題で苦労してきた - 私はそれを把握します。

私の特定の使用例では、OpenCVで使用するnumpy配列に変換する前に、その文字列を別の関数で使用するためにPILイメージに変換する必要がありました。あなたは「なぜ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

代わりにPILのImageIOでを使用してのpython 3.6のための例:

はとにかく、ここで自分の質問を解決し、私の2つのヘルパー関数をです。最初に画像をロードし、それを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() 
関連する問題