Как читать объект tarfile напрямую с OpenCV - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть архив, содержащий файлы 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.Снова, я хочу знать, есть ли способ, которым я могу прочитать это непосредственно, не сохраняя это и читая это.

В случае, если нет возможности прочитать его напрямую, и мне нужно преобразовать пустой массив в Mat, я перепробовал все, что смог найти, и все решения для предыдущих версий, и ни одно из них не сработало для меня,Я нашел это:

pyopencv : имеет это: pyopencv.Mat.from_pil_image(image)

или ctypes-opencv

, которые работают с Python2 и более старые версии opencv

Я также нашел:

pyboostcvconverter

NUMPY <=> Конвертер cv :: Mat в OpenCV

но все они старые и не работают для меня.

Я ценю, если кто-нибудь может помочь.

Я использую Python 3.6 opencv 3.2.0

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, вы получите "объект байтов ", если вы сделаете read() в результате tar.extract file().Затем вы можете преобразовать его в Numpy ndarray и использовать OpenCV imdecode(), чтобы распаковать формат TIF из буфера памяти в изображение.

Этот код работает для меня - хотя якажется, чередуются между чтением бесполезных 266-байтовых файлов и TIF-изображений из моего tarfile - я не знаю, почему это так, но если вы их не получите, вы можете просто удалить оператор 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, объект байтов

...