7

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

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

例如考虑

 import tarfile
 import cv2

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

最后一行不像imread预期的文件名而不是流那样工作。

考虑到这种直接从tar流中读取的方式可以实现,例如文本(参见例如这个 SO question)。


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

解压到 ramdisk 当然是一种选择,尽管我正在寻找更可缓存的东西。

4

2 回答 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 )
于 2014-08-08T08:13:36.030 回答
4

也许将imdecode与来自 tar 文件的缓冲区一起使用?我没有尝试过,但似乎很有希望。

于 2014-08-07T19:28:44.297 回答