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

2024-05-23 15:10:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

例如

 import tarfile
 import cv2

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

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

假设这种直接从tar流读取的方式可以实现,例如对于文本(参见this SO question)。


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

当然,可以选择不绑定ramdisk,尽管我正在寻找一些更容易计算的东西。


Tags: 文件内存importpng情况图片原因tar
2条回答

也许用imdecode来处理tar文件中的缓冲区?我没有试过,但似乎很有希望。

多亏了@abarry和this SO answer的建议,我终于找到了答案。

考虑一下

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 )

相关问题 更多 >