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.
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łemimg = cv2.imdecode(npImage,0)
, to nic nie zwraca.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ć.
Sprawdź [to] (http://stackoverflow.com/a/33522724/5008845) – Miki
Dzięki za szybką odpowiedź @Miki, ale 'np.fromstring' też nie działa. –
A 'imgstring' będzie adresem URL obrazu, prawda? – Divakar