text: import numpy as np
  
  TAG_CHAR = np.array([202021.25], np.float32)
  
  def readFlow(fn):
      """ Read .flo file in Middlebury format"""
      # Code adapted from:
      # http://stackoverflow.com/questions/28013200/reading-middlebury-flow-files-with-python-bytes-array-numpy
  
      # WARNING: this will work on little-endian architectures (eg Intel x86) only!
      # print 'fn = %s'%(fn)
      with open(fn, 'rb') as f:
          magic = np.fromfile(f, np.float32, count=1)[0]
          if 202021.25 != magic:
              print('Magic number incorrect. Invalid .flo file')
              return None
          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\n' % (w, h)
              data = np.fromfile(f, np.float32, count=2*w*h)
              # Reshape data into 3D array (columns, rows, bands)
              # The reshape here is for visualization, the original code is (w,h,2)
              return np.resize(data, (int(h), int(w), 2))
  
  def writeFlow(filename,uv,v=None):
      """ Write optical flow to file.
      
      If v is None, uv is assumed to contain both u and v channels,
      stacked in depth.
      Original code by Deqing Sun, adapted from Daniel Scharstein.
      """
      nBands = 2
  
      if v is None:
          assert(uv.ndim == 3)
          assert(uv.shape[2] == 2)
          u = uv[:,:,0]
          v = uv[:,:,1]
      else:
          u = uv
  
      assert(u.shape == v.shape)
      height,width = u.shape
      f = open(filename,'wb')
      # write the header
      f.write(TAG_CHAR)
      np.array(width).astype(np.int32).tofile(f)
      np.array(height).astype(np.int32).tofile(f)
      # arrange into matrix form
      tmp = np.zeros((height, width*nBands))
      tmp[:,np.arange(width)*2] = u
      tmp[:,np.arange(width)*2 + 1] = v
      tmp.astype(np.float32).tofile(f)
      f.close()
  