import os import numpy as np import cv2 import glob import json def CropImage(left_up, crop_size, image=None, K=None): crop_size = np.array(crop_size).astype(np.int32) left_up = np.array(left_up).astype(np.int32) if not K is None: K[0:2,2] = K[0:2,2] - np.array(left_up) if not image is None: if left_up[0] < 0: image_left = np.zeros([image.shape[0], -left_up[0], image.shape[2]], dtype=np.uint8) image = np.hstack([image_left, image]) left_up[0] = 0 if left_up[1] < 0: image_up = np.zeros([-left_up[1], image.shape[1], image.shape[2]], dtype=np.uint8) image = np.vstack([image_up, image]) left_up[1] = 0 if crop_size[0] + left_up[0] > image.shape[1]: image_right = np.zeros([image.shape[0], crop_size[0] + left_up[0] - image.shape[1], image.shape[2]], dtype=np.uint8) image = np.hstack([image, image_right]) if crop_size[1] + left_up[1] > image.shape[0]: image_down = np.zeros([crop_size[1] + left_up[1] - image.shape[0], image.shape[1], image.shape[2]], dtype=np.uint8) image = np.vstack([image, image_down]) image = image[left_up[1]:left_up[1]+crop_size[1], left_up[0]:left_up[0]+crop_size[0], :] return image, K def ResizeImage(target_size, source_size, image=None, K=None): if not K is None: K[0,:] = (target_size[0] / source_size[0]) * K[0,:] K[1,:] = (target_size[1] / source_size[1]) * K[1,:] if not image is None: image = cv2.resize(image, dsize=target_size) return image, K def extract_frames(id_list): for id in id_list: camera_path = os.path.join(DATA_SOURCE, 'camera_params', id, 'camera_params.json') with open(camera_path, 'r') as f: camera = json.load(f) fids = {} for camera_id in camera['world_2_cam'].keys(): fids[camera_id] = 0 background_path = os.path.join(DATA_SOURCE, 'sequence_BACKGROUND_part-1', id, 'BACKGROUND', 'image_%s.jpg' % camera_id) background = cv2.imread(background_path) background, _ = CropImage(LEFT_UP, CROP_SIZE, background, None) background, _ = ResizeImage(SIZE, CROP_SIZE, background, None) os.makedirs(os.path.join(DATA_OUTPUT, id, 'background'), exist_ok=True) cv2.imwrite(os.path.join(DATA_OUTPUT, id, 'background', 'image_' + camera_id + '.jpg'), background) video_folders = glob.glob(os.path.join(DATA_SOURCE, '*', id, '*')) for video_folder in video_folders: if ('tongue' in video_folder) or ('GLASSES' in video_folder) or ('FREE' in video_folder) or ('BACKGROUND' in video_folder): continue video_paths = glob.glob(os.path.join(video_folder, 'cam_*')) for video_path in video_paths: camera_id = video_path[-13:-4] extrinsic = np.array(camera['world_2_cam'][camera_id][:3]) intrinsic = np.array(camera['intrinsics']) _, intrinsic = CropImage(LEFT_UP, CROP_SIZE, None, intrinsic) _, intrinsic = ResizeImage(SIZE, CROP_SIZE, None, intrinsic) cap = cv2.VideoCapture(video_path) count = -1 while(1): _, image = cap.read() if image is None: break count += 1 if count % 3 != 0: continue visible = (np.ones_like(image) * 255).astype(np.uint8) image, _ = CropImage(LEFT_UP, CROP_SIZE, image, None) image, _ = ResizeImage(SIZE, CROP_SIZE, image, None) visible, _ = CropImage(LEFT_UP, CROP_SIZE, visible, None) visible, _ = ResizeImage(SIZE, CROP_SIZE, visible, None) image_lowres = cv2.resize(image, SIZE_LOWRES) visible_lowres = cv2.resize(visible, SIZE_LOWRES) os.makedirs(os.path.join(DATA_OUTPUT, id, 'images', '%04d' % fids[camera_id]), exist_ok=True) cv2.imwrite(os.path.join(DATA_OUTPUT, id, 'images', '%04d' % fids[camera_id], 'image_' + camera_id + '.jpg'), image) cv2.imwrite(os.path.join(DATA_OUTPUT, id, 'images', '%04d' % fids[camera_id], 'image_lowres_' + camera_id + '.jpg'), image_lowres) cv2.imwrite(os.path.join(DATA_OUTPUT, id, 'images', '%04d' % fids[camera_id], 'visible_' + camera_id + '.jpg'), visible) cv2.imwrite(os.path.join(DATA_OUTPUT, id, 'images', '%04d' % fids[camera_id], 'visible_lowres_' + camera_id + '.jpg'), visible_lowres) os.makedirs(os.path.join(DATA_OUTPUT, id, 'cameras', '%04d' % fids[camera_id]), exist_ok=True) np.savez(os.path.join(DATA_OUTPUT, id, 'cameras', '%04d' % fids[camera_id], 'camera_' + camera_id + '.npz'), extrinsic=extrinsic, intrinsic=intrinsic) fids[camera_id] += 1 if __name__ == "__main__": LEFT_UP = [-200, 304] CROP_SIZE = [2600, 2600] SIZE = [2048, 2048] SIZE_LOWRES = [256, 256] DATA_SOURCE = 'path/to/raw_NeRSemble/' DATA_OUTPUT = '../NeRSemble' extract_frames(['031', '036'])