2015-11-17 65 views
9

私はウェブカメラのストリームからいくつかの顔認識を行うためのアプリケーションに取り組んでいます。私はキャンバスのデータのURIのbase64エンコードを取得し、このような何かにそれを使用したい:OpenCv Pythonライブラリを使用してメモリからベース64のエンコードされたイメージを読み取る

cv2.imshow('image',img) 

URIはこのようなものに見えるデータ:だから

data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7 

を、分かりやすくするために私が示されてきましたベース64の文字列が壊れていないようにイメージがどのように見えるか。

<img src="data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7">

official docimreadは、引数としてファイルパスを受け入れること、言います。

import base64 
imgdata = base64.b64decode(imgstring) #I use imgdata as this variable itself in references below 
filename = 'some_image.jpg' 
with open(filename, 'wb') as f: 
    f.write(imgdata) 

上記のコードが動作すると、画像ファイルが正しく生成されます:私はのような何かをすればthisからSO、答えます。しかし、私はストリームのすべてのフレームでこれをやっていると考えると、多くのFile IO操作が実行可能であるとは思わない。私はimgオブジェクトを直接作成してメモリにイメージを読み込むことができるようにしたい。

私はいくつかの人々のために働いているように見える2つのソリューションを試しました。 PIL referenceを使用して

  1. pilImage = Image.open(StringIO(imgdata)) 
    npImage = np.array(pilImage) 
    matImage = cv.fromarray(npImage) 
    

    私はopenCV3がcv2モジュールとして私に提供されているインストールされているとして定義されていないcvを取得します。私はimg = cv2.imdecode(npImage,0)を試しましたが、何も返しません。

  2. デコードされた文字列からバイトを取得し、並べ替え

    file_bytes = numpy.asarray(bytearray(imgdata), dtype=numpy.uint8) 
    img = cv2.imdecode(file_bytes, 0) #Here as well I get returned nothing 
    

のnumpyの配列に変換する文書本当に何 imdecode機能リターンを言及していません。しかし、私が遭遇したエラーから、最初の引数として numpy arrayまたは scalarがあると思います。どのように私は cv2.imshow('image',img)とその後のすべての種類のクールなものを行うことができますように、メモリ内の画像上のハンドルを取得しますか?

私は自分自身を明確にすることができたと思う。

あなたはちょうどこのようCV2と枕の両方を使用することができます
+0

Check [this](http://stackoverflow.com/a/33522724/5008845) – Miki

+0

あなたのクイック返信@Mikiに感謝しますが、 'np.fromstring'もうまくいきません。 –

+0

そして、 'imgstring'はイメージURLでしょうか? – Divakar

答えて

6

import base64 
from PIL import Image 
import cv2 
from StringIO import StringIO 
import numpy as np 

def readb64(base64_string): 
    sbuf = StringIO() 
    sbuf.write(base64.b64decode(base64_string)) 
    pimg = Image.open(sbuf) 
    return cv2.cvtColor(np.array(pimg), cv2.COLOR_RGB2BGR) 

cvimg = readb64('R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7') 
cv2.imshow(cvimg) 
10

これは私のために働いた、とPIL /枕や(CV2を除く)他の依存関係を必要としない:

import cv2 
import numpy as np 

def data_uri_to_cv2_img(uri): 
    encoded_data = uri.split(',')[1] 
    nparr = np.fromstring(encoded_data.decode('base64'), np.uint8) 
    img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) 
    return img 

data_uri = "data:image/jpeg;base64,/9j/4AAQ..." 
img = data_uri_to_cv2_img(data_uri) 
cv2.imshow(img) 
+1

あなたは私の人生を救った!私はAWSでPython 2を使用する必要があり(最初の解決策は私にこのようなエラーを与え続けています):https://stackoverflow.com/questions/28226308/cv2-cvtcolor-error-215-scn-3-scn- 4-in-function-cvcvtcolor – Lewen

+0

あなたは大歓迎です! :) – Lior

+1

ああ私の神、この解決策はきちんとしています!どうもありがとう! – hulkinBrain

関連する問題