如何使用OpenCV直接读取tarfile对象



我有一个包含tiff文件的tarball。我试图在不提取和保存它们的情况下阅读它们。这是我所拥有的:

tar = tarfile.open("filename.tar", 'r|')
for tiff in tar:
if tiff.isfile():
c = tar.extractfile(tiff)

typ(c) = tarfile.ExFileObject

我想直接用OpenCV阅读它,以获得Mat格式。我可以用PIL或matplotlib读取它来获得numpy数组,它们的工作方式都很有魅力,但我没有找到任何最近或方便的方法将numpy数组转换为Mat格式。再次,我想知道是否有一种方法,我可以直接阅读它,而不保存和阅读它

如果无法直接读取它,并且我必须将numpy数组转换为Mat,我已经尝试了我能找到的一切,所有的解决方案都适用于以前的版本,但没有一个对我有效。我发现了这些:

pyopincv:有这个:pyopencv.Mat.from_pil_image(image)

或ctypes opencv

可与python 2和opencv 的旧版本配合使用

我还发现:

pyboostcvconverter

NUMPY<=>OpenCV的cv::Mat转换器

但他们都老了,没有一个为我工作。

如果有人能帮忙,我很感激。

我使用的是python 3.6opencv 3.2.0

如果对tar.extract file()的结果执行read(),我认为您会得到一个"字节对象"。然后,您可以将其转换为Numpyndarray,并使用OpenCVimdecode()将TIF格式从内存缓冲区解压缩为图像。

这段代码对我很有用——尽管我似乎在从tarfile中读取266字节无用文件和TIF图像之间交替——我不知道为什么,但如果你没有得到它们,你可以删除if语句,该语句检查266字节无用的文件!

#!/usr/bin/env python3
import cv2
import sys
import tarfile                                                                              
import numpy as np
tar = tarfile.open('images.tar','r|') 
for f in tar:
# Extract an image
c = tar.extractfile(f).read()
if sys.getsizeof(c) > 266:
print(sys.getsizeof(c))
na = np.frombuffer(c, dtype=np.uint8)
im = cv2.imdecode(na, cv2.IMREAD_COLOR)
cv2.imshow('Extracted', im)

如果有人知道266字节无用的东西是什么,请告诉我,我们都会学到一些东西!非常感谢。

关键字:Python、OpenCV、Numpy、np.array、tar、tar文件、存档、提取、内存中、imdecode、TIF、TIFF、字节对象

最新更新