|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import numpy as np |
|
|
from PIL import Image |
|
|
from os.path import * |
|
|
import re |
|
|
import imageio |
|
|
import cv2 |
|
|
|
|
|
cv2.setNumThreads(0) |
|
|
cv2.ocl.setUseOpenCL(False) |
|
|
|
|
|
TAG_CHAR = np.array([202021.25], np.float32) |
|
|
|
|
|
|
|
|
def readFlow(fn): |
|
|
"""Read .flo file in Middlebury format""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with open(fn, "rb") as f: |
|
|
magic = np.fromfile(f, np.float32, count=1) |
|
|
if 202021.25 != magic: |
|
|
print("Magic number incorrect. Invalid .flo file") |
|
|
return None |
|
|
else: |
|
|
w = np.fromfile(f, np.int32, count=1) |
|
|
h = np.fromfile(f, np.int32, count=1) |
|
|
|
|
|
data = np.fromfile(f, np.float32, count=2 * int(w) * int(h)) |
|
|
|
|
|
|
|
|
return np.resize(data, (int(h), int(w), 2)) |
|
|
|
|
|
|
|
|
def readPFM(file): |
|
|
file = open(file, "rb") |
|
|
|
|
|
color = None |
|
|
width = None |
|
|
height = None |
|
|
scale = None |
|
|
endian = None |
|
|
|
|
|
header = file.readline().rstrip() |
|
|
if header == b"PF": |
|
|
color = True |
|
|
elif header == b"Pf": |
|
|
color = False |
|
|
else: |
|
|
raise Exception("Not a PFM file.") |
|
|
|
|
|
dim_match = re.match(rb"^(\d+)\s(\d+)\s$", file.readline()) |
|
|
if dim_match: |
|
|
width, height = map(int, dim_match.groups()) |
|
|
else: |
|
|
raise Exception("Malformed PFM header.") |
|
|
|
|
|
scale = float(file.readline().rstrip()) |
|
|
if scale < 0: |
|
|
endian = "<" |
|
|
scale = -scale |
|
|
else: |
|
|
endian = ">" |
|
|
|
|
|
data = np.fromfile(file, endian + "f") |
|
|
shape = (height, width, 3) if color else (height, width) |
|
|
|
|
|
data = np.reshape(data, shape) |
|
|
data = np.flipud(data) |
|
|
return data |
|
|
|
|
|
|
|
|
def readDispSintelStereo(file_name): |
|
|
"""Return disparity read from filename.""" |
|
|
f_in = np.array(Image.open(file_name)) |
|
|
d_r = f_in[:, :, 0].astype("float64") |
|
|
d_g = f_in[:, :, 1].astype("float64") |
|
|
d_b = f_in[:, :, 2].astype("float64") |
|
|
|
|
|
disp = d_r * 4 + d_g / (2 ** 6) + d_b / (2 ** 14) |
|
|
mask = np.array(Image.open(file_name.replace("disparities", "occlusions"))) |
|
|
valid = (mask == 0) & (disp > 0) |
|
|
return disp, valid |
|
|
|
|
|
|
|
|
def readDispMiddlebury(file_name): |
|
|
assert basename(file_name) == "disp0GT.pfm" |
|
|
disp = readPFM(file_name).astype(np.float32) |
|
|
assert len(disp.shape) == 2 |
|
|
nocc_pix = file_name.replace("disp0GT.pfm", "mask0nocc.png") |
|
|
assert exists(nocc_pix) |
|
|
nocc_pix = imageio.imread(nocc_pix) == 255 |
|
|
assert np.any(nocc_pix) |
|
|
return disp, nocc_pix |
|
|
|
|
|
|
|
|
def read_gen(file_name, pil=False): |
|
|
ext = splitext(file_name)[-1] |
|
|
if ext == ".png" or ext == ".jpeg" or ext == ".ppm" or ext == ".jpg": |
|
|
return Image.open(file_name) |
|
|
elif ext == ".bin" or ext == ".raw": |
|
|
return np.load(file_name) |
|
|
elif ext == ".flo": |
|
|
return readFlow(file_name).astype(np.float32) |
|
|
elif ext == ".pfm": |
|
|
flow = readPFM(file_name).astype(np.float32) |
|
|
if len(flow.shape) == 2: |
|
|
return flow |
|
|
else: |
|
|
return flow[:, :, :-1] |
|
|
return [] |
|
|
|