python - 如何使用 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)
可与 python 2 和旧版本的 opencv 一起使用
我还发现:
NUMPY <=> OpenCV 的 cv::Mat 转换器
但他们都老了,没有一个对我有用。
如果有人可以提供帮助,我将不胜感激。
我正在使用 python 3.6 opencv 3.2.0
解决方案
我认为如果你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、字节对象
推荐阅读
- angular - Angular,在特定路线上构建的问题
- angular - 在 Angular 中将 BehaviorSubject 测试为 Observable - Jasmine
- python - 有没有办法在 pandas 中使用 groupby 函数,以便可以将某些内容引用为 0?
- java - JavaFX应用程序中的“应用程序启动方法中的异常”
- dart - 为什么 flatten 会摆脱映射值?
- php - 如何删除 index.php 并通过 Codeigniter 中的单个重定向重定向到 https
- .net-core - 在 Main Program.cs .NetCore 3.1 控制台应用程序以外的方法中读取 appsettings.json 键
- java - 是否可以在后台捕获麦克风?
- scala - 斯卡拉集合缓冲区
- python - 根据列值获取某些行