2015-11-17 11 views
9

Tôi đang làm việc trên một ứng dụng để thực hiện nhận dạng khuôn mặt nào đó từ luồng webcam. Tôi nhận được base64 dữ liệu được mã hóa uri của canvas và muốn sử dụng nó để làm một cái gì đó như thế này:Đọc ảnh cơ sở 64 được mã hóa từ bộ nhớ sử dụng thư viện python OpenCv

cv2.imshow('image',img) 

Các dữ liệu URI trông giống như sau:

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

Vì vậy, cho rõ ràng tôi đã thể hiện hình ảnh trông như thế nào nên chuỗi base64 không bị hỏng.

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

Các official doc nói rằng imread chấp nhận một đường dẫn tập tin như là đối số. Từ this SO câu trả lời, nếu tôi làm điều gì đó như:

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) 

Đoạn mã trên hoạt động và tệp hình ảnh được tạo đúng cách. Tuy nhiên tôi không nghĩ rằng rất nhiều hoạt động File IO là khả thi xem xét tôi muốn được làm điều này cho mỗi khung của dòng. Tôi muốn có thể đọc hình ảnh vào bộ nhớ trực tiếp tạo đối tượng img.

Tôi đã thử hai giải pháp dường như đang hoạt động đối với một số người.

  1. Sử dụng PIL reference:

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

    tôi nhận được cv không được định nghĩa như tôi đã openCV3 cài đặt trong đó có sẵn với tôi như cv2 module. Tôi đã thử img = cv2.imdecode(npImage,0), điều này sẽ không trả về gì cả.

  2. Bắt các byte từ chuỗi giải mã và chuyển đổi nó thành một mảng NumPy các loại

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

Các tài liệu không thực sự đề cập đến những gì imdecode trở về chức năng. Tuy nhiên, từ các lỗi mà tôi gặp phải, tôi đoán nó đang mong đợi một đối số đầu tiên là numpy array hoặc scalar. Làm thế nào để tôi có được một xử lý trên hình ảnh đó trong bộ nhớ để tôi có thể làm cv2.imshow('image',img) và tất cả các loại công cụ thú vị sau đó.

Tôi hy vọng tôi có thể làm cho bản thân mình rõ ràng.

+0

Kiểm tra [this] (http://stackoverflow.com/a/33522724/5008845) – Miki

+0

Cảm ơn bạn đã trả lời nhanh @Miki, nhưng 'np.fromstring' cũng không hoạt động. –

+0

Và 'imgstring' sẽ là URL hình ảnh, phải không? – Divakar

Trả lời

6

Bạn chỉ có thể sử dụng cả hai CV2 và gối như thế này:

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

này đã làm việc cho tôi, và không đòi hỏi PIL/gối hoặc bất kỳ phụ thuộc khác (trừ 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

Bạn đã cứu mạng tôi!Tôi (bắt buộc) sử dụng Python 2 trên AWS và giải pháp đầu tiên tiếp tục cho tôi một lỗi như sau: https://stackoverflow.com/questions/28226308/cv2-cvtcolor-error-215-scn-3-scn- 4-in-function-cvcvtcolor – Lewen

+0

Bạn được chào đón! :) – Lior

+1

Ôi trời ơi, giải pháp này gọn gàng! Cảm ơn rất nhiều! – hulkinBrain

Các vấn đề liên quan