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

Aco*_*rbe 5 python performance opencv tar imread

我有一个.tar包含数百张图片的文件(.png).我需要通过opencv处理它们.

我想知道 - 出于效率原因 - 是否可以在不经过光盘的情况下处理它们.换句话说,我想从与tar文件相关的内存流中读取图片.

考虑一下

 import tarfile
 import cv2

 tar0 = tarfile.open('mytar.tar')
 im = cv2.imread( tar0.extractfile('fname.png').read() )
Run Code Online (Sandbox Code Playgroud)

最后一行不能正常工作,因为imread需要文件名而不是流.

考虑直接从tar流中读取这种方式可以例如针对文本实现(参见例如此SO问题).


有任何建议用正确的png编码打开流?

解包到ramdisk当然是一种选择,虽然我一直在寻找更多的东西可缓存.

Aco*_*rbe 8

感谢@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 )
Run Code Online (Sandbox Code Playgroud)