def render(self, r, t, light_position, light_intensity, class_name, brightness_k=0, r_type='quat'): ''' :param r: :param t: :param light_position: :param light_intensity: :param brightness_k: choose which brightness in __init__ :param r_type: :return: ''' if r_type == 'quat': R = RT_transform.quat2mat(r) elif r_type == 'mat': R = r self.class_name = class_name self.brightness_k = brightness_k self.render_kernels[ self.class_name][brightness_k]['u_view'] = self._get_view_mtx( R, t) self.render_kernels[ self.class_name][brightness_k]['u_light_position'] = light_position self.render_kernels[self.class_name][brightness_k]['u_normal'] = \ np.array(np.matrix(np.dot( self.render_kernels[self.class_name][brightness_k]['u_view'].reshape(4,4), self.render_kernels[self.class_name][brightness_k]['u_model'].reshape(4,4))).I.T) self.render_kernels[self.class_name][brightness_k][ 'u_light_intensity'] = light_intensity app.run(framecount=0, framerate=0) rgb_buffer = np.zeros((self.height, self.width, 4), dtype=np.float32) gl.glReadPixels(0, 0, self.width, self.height, gl.GL_RGBA, gl.GL_FLOAT, rgb_buffer) rgb_gl = np.copy(rgb_buffer) rgb_gl.shape = 480, 640, 4 rgb_gl = rgb_gl[::-1, :] rgb_gl = np.round(rgb_gl[:, :, :3] * 255).astype( np.uint8) # Convert to [0, 255] rgb_gl = rgb_gl[:, :, [2, 1, 0]] depth_buffer = np.zeros((self.height, self.width), dtype=np.float32) gl.glReadPixels(0, 0, self.width, self.height, gl.GL_DEPTH_COMPONENT, gl.GL_FLOAT, depth_buffer) depth_gl = np.copy(depth_buffer) depth_gl.shape = 480, 640 depth_gl = depth_gl[::-1, :] depth_bg = depth_gl == 1 depth_gl = 2 * self.zFar * self.zNear / (self.zFar + self.zNear - (self.zFar - self.zNear) * (2 * depth_gl - 1)) depth_gl[depth_bg] = 0 return rgb_gl, depth_gl
def gen_render_real(): for cls_idx, cls_name in idx2class.items(): print(cls_idx, cls_name) if cls_name == 'driller': continue with open( os.path.join(real_set_dir, 'occLM_val_real_{}.txt'.format(cls_name)), 'r') as f: all_indices = [line.strip('\r\n') for line in f.readlines()] # render machine model_dir = os.path.join(LM6d_root, 'models', cls_name) render_machine = Render_Py(model_dir, K, width, height, ZNEAR, ZFAR) for real_idx in tqdm(all_indices): video_name, prefix = real_idx.split('/') # video name is "test" # read pose ------------------------------------- real_meta_path = os.path.join(real_data_root, "02/{}-meta.mat".format(prefix)) meta_data = sio.loadmat(real_meta_path) inner_id = np.where( np.squeeze(meta_data['cls_indexes']) == cls_idx) if len(meta_data['poses'].shape) == 2: pose = meta_data['poses'] else: pose = np.squeeze(meta_data['poses'][:, :, inner_id]) new_pose_path = os.path.join(render_real_root, cls_name, "{}-pose.txt".format(prefix)) mkdir_if_missing(os.path.join(render_real_root, cls_name)) # write pose write_pose_file(new_pose_path, cls_idx, pose) # ----------------------render color, depth ------------ rgb_gl, depth_gl = render_machine.render( RT_transform.mat2quat(pose[:3, :3]), pose[:, -1]) rgb_gl = rgb_gl.astype('uint8') render_color_path = os.path.join(render_real_root, cls_name, "{}-color.png".format(prefix)) cv2.imwrite(render_color_path, rgb_gl) # depth depth_save = depth_gl * DEPTH_FACTOR depth_save = depth_save.astype('uint16') render_depth_path = os.path.join(render_real_root, cls_name, "{}-depth.png".format(prefix)) cv2.imwrite(render_depth_path, depth_save) #--------------------- render label ---------------------------------- render_label = depth_gl != 0 render_label = render_label.astype('uint8') # write label label_path = os.path.join(render_real_root, cls_name, "{}-label.png".format(prefix)) cv2.imwrite(label_path, render_label)