相关疑难解决方法(0)

使用OpenCv python库从内存中读取基本64位编码图像

我正在开发一个应用程序,可以从网络摄像头流中进行面部识别.我得到了画布的base64编码数据uri,并希望用它来做这样的事情:

cv2.imshow('image',img)
Run Code Online (Sandbox Code Playgroud)

数据URI看起来像这样:

 data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7
Run Code Online (Sandbox Code Playgroud)

所以,为了清楚起见,我已经显示了图像的样子,因此base64字符串没有被破坏.

<img src="data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7">
Run Code Online (Sandbox Code Playgroud)

官方文档说,是imread接受作为参数的文件路径.从这个 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)
Run Code Online (Sandbox Code Playgroud)

上面的代码片段可以正常工作,并且可以正确生成图像文件.但是,我不认为这么多文件IO操作是可行的,因为我会为流的每一帧执行此操作.我希望能够将图像直接读入内存中创建img对象.

我尝试了两种似乎适用于某些人的解决方案.

  1. 使用PIL 参考:

    pilImage = Image.open(StringIO(imgdata))
    npImage = np.array(pilImage)
    matImage = cv.fromarray(npImage)
    
    Run Code Online (Sandbox Code Playgroud)

    cv没有定义,因为我安装了openCV3,我可以将其作为cv2模块使用.我试过img = cv2.imdecode(npImage,0),这什么都没有.

  2. 从解码的字符串中获取字节并将其转换为numpy数组

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

文档没有真正提到 …

python base64 encoding opencv numpy

15
推荐指数
3
解决办法
2万
查看次数

标签 统计

base64 ×1

encoding ×1

numpy ×1

opencv ×1

python ×1