Spaces:
Runtime error
Runtime error
#! /usr/bin/env python2 | |
""" | |
I/O script to save and load the data coming with the MPI-Sintel low-level | |
computer vision benchmark. | |
For more details about the benchmark, please visit www.mpi-sintel.de | |
CHANGELOG: | |
v1.0 (2015/02/03): First release | |
Copyright (c) 2015 Jonas Wulff | |
Max Planck Institute for Intelligent Systems, Tuebingen, Germany | |
""" | |
# Requirements: Numpy as PIL/Pillow | |
import numpy as np | |
from PIL import Image | |
# Check for endianness, based on Daniel Scharstein's optical flow code. | |
# Using little-endian architecture, these two should be equal. | |
TAG_FLOAT = 202021.25 | |
TAG_CHAR = 'PIEH' | |
def flow_read(filename): | |
""" Read optical flow from file, return (U,V) tuple. | |
Original code by Deqing Sun, adapted from Daniel Scharstein. | |
""" | |
f = open(filename,'rb') | |
check = np.fromfile(f,dtype=np.float32,count=1)[0] | |
assert check == TAG_FLOAT, ' flow_read:: Wrong tag in flow file (should be: {0}, is: {1}). Big-endian machine? '.format(TAG_FLOAT,check) | |
width = np.fromfile(f,dtype=np.int32,count=1)[0] | |
height = np.fromfile(f,dtype=np.int32,count=1)[0] | |
size = width*height | |
assert width > 0 and height > 0 and size > 1 and size < 100000000, ' flow_read:: Wrong input size (width = {0}, height = {1}).'.format(width,height) | |
tmp = np.fromfile(f,dtype=np.float32,count=-1).reshape((height,width*2)) | |
u = tmp[:,np.arange(width)*2] | |
v = tmp[:,np.arange(width)*2 + 1] | |
return u,v | |
def flow_write(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() | |
def depth_read(filename): | |
""" Read depth data from file, return as numpy array. """ | |
f = open(filename,'rb') | |
check = np.fromfile(f,dtype=np.float32,count=1)[0] | |
assert check == TAG_FLOAT, ' depth_read:: Wrong tag in flow file (should be: {0}, is: {1}). Big-endian machine? '.format(TAG_FLOAT,check) | |
width = np.fromfile(f,dtype=np.int32,count=1)[0] | |
height = np.fromfile(f,dtype=np.int32,count=1)[0] | |
size = width*height | |
assert width > 0 and height > 0 and size > 1 and size < 100000000, ' depth_read:: Wrong input size (width = {0}, height = {1}).'.format(width,height) | |
depth = np.fromfile(f,dtype=np.float32,count=-1).reshape((height,width)) | |
return depth | |
def depth_write(filename, depth): | |
""" Write depth to file. """ | |
height,width = depth.shape[:2] | |
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) | |
depth.astype(np.float32).tofile(f) | |
f.close() | |
def disparity_write(filename,disparity,bitdepth=16): | |
""" Write disparity to file. | |
bitdepth can be either 16 (default) or 32. | |
The maximum disparity is 1024, since the image width in Sintel | |
is 1024. | |
""" | |
d = disparity.copy() | |
# Clip disparity. | |
d[d>1024] = 1024 | |
d[d<0] = 0 | |
d_r = (d / 4.0).astype('uint8') | |
d_g = ((d * (2.0**6)) % 256).astype('uint8') | |
out = np.zeros((d.shape[0],d.shape[1],3),dtype='uint8') | |
out[:,:,0] = d_r | |
out[:,:,1] = d_g | |
if bitdepth > 16: | |
d_b = (d * (2**14) % 256).astype('uint8') | |
out[:,:,2] = d_b | |
Image.fromarray(out,'RGB').save(filename,'PNG') | |
def disparity_read(filename): | |
""" Return disparity read from filename. """ | |
f_in = np.array(Image.open(filename)) | |
d_r = f_in[:,:,0].astype('float64') | |
d_g = f_in[:,:,1].astype('float64') | |
d_b = f_in[:,:,2].astype('float64') | |
depth = d_r * 4 + d_g / (2**6) + d_b / (2**14) | |
return depth | |
#def cam_read(filename): | |
# """ Read camera data, return (M,N) tuple. | |
# | |
# M is the intrinsic matrix, N is the extrinsic matrix, so that | |
# | |
# x = M*N*X, | |
# with x being a point in homogeneous image pixel coordinates, X being a | |
# point in homogeneous world coordinates. | |
# """ | |
# txtdata = np.loadtxt(filename) | |
# intrinsic = txtdata[0,:9].reshape((3,3)) | |
# extrinsic = textdata[1,:12].reshape((3,4)) | |
# return intrinsic,extrinsic | |
# | |
# | |
#def cam_write(filename,M,N): | |
# """ Write intrinsic matrix M and extrinsic matrix N to file. """ | |
# Z = np.zeros((2,12)) | |
# Z[0,:9] = M.ravel() | |
# Z[1,:12] = N.ravel() | |
# np.savetxt(filename,Z) | |
def cam_read(filename): | |
""" Read camera data, return (M,N) tuple. | |
M is the intrinsic matrix, N is the extrinsic matrix, so that | |
x = M*N*X, | |
with x being a point in homogeneous image pixel coordinates, X being a | |
point in homogeneous world coordinates. | |
""" | |
f = open(filename,'rb') | |
check = np.fromfile(f,dtype=np.float32,count=1)[0] | |
assert check == TAG_FLOAT, ' cam_read:: Wrong tag in flow file (should be: {0}, is: {1}). Big-endian machine? '.format(TAG_FLOAT,check) | |
M = np.fromfile(f,dtype='float64',count=9).reshape((3,3)) | |
N = np.fromfile(f,dtype='float64',count=12).reshape((3,4)) | |
return M,N | |
def cam_write(filename, M, N): | |
""" Write intrinsic matrix M and extrinsic matrix N to file. """ | |
f = open(filename,'wb') | |
# write the header | |
f.write(TAG_CHAR) | |
M.astype('float64').tofile(f) | |
N.astype('float64').tofile(f) | |
f.close() | |
def segmentation_write(filename,segmentation): | |
""" Write segmentation to file. """ | |
segmentation_ = segmentation.astype('int32') | |
seg_r = np.floor(segmentation_ / (256**2)).astype('uint8') | |
seg_g = np.floor((segmentation_ % (256**2)) / 256).astype('uint8') | |
seg_b = np.floor(segmentation_ % 256).astype('uint8') | |
out = np.zeros((segmentation.shape[0],segmentation.shape[1],3),dtype='uint8') | |
out[:,:,0] = seg_r | |
out[:,:,1] = seg_g | |
out[:,:,2] = seg_b | |
Image.fromarray(out,'RGB').save(filename,'PNG') | |
def segmentation_read(filename): | |
""" Return disparity read from filename. """ | |
f_in = np.array(Image.open(filename)) | |
seg_r = f_in[:,:,0].astype('int32') | |
seg_g = f_in[:,:,1].astype('int32') | |
seg_b = f_in[:,:,2].astype('int32') | |
segmentation = (seg_r * 256 + seg_g) * 256 + seg_b | |
return segmentation | |