当前位置: 首页 > 面试题库 >

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

史英睿
2023-03-14
问题内容

我正在开发一个可通过网络摄像头流进行面部识别的应用程序。我得到画布的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">

在官方文档说,是imread接受作为参数的文件路径。从这样的答案,如果我做类似的事情:

 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)

上面的代码段有效,并且图像文件已正确生成。但是,考虑到我将对流的每个帧执行此操作,因此我认为没有太多文件IO操作是可行的。我希望能够将图像读取到直接创建img对象的内存中。

我尝试了两种似乎对某些人有用的解决方案。

  1. 使用PIL参考:
    pilImage = Image.open(StringIO(imgdata))
    

    npImage = np.array(pilImage)
    matImage = cv.fromarray(npImage)

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

  1. 从解码后的字符串中获取字节并将其转换为numpy数组
    file_bytes = numpy.asarray(bytearray(imgdata), dtype=numpy.uint8)
    

    img = cv2.imdecode(file_bytes, 0) #Here as well I get returned nothing

该文档没有真正提及imdecode函数返回的内容。但是,从我遇到的错误中,我猜想它是以anumpy array或ascalar作为第一个参数。我如何在内存中获取该图像的句柄,以便以后可以执行cv2.imshow('image',img)各种出色的操作。

我希望我能说清楚。


问题答案:

您可以像这样同时使用cv2和枕头:

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)


 类似资料:
  • 谁能指导我怎么做这件事吗? 我是一个新的android所以请,如果我能有一个详细的程序,我会很感激。

  • 本文向大家介绍php读取和保存base64编码的图片内容,包括了php读取和保存base64编码的图片内容的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php读取和保存图片内容的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我正在使用一个在线服务,它需要一个Base64中的映像。我已经完成了一个简单的表单,我可以上传一个图像,然后我的php将图像编码为base 64,如下所示: base64_encode(file_get_contents(_FILES图像]tmp_name); 然后,我将其传递到一个json数组中,另一个页面尝试用我的数据显示图像,但失败了(缺少图像图标),在Chrome控制台中出现错误: img

  • 如果我重新编译,在C源代码中添加一个空白的main()方法,并删除-C标志,那么它将失败,并出现UnsatisfiedLinkError(无法在64位计算机上加载32位DLL)。 为什么Java调用一个没有main方法的DLL是无效的?这难道不会破坏DLL文件和JNI的全部意义吗? 更新

  • 我有如下的HTML电子邮件体。 我想获取emailBody中存在的每个元素(公司、优先级、描述等),最后生成Json键值对。 我希望通过使用JSOUP库我们能够实现这一点。 预期输出如下所示: 有人能帮我解决这个问题吗?

  • 问题内容: 在64位平台上,一个人可以为java分配的最大堆空间是多少?无限吗? 问题答案: 理论上是2 64,但是可能会有限制(显然) 根据此常见问题解答,它仅受本地系统上的内存和交换空间的限制: 在64位VM上,您具有64位可寻址性,因此可产生的最大Java堆大小仅受系统提供的物理内存和交换空间的数量限制。 另请参见为什么使用32位JVM无法获得更大的堆? 另外请记住,您需要通过命令行设置最大