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

How to read a tarfile object directly with OpenCV

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

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,我已经尝试了所有我能找到的解决方案,所有解决方案都适用于以前的版本,但没有一个对我有用。 我找到了这些:

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

ctypes-opencv

适用于 python 2 和旧版本的 opencv

我还发现:

pyboostcvconverter

NUMPY <=> OpenCV's cv::Mat converter

但他们都老了,没有一个适合我。

如果有人能提供帮助,我将不胜感激。

我正在使用 python 3.6 opencv 3.2.0

我认为如果你对 tar.extract file() 的结果执行 read(),你会得到 "bytes object"。然后您可以将其转换为 Numpy ndarray 并使用 OpenCV imdecode() 将内存缓冲区中的 TIF 格式解压缩为图像。

这段代码对我有用 - 虽然我似乎在从我的 tar 文件中读取 266 字节无用文件和 TIF 图像之间交替 - 我不知道为什么会这样,但如果你不明白它们,您可以删除检查无用的 266 字节文件的 if 语句!

#!/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 文件、归档、提取、内存中、即时解码、TIF、TIFF、字节对象