Spaces:
Running
Running
# -*- coding: utf-8 -*- | |
# @Author : xuelun | |
import math | |
import numpy as np | |
from imageio import imread | |
import datasets.scenenet.scenenet_pb2 as sn | |
def camera_intrinsic_transform(vfov=45,hfov=60,pixel_width=320,pixel_height=240): | |
camera_intrinsics = np.zeros((3,4)) | |
camera_intrinsics[2,2] = 1 | |
camera_intrinsics[0,0] = (pixel_width/2.0)/math.tan(math.radians(hfov/2.0)) | |
camera_intrinsics[0,2] = pixel_width/2.0 | |
camera_intrinsics[1,1] = (pixel_height/2.0)/math.tan(math.radians(vfov/2.0)) | |
camera_intrinsics[1,2] = pixel_height/2.0 | |
return camera_intrinsics | |
def read_depth(filename): | |
depth = np.array(imread(filename)) | |
depth = depth.astype(np.float32) / 1000 | |
return depth | |
def position_to_np_array(position,homogenous=False): | |
if not homogenous: | |
return np.array([position.x,position.y,position.z]) | |
return np.array([position.x,position.y,position.z,1.0]) | |
def interpolate_poses(start_pose,end_pose,alpha): | |
assert alpha >= 0.0 | |
assert alpha <= 1.0 | |
camera_pose = alpha * position_to_np_array(end_pose.camera) | |
camera_pose += (1.0 - alpha) * position_to_np_array(start_pose.camera) | |
lookat_pose = alpha * position_to_np_array(end_pose.lookat) | |
lookat_pose += (1.0 - alpha) * position_to_np_array(start_pose.lookat) | |
timestamp = alpha * end_pose.timestamp + (1.0 - alpha) * start_pose.timestamp | |
pose = sn.Pose() | |
pose.camera.x = camera_pose[0] | |
pose.camera.y = camera_pose[1] | |
pose.camera.z = camera_pose[2] | |
pose.lookat.x = lookat_pose[0] | |
pose.lookat.y = lookat_pose[1] | |
pose.lookat.z = lookat_pose[2] | |
pose.timestamp = timestamp | |
return pose | |
def normalize(v): | |
return v/np.linalg.norm(v) | |
def world_to_camera_with_pose(view_pose): | |
lookat_pose = position_to_np_array(view_pose.lookat) | |
camera_pose = position_to_np_array(view_pose.camera) | |
up = np.array([0,1,0]) | |
R = np.diag(np.ones(4)) | |
R[2,:3] = normalize(lookat_pose - camera_pose) | |
R[0,:3] = normalize(np.cross(R[2,:3],up)) | |
R[1,:3] = -normalize(np.cross(R[0,:3],R[2,:3])) | |
T = np.diag(np.ones(4)) | |
T[:3,3] = -camera_pose | |
return R.dot(T) | |