|
from pathlib import Path |
|
import json |
|
import numpy as np |
|
import imageio |
|
from .utils import blend_rgba |
|
|
|
|
|
def load_blender(split, scene="lego", half_res=False): |
|
assert split in ("train", "val", "test") |
|
|
|
env_fname = Path(__file__).resolve().parents[1] / "env.json" |
|
with env_fname.open("r") as f: |
|
root = json.load(f)['data_root'] |
|
root = Path(root) / scene |
|
|
|
with open(root / f'transforms_{split}.json', "r") as f: |
|
meta = json.load(f) |
|
|
|
imgs, poses = [], [] |
|
|
|
for frame in meta['frames']: |
|
file_name = root / f"{frame['file_path']}.png" |
|
im = imageio.imread(file_name) |
|
c2w = frame['transform_matrix'] |
|
|
|
imgs.append(im) |
|
poses.append(c2w) |
|
|
|
imgs = (np.array(imgs) / 255.).astype(np.float32) |
|
imgs = blend_rgba(imgs) |
|
poses = np.array(poses).astype(float) |
|
|
|
H, W = imgs[0].shape[:2] |
|
W = 64 |
|
H = 64 |
|
camera_angle_x = float(meta['camera_angle_x']) |
|
f = 1 / np.tan(camera_angle_x / 2) * (W / 2) |
|
|
|
if half_res: |
|
raise NotImplementedError() |
|
|
|
K = np.array([ |
|
[f, 0, -(W/2 - 0.5)], |
|
[0, -f, -(H/2 - 0.5)], |
|
[0, 0, -1] |
|
]) |
|
|
|
return imgs, K, poses |
|
|