Spaces:
Running
on
Zero
Running
on
Zero
File size: 2,896 Bytes
184193d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
import os
import numpy as np
from PIL import Image
def load_image(fpath, sz=256):
img = Image.open(fpath)
img = img.resize((sz, sz))
return np.asarray(img)[:, :, :3]
def spherical_to_cartesian(sph):
theta, azimuth, radius = sph
return np.array([
radius * np.sin(theta) * np.cos(azimuth),
radius * np.sin(theta) * np.sin(azimuth),
radius * np.cos(theta),
])
def cartesian_to_spherical(xyz):
xy = xyz[0]**2 + xyz[1]**2
radius = np.sqrt(xy + xyz[2]**2)
theta = np.arctan2(np.sqrt(xy), xyz[2])
azimuth = np.arctan2(xyz[1], xyz[0])
return np.array([theta, azimuth, radius])
def elu_to_c2w(eye, lookat, up):
if isinstance(eye, list):
eye = np.array(eye)
if isinstance(lookat, list):
lookat = np.array(lookat)
if isinstance(up, list):
up = np.array(up)
l = eye - lookat
if np.linalg.norm(l) < 1e-8:
l[-1] = 1
l = l / np.linalg.norm(l)
s = np.cross(l, up)
if np.linalg.norm(s) < 1e-8:
s[0] = 1
s = s / np.linalg.norm(s)
uu = np.cross(s, l)
rot = np.eye(3)
rot[0, :] = -s
rot[1, :] = uu
rot[2, :] = l
c2w = np.eye(4)
c2w[:3, :3] = rot.T
c2w[:3, 3] = eye
return c2w
def c2w_to_elu(c2w):
w2c = np.linalg.inv(c2w)
eye = c2w[:3, 3]
lookat_dir = -w2c[2, :3]
lookat = eye + lookat_dir
up = w2c[1, :3]
return eye, lookat, up
def qvec_to_rotmat(qvec):
return np.array([
[
1 - 2 * qvec[2]**2 - 2 * qvec[3]**2,
2 * qvec[1] * qvec[2] - 2 * qvec[0] * qvec[3],
2 * qvec[3] * qvec[1] + 2 * qvec[0] * qvec[2]
], [
2 * qvec[1] * qvec[2] + 2 * qvec[0] * qvec[3],
1 - 2 * qvec[1]**2 - 2 * qvec[3]**2,
2 * qvec[2] * qvec[3] - 2 * qvec[0] * qvec[1]
], [
2 * qvec[3] * qvec[1] - 2 * qvec[0] * qvec[2],
2 * qvec[2] * qvec[3] + 2 * qvec[0] * qvec[1],
1 - 2 * qvec[1]**2 - 2 * qvec[2]**2
]
])
def rotmat(a, b):
a, b = a / np.linalg.norm(a), b / np.linalg.norm(b)
v = np.cross(a, b)
c = np.dot(a, b)
# handle exception for the opposite direction input
if c < -1 + 1e-10:
return rotmat(a + np.random.uniform(-1e-2, 1e-2, 3), b)
s = np.linalg.norm(v)
kmat = np.array([[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]])
return np.eye(3) + kmat + kmat.dot(kmat) * ((1 - c) / (s ** 2 + 1e-10))
def recenter_cameras(c2ws):
is_list = False
if isinstance(c2ws, list):
is_list = True
c2ws = np.stack(c2ws)
center = c2ws[..., :3, -1].mean(axis=0)
c2ws[..., :3, -1] = c2ws[..., :3, -1] - center
if is_list:
c2ws = [ c2w for c2w in c2ws ]
return c2ws
def rescale_cameras(c2ws, scale):
is_list = False
if isinstance(c2ws, list):
is_list = True
c2ws = np.stack(c2ws)
c2ws[..., :3, -1] *= scale
if is_list:
c2ws = [ c2w for c2w in c2ws ]
return c2ws
|