| | import json |
| | import numpy as np |
| | from numpy.linalg import inv |
| | from pathlib import Path |
| | import imageio |
| | import open3d as o3d |
| |
|
| | from hc3d.vis import CameraCone |
| | from hc3d.render import compute_intrinsics, unproject |
| | from hc3d.utils import batch_img_resize |
| | from fabric.utils.seed import seed_everything |
| |
|
| |
|
| | def get_K(H=500, W=500, fov=60): |
| | K = compute_intrinsics(W / H, fov, H) |
| | return K |
| |
|
| |
|
| | def shoot_rays(K, pose): |
| | h = 200 |
| | pixs = np.array([ |
| | [10, h], |
| | [200, h], |
| | [400, h] |
| | ]) |
| | pts = unproject(K, pixs, depth=1.0) |
| | pts = np.concatenate([ |
| | pts, |
| | np.array([0, 0, 0, 1]).reshape(1, -1), |
| | ], axis=0) |
| | pts = pts @ pose.T |
| | pts = pts[:, :3] |
| | pts = pts.astype(np.float32) |
| |
|
| | n = len(pixs) |
| | lines = np.array([ |
| | [i, n] for i in range(n) |
| | ], dtype=np.int32) |
| |
|
| | color = [1, 1, 0] |
| | colors = np.array([color] * len(lines), dtype=np.float32) |
| |
|
| | lset = o3d.t.geometry.LineSet() |
| | lset.point['positions'] = pts |
| | lset.line['indices'] = lines |
| | lset.line['colors'] = colors |
| |
|
| | return lset |
| |
|
| |
|
| | def test_rays(H, W, K): |
| | xs, ys = np.meshgrid( |
| | np.arange(W, dtype=np.float32), |
| | np.arange(H, dtype=np.float32), indexing='xy' |
| | ) |
| | xys = np.stack([xs, ys], axis=-1) |
| | my_rays = unproject(K, xys.reshape(-1, 2)) |
| | my_rays = my_rays.reshape(int(H), int(W), 4)[:, :, :3] |
| | return |
| |
|
| |
|
| | def plot_inward_facing_views(): |
| | |
| | from math import pi |
| | from pose import Poser |
| | H, W = 64, 64 |
| | poser = Poser(H, W, FoV=60, R=4) |
| | |
| | K, poses, _ = poser.sample_train(1000) |
| | K = K[0] |
| |
|
| | cam_locs = poses[:, :3, -1] |
| | |
| | |
| |
|
| | |
| |
|
| | |
| | |
| | |
| |
|
| | def generate_cam(po, color, im=None): |
| | cone = CameraCone(K, po, W, H, scale=0.1, |
| | top_left_corner=(0, 0), color=color) |
| | lset = cone.as_line_set() |
| | if im is None: |
| | return [lset] |
| | else: |
| | |
| | im = np.ascontiguousarray(im) |
| | view_plane = cone.as_view_plane(im) |
| | return [lset, view_plane] |
| |
|
| | cones = [] |
| |
|
| | for i in range(len(poses)): |
| | po = poses[i] |
| | geom = generate_cam(po, [1, 0, 0]) |
| | cones.extend(geom) |
| | |
| | |
| |
|
| | o3d.visualization.draw(cones, show_skybox=False) |
| |
|
| |
|
| | def blend_rgba(img): |
| | img = img[..., :3] * img[..., -1:] + (1. - img[..., -1:]) |
| | return img |
| |
|
| |
|
| | def compare(): |
| | import math |
| | import matplotlib.pyplot as plt |
| |
|
| | vs = np.linspace(1e-5, math.pi - 1e-5, 500) |
| | phi = np.arccos(1 - 2 * (vs / math.pi)) |
| | plt.plot(vs, phi) |
| | plt.show() |
| |
|
| |
|
| | if __name__ == "__main__": |
| | seed_everything(0) |
| | plot_inward_facing_views() |
| | |
| |
|