|
import numpy as np
|
|
def deg2rad(deg):
|
|
return deg*np.pi/180
|
|
|
|
def inv_RT(RT):
|
|
|
|
RT_inv = np.linalg.inv(RT)
|
|
|
|
return RT_inv[:3, :]
|
|
def camNormal2worldNormal(rot_c2w, camNormal):
|
|
H,W,_ = camNormal.shape
|
|
normal_img = np.matmul(rot_c2w[None, :, :], camNormal.reshape(-1,3)[:, :, None]).reshape([H, W, 3])
|
|
|
|
return normal_img
|
|
|
|
def worldNormal2camNormal(rot_w2c, normal_map_world):
|
|
H,W,_ = normal_map_world.shape
|
|
|
|
|
|
|
|
|
|
normal_map_flat = normal_map_world.reshape(-1, 3)
|
|
|
|
|
|
normal_map_camera_flat = np.dot(normal_map_flat, rot_w2c.T)
|
|
|
|
|
|
normal_map_camera = normal_map_camera_flat.reshape(normal_map_world.shape)
|
|
|
|
return normal_map_camera
|
|
|
|
def trans_normal(normal, RT_w2c, RT_w2c_target):
|
|
|
|
|
|
|
|
|
|
relative_RT = np.matmul(RT_w2c_target[:3,:3], np.linalg.inv(RT_w2c[:3,:3]))
|
|
return worldNormal2camNormal(relative_RT[:3,:3], normal)
|
|
|
|
def trans_normal_complex(normal, RT_w2c, RT_w2c_rela_to_cond):
|
|
|
|
normal_world = camNormal2worldNormal(np.linalg.inv(RT_w2c[:3,:3]), normal)
|
|
|
|
|
|
|
|
normal_target_cam = worldNormal2camNormal(RT_w2c_rela_to_cond[:3,:3], normal_world)
|
|
|
|
return normal_target_cam
|
|
def img2normal(img):
|
|
return (img/255.)*2-1
|
|
|
|
def normal2img(normal):
|
|
return np.uint8((normal*0.5+0.5)*255)
|
|
|
|
def norm_normalize(normal, dim=-1):
|
|
|
|
normal = normal/(np.linalg.norm(normal, axis=dim, keepdims=True)+1e-6)
|
|
|
|
return normal
|
|
|
|
def plot_grid_images(images, row, col, path=None):
|
|
import cv2
|
|
"""
|
|
Args:
|
|
images: np.array [B, H, W, 3]
|
|
row:
|
|
col:
|
|
save_path:
|
|
|
|
Returns:
|
|
|
|
"""
|
|
images = images.detach().cpu().numpy()
|
|
assert row * col == images.shape[0]
|
|
images = np.vstack([np.hstack(images[r * col:(r + 1) * col]) for r in range(row)])
|
|
if path:
|
|
cv2.imwrite(path, images[:,:,::-1] * 255)
|
|
return images |