# -*- 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)