使用cv2.imread从文件对象或类似内存流的数据(这里是未提取的tar文件)中读取图像

8
我有一个包含数百张图片(.png格式)的.tar文件,需要通过opencv进行处理。
出于效率考虑,我想知道是否可以直接从内存流中读取与tar文件相关联的图片,而不必经过磁盘。
例如:
 import tarfile
 import cv2

 tar0 = tarfile.open('mytar.tar')
 im = cv2.imread( tar0.extractfile('fname.png').read() )

最后一行不起作用,因为imread需要的是文件名而不是流。

请注意,可以通过这种方式直接从tar流中读取文本(例如,请参见此SO问题)。


有什么建议可以用正确的png编码打开流吗?

当然,将其解压到ramdisk中是一种选择,尽管我正在寻找更可缓存的解决方案。

2个回答

10

得益于@abarry的建议和这个SO回答,我成功找到了答案。

考虑以下内容

def get_np_array_from_tar_object(tar_extractfl):
     '''converts a buffer from a tar file in np.array'''
     return np.asarray(
        bytearray(tar_extractfl.read())
        , dtype=np.uint8)

tar0 = tarfile.open('mytar.tar')

im0 = cv2.imdecode(
        get_np_array_from_tar_object(tar0.extractfile('fname.png'))
        , 0 )

4
也许可以使用imdecode函数,将tar文件中的缓冲区作为参数传入?我没有尝试过,但这似乎很有前途。

谢谢,这绝对是正确的提示。请看下面我的答案。 - Acorbe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接