чтение потоковых файлов в 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, i.e.,
u[row0,col0], v[row0,col0], u[row0,col1], v[row0,col1], ...

(Выдержка из этого Прочти меня)

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

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 bytesdata_array = np.fromfile(f, np.float16)
data_2D = np.resize(data_array, (512, 512))

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

1

Решение

Попробуй это. До сих пор я проверял это на одном файле .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 %d x %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.'
6

Другие решения

Ответ 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 %d x %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.'
4

По вопросам рекламы [email protected]