用python读取middlebury'flow'文件(bytes array&numpy)

Pau*_*eix 1 c++ python file-format numpy image

我正在尝试将.flo文件作为numpy 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], ...
Run Code Online (Sandbox Code Playgroud)

(摘自本自述文件)

这是我的代码,但我有点卡住,我不知道如何将文件作为2通道numpy二维数组读取.

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))
Run Code Online (Sandbox Code Playgroud)

也许有人知道该怎么做?

bsa*_*bsa 7

试试这个.到目前为止,我已在一个.flo文件上测试过它.

import numpy as np
import sys

if __name__ == '__main__':
    if len(sys.argv) <= 1:
        print('Specify a .flo file on the command line.')
    else:
        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, h = np.fromfile(f, np.int32, count=2)
                print(f'Reading {w} x {h} flo file')
                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))
                print(data2D)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想用 Matplotlib 之类的东西查看它,在 `(w, h, 2)`-&gt;`(h, w 2)` 中翻转 `w` 和 `h`。 (2认同)

Mr.*_*ail 5

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.')
Run Code Online (Sandbox Code Playgroud)