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.
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ả.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.
Kiểm tra [this] (http://stackoverflow.com/a/33522724/5008845) – Miki
Cảm ơn bạn đã trả lời nhanh @Miki, nhưng 'np.fromstring' cũng không hoạt động. –
Và 'imgstring' sẽ là URL hình ảnh, phải không? – Divakar