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

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

ctypes-opencv

可与 python 2 和旧版本的 opencv 一起使用

我还发现:

pyboostcv转换器

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

但他们都老了,没有一个对我有用。

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

我正在使用 python 3.6 opencv 3.2.0

标签: pythonopencvtaropencv3.0mat

解决方案


我认为如果read()tar.extract file(). 然后您可以将其转换为 Numpyndarray并使用OpenCV imdecode()将 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、字节对象


推荐阅读