Spaces:
Runtime error
Runtime error
Commit
·
2f95a04
1
Parent(s):
a870b86
Create raft_core_utils_frame_utils.py
Browse files- raft_core_utils_frame_utils.py +137 -0
raft_core_utils_frame_utils.py
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
from PIL import Image
|
| 3 |
+
from os.path import *
|
| 4 |
+
import re
|
| 5 |
+
|
| 6 |
+
import cv2
|
| 7 |
+
cv2.setNumThreads(0)
|
| 8 |
+
cv2.ocl.setUseOpenCL(False)
|
| 9 |
+
|
| 10 |
+
TAG_CHAR = np.array([202021.25], np.float32)
|
| 11 |
+
|
| 12 |
+
def readFlow(fn):
|
| 13 |
+
""" Read .flo file in Middlebury format"""
|
| 14 |
+
# Code adapted from:
|
| 15 |
+
# http://stackoverflow.com/questions/28013200/reading-middlebury-flow-files-with-python-bytes-array-numpy
|
| 16 |
+
|
| 17 |
+
# WARNING: this will work on little-endian architectures (eg Intel x86) only!
|
| 18 |
+
# print 'fn = %s'%(fn)
|
| 19 |
+
with open(fn, 'rb') as f:
|
| 20 |
+
magic = np.fromfile(f, np.float32, count=1)
|
| 21 |
+
if 202021.25 != magic:
|
| 22 |
+
print('Magic number incorrect. Invalid .flo file')
|
| 23 |
+
return None
|
| 24 |
+
else:
|
| 25 |
+
w = np.fromfile(f, np.int32, count=1)
|
| 26 |
+
h = np.fromfile(f, np.int32, count=1)
|
| 27 |
+
# print 'Reading %d x %d flo file\n' % (w, h)
|
| 28 |
+
data = np.fromfile(f, np.float32, count=2*int(w)*int(h))
|
| 29 |
+
# Reshape data into 3D array (columns, rows, bands)
|
| 30 |
+
# The reshape here is for visualization, the original code is (w,h,2)
|
| 31 |
+
return np.resize(data, (int(h), int(w), 2))
|
| 32 |
+
|
| 33 |
+
def readPFM(file):
|
| 34 |
+
file = open(file, 'rb')
|
| 35 |
+
|
| 36 |
+
color = None
|
| 37 |
+
width = None
|
| 38 |
+
height = None
|
| 39 |
+
scale = None
|
| 40 |
+
endian = None
|
| 41 |
+
|
| 42 |
+
header = file.readline().rstrip()
|
| 43 |
+
if header == b'PF':
|
| 44 |
+
color = True
|
| 45 |
+
elif header == b'Pf':
|
| 46 |
+
color = False
|
| 47 |
+
else:
|
| 48 |
+
raise Exception('Not a PFM file.')
|
| 49 |
+
|
| 50 |
+
dim_match = re.match(rb'^(\d+)\s(\d+)\s$', file.readline())
|
| 51 |
+
if dim_match:
|
| 52 |
+
width, height = map(int, dim_match.groups())
|
| 53 |
+
else:
|
| 54 |
+
raise Exception('Malformed PFM header.')
|
| 55 |
+
|
| 56 |
+
scale = float(file.readline().rstrip())
|
| 57 |
+
if scale < 0: # little-endian
|
| 58 |
+
endian = '<'
|
| 59 |
+
scale = -scale
|
| 60 |
+
else:
|
| 61 |
+
endian = '>' # big-endian
|
| 62 |
+
|
| 63 |
+
data = np.fromfile(file, endian + 'f')
|
| 64 |
+
shape = (height, width, 3) if color else (height, width)
|
| 65 |
+
|
| 66 |
+
data = np.reshape(data, shape)
|
| 67 |
+
data = np.flipud(data)
|
| 68 |
+
return data
|
| 69 |
+
|
| 70 |
+
def writeFlow(filename,uv,v=None):
|
| 71 |
+
""" Write optical flow to file.
|
| 72 |
+
|
| 73 |
+
If v is None, uv is assumed to contain both u and v channels,
|
| 74 |
+
stacked in depth.
|
| 75 |
+
Original code by Deqing Sun, adapted from Daniel Scharstein.
|
| 76 |
+
"""
|
| 77 |
+
nBands = 2
|
| 78 |
+
|
| 79 |
+
if v is None:
|
| 80 |
+
assert(uv.ndim == 3)
|
| 81 |
+
assert(uv.shape[2] == 2)
|
| 82 |
+
u = uv[:,:,0]
|
| 83 |
+
v = uv[:,:,1]
|
| 84 |
+
else:
|
| 85 |
+
u = uv
|
| 86 |
+
|
| 87 |
+
assert(u.shape == v.shape)
|
| 88 |
+
height,width = u.shape
|
| 89 |
+
f = open(filename,'wb')
|
| 90 |
+
# write the header
|
| 91 |
+
f.write(TAG_CHAR)
|
| 92 |
+
np.array(width).astype(np.int32).tofile(f)
|
| 93 |
+
np.array(height).astype(np.int32).tofile(f)
|
| 94 |
+
# arrange into matrix form
|
| 95 |
+
tmp = np.zeros((height, width*nBands))
|
| 96 |
+
tmp[:,np.arange(width)*2] = u
|
| 97 |
+
tmp[:,np.arange(width)*2 + 1] = v
|
| 98 |
+
tmp.astype(np.float32).tofile(f)
|
| 99 |
+
f.close()
|
| 100 |
+
|
| 101 |
+
|
| 102 |
+
def readFlowKITTI(filename):
|
| 103 |
+
flow = cv2.imread(filename, cv2.IMREAD_ANYDEPTH|cv2.IMREAD_COLOR)
|
| 104 |
+
flow = flow[:,:,::-1].astype(np.float32)
|
| 105 |
+
flow, valid = flow[:, :, :2], flow[:, :, 2]
|
| 106 |
+
flow = (flow - 2**15) / 64.0
|
| 107 |
+
return flow, valid
|
| 108 |
+
|
| 109 |
+
def readDispKITTI(filename):
|
| 110 |
+
disp = cv2.imread(filename, cv2.IMREAD_ANYDEPTH) / 256.0
|
| 111 |
+
valid = disp > 0.0
|
| 112 |
+
flow = np.stack([-disp, np.zeros_like(disp)], -1)
|
| 113 |
+
return flow, valid
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
def writeFlowKITTI(filename, uv):
|
| 117 |
+
uv = 64.0 * uv + 2**15
|
| 118 |
+
valid = np.ones([uv.shape[0], uv.shape[1], 1])
|
| 119 |
+
uv = np.concatenate([uv, valid], axis=-1).astype(np.uint16)
|
| 120 |
+
cv2.imwrite(filename, uv[..., ::-1])
|
| 121 |
+
|
| 122 |
+
|
| 123 |
+
def read_gen(file_name, pil=False):
|
| 124 |
+
ext = splitext(file_name)[-1]
|
| 125 |
+
if ext == '.png' or ext == '.jpeg' or ext == '.ppm' or ext == '.jpg':
|
| 126 |
+
return Image.open(file_name)
|
| 127 |
+
elif ext == '.bin' or ext == '.raw':
|
| 128 |
+
return np.load(file_name)
|
| 129 |
+
elif ext == '.flo':
|
| 130 |
+
return readFlow(file_name).astype(np.float32)
|
| 131 |
+
elif ext == '.pfm':
|
| 132 |
+
flow = readPFM(file_name).astype(np.float32)
|
| 133 |
+
if len(flow.shape) == 2:
|
| 134 |
+
return flow
|
| 135 |
+
else:
|
| 136 |
+
return flow[:, :, :-1]
|
| 137 |
+
return []
|