чтение «потоковых» файлов middlebury с помощью python (массив байтов и numpy)

Я пытаюсь прочитать файл .flo как изображение с двумя символами 2Channels.

Формат описывается следующим образом:

".flo" file format used for optical flow evaluation Stores 2-band float image for horizontal (u) and vertical (v) flow components. Floats are stored in little-endian order. A flow value is considered "unknown" if either |u| or |v| is greater than 1e9. bytes contents 0-3 tag: "PIEH" in ASCII, which in little endian happens to be the float 202021.25 (just a sanity check that floats are represented correctly) 4-7 width as an integer 8-11 height as an integer 12-end data (width*height*2*4 bytes total) the float values for u and v, interleaved, in row order, ie, u[row0,col0], v[row0,col0], u[row0,col1], v[row0,col1], ... 

(Выдержка из этого readme )

Вот мой код, но я как бы застрял, я не знаю, как читать файл как 2D-массив с двумя каналами.

 import numpy as np import os # test.flo, 512*512 optical flow file f = open('test.flo', 'rb') f.seek(11, os.SEEK_SET) # skip header bytes data_array = np.fromfile(f, np.float16) data_2D = np.resize(data_array, (512, 512)) 

Может, кто-то знает, как это сделать?

2 Solutions collect form web for “чтение «потоковых» файлов middlebury с помощью python (массив байтов и numpy)”

Попробуй это. Я тестировал его в одном файле .flo.

 import numpy as np import os import sys # WARNING: this will work on little-endian architectures (eg Intel x86) only! if '__main__' == __name__: if len(sys.argv) > 1: with open(sys.argv[1], 'rb') as f: magic = np.fromfile(f, np.float32, count=1) if 202021.25 != magic: print 'Magic number incorrect. Invalid .flo file' else: w = np.fromfile(f, np.int32, count=1) h = np.fromfile(f, np.int32, count=1) print 'Reading %dx %d flo file' % (w, h) data = np.fromfile(f, np.float32, count=2*w*h) # Reshape data into 3D array (columns, rows, bands) data2D = np.resize(data, (w, h, 2)) else: print 'Specify a .flo file on the command line.' 

Ответ bsa не работает для python 3.5 и далее. Ниже приведена небольшая модификация, например np.fromfile (f, np.int32, count = 1) [0].

 import numpy as np import os import sys # WARNING: this will work on little-endian architectures (eg Intel x86) only! if '__main__' == __name__: if len(sys.argv) > 1: with open(sys.argv[1], 'rb') as f: magic = np.fromfile(f, np.float32, count=1) if 202021.25 != magic: print 'Magic number incorrect. Invalid .flo file' else: w = np.fromfile(f, np.int32, count=1)[0] h = np.fromfile(f, np.int32, count=1)[0] print 'Reading %dx %d flo file' % (w, h) data = np.fromfile(f, np.float32, count=2*w*h) # Reshape data into 3D array (columns, rows, bands) data2D = np.resize(data, (h, w, 2)) else: print 'Specify a .flo file on the command line.' 
  • Именованный массив dtype: Разница между и ?
  • Определитель многомерного массива
  • Как интегрировать SQLAlchemy и подклассифицированный Numpy.ndarray плавно и в виде pythonic?
  • Аннотировать выбросы на морском пароходе
  • Должен ли я переключиться на Python?
  • numpy.shape дает непоследовательные ответы - почему?
  • n-сферическая координатная система с декартовой системой координат
  • numpy array 1.9.2 получение ValueError: не удалось передать входной массив из формы (4,2) в форму (4)
  • Пересечение 2D numpy ndarrays
  • Python умножает список списков по элементам
  • Теорема о сдвиге в дискретном преобразовании Фурье
  • Python - лучший язык программирования в мире.