def _try_to_load_corners(corners_path): if not corners_path: return None if not path.exists(corners_path): return None with open(corners_path, 'rb') as corners_file: return corners.load(corners_file)
def cli(frame_sequence, camera, track_destination, point_cloud_destination, file_to_load_corners, show, camera_poses_file, frame_1, frame_2): """ FRAME_SEQUENCE path to a video file or shell-like wildcard describing multiple images\n CAMERA intrinsic parameters of camera\n TRACK_DESTINATION path to file for dumping result camera track\n POINT_CLOUD_DESTINATION path to file for dumping result point cloud """ sequence = frameseq.read_grayscale_f32(frame_sequence) if file_to_load_corners is not None: corner_storage = load(file_to_load_corners) else: corner_storage = build(sequence) if camera_poses_file is not None and frame_1 is not None and frame_2 is not None: known_camera_poses = read_poses(camera_poses_file) known_view_1 = frame_1, known_camera_poses[frame_1] known_view_2 = frame_2, known_camera_poses[frame_2] else: known_view_1 = None known_view_2 = None camera_parameters = read_camera_parameters(camera) poses, point_cloud = track_and_calc_colors( camera_parameters, corner_storage, frame_sequence, known_view_1, known_view_2 ) write_poses(poses, track_destination) write_point_cloud(point_cloud, point_cloud_destination) if show: click.echo( "Press 'q' to stop, 'd' to go forward, 'a' to go backward, " "'r' to restart" ) frame = 0 while True: grayscale = sequence[frame] bgra = draw_residuals(grayscale, corner_storage[frame], point_cloud, camera_parameters, poses[frame]) cv2.imshow('Frame', bgra) key = chr(cv2.waitKey(20) & 0xFF) if key == 'r': frame = 0 if key == 'a' and frame > 0: frame -= 1 if key == 'd' and frame + 1 < len(corner_storage): frame += 1 if key == 'q': break