2015-11-17 8 views
9

Pracuję nad aplikacją, która wykonuje rozpoznawanie twarzy ze strumienia kamery internetowej. Mam Base64 zakodowane dane URI na płótnie i chcesz używać go zrobić coś takiego:Odczytywanie 64-kodowanego obrazu z pamięci za pomocą biblioteki pythora OpenCv

cv2.imshow('image',img) 

Dane URI wygląda mniej więcej tak:

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

Tak więc, dla jasności, jakie pokazano jak wygląda obraz, więc łańcuch base64 nie jest zepsuty.

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

official doc mówi, że imread akceptuje ścieżkę pliku jako argument. Od this SO odpowiedzieć, jeśli zrobię coś takiego:

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) 

Powyższe prace fragmentu kodu i plik obrazu zostanie wygenerowany poprawnie. Jednak nie sądzę, aby tak wiele operacji File IO było wykonalnych, biorąc pod uwagę, że robiłbym to dla każdej ramki strumienia. Chcę móc odczytać obraz w pamięci bezpośrednio tworząc obiekt img.

Próbowałem dwóch rozwiązań, które wydają się działać dla niektórych osób.

  1. Korzystanie PIL reference:

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

    uzyskać cv nie zdefiniowany jakom openCV3 zainstalowany, który jest dostępny dla mnie jako moduł cv2. Próbowałem img = cv2.imdecode(npImage,0), to nic nie zwraca.

  2. Pierwsze bajty z łańcucha dekodowane i przekształcenie go w numpy tablicy rodzaju

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

Dokumentacja naprawdę nie wspominając jaka imdecode powraca funkcyjnych. Jednak z powodu błędów, które napotkałem, domyślam się, że jako pierwszy argument oczekuje się numpy array lub scalar. Jak uzyskać uchwyt do tego obrazu w pamięci, dzięki czemu mogę zrobić cv2.imshow('image',img) i wszelkiego rodzaju fajne rzeczy po tym.

Mam nadzieję, że udało mi się wyjaśnić.

+0

Sprawdź [to] (http://stackoverflow.com/a/33522724/5008845) – Miki

+0

Dzięki za szybką odpowiedź @Miki, ale 'np.fromstring' też nie działa. –

+0

A 'imgstring' będzie adresem URL obrazu, prawda? – Divakar

Odpowiedz

6

można po prostu użyć zarówno CV2 i poduszkę tak:

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

ten pracował dla mnie, i nie wymaga PIL/poduszkę lub jakiekolwiek inne zależności (z wyjątkiem 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

Uratowałeś mi życie!Jestem (zobowiązany) do używania Pythona 2 na AWS, a pierwsze rozwiązanie zawierało błąd podobny do tego: https://stackoverflow.com/questions/28226308/cv2-cvtcolor-error-215-scn-3-scn- 4-w-funkcji-cvcvtcolor – Lewen

+0

Nie ma za co! :) – Lior

+1

O mój boże, to rozwiązanie jest miłe! Wielkie dzięki! – hulkinBrain

Powiązane problemy