MCPcopy Index your code
hub / github.com/LeapLabTHU/ActiveNeRF / spherify_poses

Function spherify_poses

load_llff.py:184–240  ·  view source on GitHub ↗
(poses, bds)

Source from the content-addressed store, hash-verified

182
183
184def spherify_poses(poses, bds):
185
186 p34_to_44 = lambda p : np.concatenate([p, np.tile(np.reshape(np.eye(4)[-1,:], [1,1,4]), [p.shape[0], 1,1])], 1)
187
188 rays_d = poses[:,:3,2:3]
189 rays_o = poses[:,:3,3:4]
190
191 def min_line_dist(rays_o, rays_d):
192 A_i = np.eye(3) - rays_d * np.transpose(rays_d, [0,2,1])
193 b_i = -A_i @ rays_o
194 pt_mindist = np.squeeze(-np.linalg.inv((np.transpose(A_i, [0,2,1]) @ A_i).mean(0)) @ (b_i).mean(0))
195 return pt_mindist
196
197 pt_mindist = min_line_dist(rays_o, rays_d)
198
199 center = pt_mindist
200 up = (poses[:,:3,3] - center).mean(0)
201
202 vec0 = normalize(up)
203 vec1 = normalize(np.cross([.1,.2,.3], vec0))
204 vec2 = normalize(np.cross(vec0, vec1))
205 pos = center
206 c2w = np.stack([vec1, vec2, vec0, pos], 1)
207
208 poses_reset = np.linalg.inv(p34_to_44(c2w[None])) @ p34_to_44(poses[:,:3,:4])
209
210 rad = np.sqrt(np.mean(np.sum(np.square(poses_reset[:,:3,3]), -1)))
211
212 sc = 1./rad
213 poses_reset[:,:3,3] *= sc
214 bds *= sc
215 rad *= sc
216
217 centroid = np.mean(poses_reset[:,:3,3], 0)
218 zh = centroid[2]
219 radcircle = np.sqrt(rad**2-zh**2)
220 new_poses = []
221
222 for th in np.linspace(0.,2.*np.pi, 120):
223
224 camorigin = np.array([radcircle * np.cos(th), radcircle * np.sin(th), zh])
225 up = np.array([0,0,-1.])
226
227 vec2 = normalize(camorigin)
228 vec0 = normalize(np.cross(vec2, up))
229 vec1 = normalize(np.cross(vec2, vec0))
230 pos = camorigin
231 p = np.stack([vec0, vec1, vec2, pos], 1)
232
233 new_poses.append(p)
234
235 new_poses = np.stack(new_poses, 0)
236
237 new_poses = np.concatenate([new_poses, np.broadcast_to(poses[0,:3,-1:], new_poses[:,:3,-1:].shape)], -1)
238 poses_reset = np.concatenate([poses_reset[:,:3,:4], np.broadcast_to(poses[0,:3,-1:], poses_reset[:,:3,-1:].shape)], -1)
239
240 return poses_reset, new_poses, bds
241

Callers 1

load_llff_dataFunction · 0.85

Calls 2

min_line_distFunction · 0.85
normalizeFunction · 0.85

Tested by

no test coverage detected