File size: 4,158 Bytes
6821e1b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
'''
python by: youngjung uh, Clova ML, Naver
contact: youngjung.uh@navercorp.com
date: 17 Dec 2018
-------------------------------------------------------------------
---- below comment came from the original (readFlowFile.m) -------
---- below comment came from the original (writeFlowFile.m) -------
-------------------------------------------------------------------
readFlowFile read a flow file FILENAME into 2-band image IMG
writeFlowFile writes a 2-band image IMG into flow file FILENAME
According to the c++ source code of Daniel Scharstein
Contact: schar@middlebury.edu
Author: Deqing Sun, Department of Computer Science, Brown University
Contact: dqsun@cs.brown.edu
$Date: 2007-10-31 15:36:40 (Wed, 31 Oct 2006) $
Copyright 2007, Deqing Sun.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose other than its incorporation into a
commercial product is hereby granted without fee, provided that the
above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation, and that the name of the author and Brown University not be used in
advertising or publicity pertaining to distribution of the software
without specific, written prior permission.
THE AUTHOR AND BROWN UNIVERSITY DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY
PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR OR BROWN UNIVERSITY BE LIABLE FOR
ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
'''
import os
import numpy as np
from struct import pack, unpack
def readFlowFile(fname):
'''
args
fname (str)
return
flow (numpy array) numpy array of shape (height, width, 2)
'''
TAG_FLOAT = 202021.25 # check for this when READING the file
ext = os.path.splitext(fname)[1]
assert len(ext) > 0, ('readFlowFile: extension required in fname %s' % fname)
assert ext == '.flo', exit('readFlowFile: fname %s should have extension ''.flo''' % fname)
try:
fid = open(fname, 'rb')
except IOError:
print('readFlowFile: could not open %s', fname)
tag = unpack('f', fid.read(4))[0]
width = unpack('i', fid.read(4))[0]
height = unpack('i', fid.read(4))[0]
assert tag == TAG_FLOAT, ('readFlowFile(%s): wrong tag (possibly due to big-endian machine?)' % fname)
assert 0 < width and width < 100000, ('readFlowFile(%s): illegal width %d' % (fname, width))
assert 0 < height and height < 100000, ('readFlowFile(%s): illegal height %d' % (fname, height))
nBands = 2
# arrange into matrix form
flow = np.fromfile(fid, np.float32)
flow = flow.reshape(height, width, nBands)
fid.close()
return flow
def writeFlowFile(img, fname):
TAG_STRING = 'PIEH' # use this when WRITING the file
ext = os.path.splitext(fname)[1]
assert len(ext) > 0, ('writeFlowFile: extension required in fname %s' % fname)
assert ext == '.flo', exit('writeFlowFile: fname %s should have extension ''.flo''', fname)
height, width, nBands = img.shape
assert nBands == 2, 'writeFlowFile: image must have two bands'
try:
fid = open(fname, 'wb')
except IOError:
print('writeFlowFile: could not open %s', fname)
# write the header
# fid.write(TAG_STRING.encode(encoding='utf-8', errors='strict'))
# code = unpack('f', bytes(TAG_STRING, 'utf-8'))[0]
# fid.write(pack('f', code))
fid.write(bytes(TAG_STRING, 'utf-8'))
fid.write(pack('i', width))
fid.write(pack('i', height))
# arrange into matrix form
tmp = np.zeros((height, width*nBands), np.float32)
tmp[:, np.arange(width) * nBands] = img[:, :, 0]
tmp[:, np.arange(width) * nBands + 1] = np.squeeze(img[:, :, 1])
fid.write(bytes(tmp))
fid.close() |