Source code for pyimof.io
# coding: utf-8
"""Functions to read and write '.flo' Middleburry file format.
"""
import os
import warnings
import numpy as np
TAG_FLOAT = 202021.25 # check for this when READING the file
TAG_STRING = b'PIEH'
[docs]def flowrite(u, v, fname):
"""Write a given flow to the Middleburry file format .flo
Parameters
----------
u : ~numpy.ndarray
The horizontal component of the estimated optical flow.
v : ~numpy.ndarray
The vertical component of the estimated optical flow.
fname: str
The target file name. The '.flo' extension is appended if
necessary.
"""
fname = os.path.abspath(fname)
if not fname.endswith('.flo'):
warnings.warn("Saving to {}".format(fname+'.flo'))
fname += '.flo'
h, w = u.shape
with open(fname, 'wb') as f:
# write the header
np.array(TAG_STRING).tofile(f)
np.array([w, h], dtype=np.int32).tofile(f)
# arrange into matrix form
tmp = np.zeros((h, w*2))
tmp[:, ::2] = u
tmp[:, 1::2] = v
tmp.astype('float32').tofile(f)
[docs]def floread(fname):
"""Read a Middleburry .flo file.
Parameters
----------
fname: str
The file name.
Returns
-------
u, v : tuple[~numpy.ndarray]
The horizontal and vertical components of the estimated
optical flow.
"""
fname = os.path.abspath(fname)
if not fname.endswith('.flo'):
warnings.warn("Reading flow from {}".format(fname+'.flo'))
fname += '.flo'
with open(fname, 'rb') as f:
tag = np.fromfile(f, dtype=np.float32, count=1)[0]
# sanity check
if not tag == TAG_FLOAT:
raise ValueError('{}: wrong tag (big-endian issue?)'.format(fname))
w, h = np.fromfile(f, dtype=np.int32, count=2)
if (w < 1) or (h < 1):
raise ValueError('{}: wrong shape ({}, {})'.format(fname, w, h))
buf = np.fromfile(f, dtype=np.float32).reshape((h, w*2))
u = buf[:, ::2]
v = buf[:, 1::2]
return u, v