【发布时间】:2016-02-18 16:56:16
【问题描述】:
我正在开发一个应用程序,该应用程序可以从网络摄像头流中进行一些面部识别。我得到了画布的 base64 编码数据 uri,并想用它来做这样的事情:
cv2.imshow('image',img)
数据 URI 如下所示:
data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7
所以,为了清楚起见,我已经展示了图像的样子,因此 base64 字符串不会被破坏。
<img src="data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7">
official doc 表示,imread 接受文件路径作为参数。从this SO 回答,如果我这样做:
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)
上面的代码 sn-p 可以正常工作,并且可以正确生成图像文件。但是,考虑到我会为流的每一帧都这样做,我认为这么多文件 IO 操作是不可行的。我希望能够直接将图像读入内存,创建img 对象。
我尝试了两种似乎对某些人有效的解决方案。
-
使用 PIL reference:
pilImage = Image.open(StringIO(imgdata)) npImage = np.array(pilImage) matImage = cv.fromarray(npImage)我得到
cv未定义,因为我安装了openCV3,它可以作为cv2模块提供给我。我试过img = cv2.imdecode(npImage,0),这什么也没返回。 -
从解码的字符串中获取字节并将其转换为一个 numpy 数组
file_bytes = numpy.asarray(bytearray(imgdata), dtype=numpy.uint8) img = cv2.imdecode(file_bytes, 0) #Here as well I get returned nothing
文档并没有真正提到imdecode 函数返回的内容。但是,根据我遇到的错误,我猜它期望 numpy array 或 scalar 作为第一个参数。我如何在内存中处理该图像,以便我可以做cv2.imshow('image',img) 以及之后的各种很酷的事情。
我希望我能说清楚。
【问题讨论】:
-
检查this
-
感谢@Miki 的快速回复,但
np.fromstring也无法正常工作。 -
而
imgstring将是图片网址,对吧? -
@Divakar,它是代表该图像的 base64 编码字符串
标签: python opencv numpy encoding base64