def undistort_image( shot: pymap.Shot, undistorted_shots: List[pymap.Shot], original: Optional[np.ndarray], interpolation, max_size: int, ) -> Dict[str, np.ndarray]: """Undistort an image into a set of undistorted ones. Args: shot: the distorted shot undistorted_shots: the set of undistorted shots covering the distorted shot field of view. That is 1 for most camera types and 6 for spherical cameras. original: the original distorted image array. interpolation: the opencv interpolation flag to use. max_size: maximum size of the undistorted image. """ if original is None: return {} projection_type = shot.camera.projection_type if projection_type in ["perspective", "brown", "fisheye", "fisheye_opencv"]: [undistorted_shot] = undistorted_shots new_camera = undistorted_shot.camera height, width = original.shape[:2] map1, map2 = pygeometry.compute_camera_mapping( shot.camera, new_camera, width, height ) undistorted = cv2.remap(original, map1, map2, interpolation) return {undistorted_shot.id: scale_image(undistorted, max_size)} elif pygeometry.Camera.is_panorama(projection_type): subshot_width = undistorted_shots[0].camera.width width = 4 * subshot_width height = width // 2 image = cv2.resize(original, (width, height), interpolation=interpolation) mint = cv2.INTER_LINEAR if interpolation == cv2.INTER_AREA else interpolation res = {} for undistorted_shot in undistorted_shots: undistorted = render_perspective_view_of_a_panorama( image, shot, undistorted_shot, mint ) res[undistorted_shot.id] = scale_image(undistorted, max_size) return res else: raise NotImplementedError( "Undistort not implemented for projection type: {}".format( shot.camera.projection_type ) )
def undistort_image(shot, undistorted_shots, original, interpolation, max_size): """Undistort an image into a set of undistorted ones. Args: shot: the distorted shot undistorted_shots: the set of undistorted shots covering the distorted shot field of view. That is 1 for most camera types and 6 for equirectangular cameras. original: the original distorted image array. interpolation: the opencv interpolation flag to use. max_size: maximum size of the undistorted image. """ if original is None: return projection_type = shot.camera.projection_type if projection_type in [ 'perspective', 'brown', 'fisheye', 'fisheye_opencv' ]: new_camera = undistorted_shots[0].camera height, width = original.shape[:2] map1, map2 = pygeometry.compute_camera_mapping(shot.camera, new_camera, width, height) undistorted = cv2.remap(original, map1, map2, interpolation) return {shot.id: scale_image(undistorted, max_size)} elif projection_type in ['equirectangular', 'spherical']: subshot_width = undistorted_shots[0].camera.width width = 4 * subshot_width height = width // 2 image = cv2.resize(original, (width, height), interpolation=interpolation) mint = cv2.INTER_LINEAR if interpolation == cv2.INTER_AREA else interpolation res = {} for subshot in undistorted_shots: undistorted = render_perspective_view_of_a_panorama( image, shot, subshot, mint) res[subshot.id] = scale_image(undistorted, max_size) return res else: raise NotImplementedError( 'Undistort not implemented for projection type: {}'.format( shot.camera.projection_type))