Exemplo n.º 1
0
def main_sos_vo():
    scene_path = osp.realpath(osp.expanduser(args.sequence_path[0]))
    gums_calibrated_filename = osp.realpath(
        osp.expanduser(args.calibrated_gums_file))
    visualize_VO = args.visualize_VO

    # HARD-CODED flags:
    # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    use_perfect_model_VO = False  # WARNING: It may be used only when using SYNTHETIC images
    only_visualize_frames_from_existing_VO_poses_file = False  # <<< SETME: Will not run VO if True, but just reload the file from an existing experiment
    # NOTE: For DEBUG, set use_multithreads_for_VO <-- False
    use_multithreads_for_VO = True  # <<< 3D Visualization interactivity (is more responsive) when running the VO as a threads
    step_for_scene_images = 1
    first_image_index = 0
    last_image_index = -1  # -1 for up to the last one
    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    scene_prefix_filename = "image-*.png"
    scene_path_omni = osp.join(scene_path, "omni")
    scene_img_filename_template = osp.join(scene_path_omni,
                                           scene_prefix_filename)
    num_scene_images = len(
        fnmatch.filter(listdir(scene_path_omni), scene_prefix_filename))
    scene_path_vo_results = osp.join(scene_path,
                                     "results-omni")  # VO Results path
    make_sure_path_exists(scene_path_vo_results)
    path_to_scene_name, scene_name = osp.split(scene_path)

    vis_name = "%s-%s" % (scene_name, "SOS")
    if only_visualize_frames_from_existing_VO_poses_file:
        from omnistereo.common_plot import replay_VO_visualization
        replay_VO_visualization(scene_path_vo_results=scene_path_vo_results,
                                first_image_index=first_image_index,
                                last_image_index=last_image_index,
                                step_for_poses=step_for_scene_images,
                                vis_name=vis_name)
    else:
        from omnistereo.pose_est_tools import driver_VO
        # Use the thread_name parameter to name the VO Visualization window:
        if use_perfect_model_VO:
            print("Using 'theoretical' model for", vis_name)
            from omnistereo.cata_hyper_model import get_theoretical_OmniStereo
            from omnistereo.common_cv import get_images
            calib_img_filename_template = ""  # SETME: needs to pass the filename template
            radial_bounds_filename = ""  # SETME: needs to pass the radial bounds file
            theoretical_params_filename = ""  # SETME: needs to pass the theoretical parameters file
            model_version = "new"
            is_synthetic = False
            mirror_images = get_images(calib_img_filename_template,
                                       indices_list=[0],
                                       show_images=False,
                                       return_names_only=False)
            use_existing_radial_bounds = True
            hyperbolic_model_theoretical = get_theoretical_OmniStereo(
                omni_img=mirror_images,
                radial_bounds_filename=radial_bounds_filename,
                theoretical_params_filename=theoretical_params_filename,
                model_version=model_version,
                is_synthetic=is_synthetic,
                use_existing_radial_bounds=use_existing_radial_bounds)
            driver_VO(camera_model=hyperbolic_model_theoretical,
                      scene_path=scene_path_omni,
                      scene_path_vo_results=scene_path_vo_results,
                      scene_img_filename_template=scene_img_filename_template,
                      depth_filename_template=None,
                      num_scene_images=num_scene_images,
                      visualize_VO=visualize_VO,
                      use_multithreads_for_VO=use_multithreads_for_VO,
                      step_for_scene_images=step_for_scene_images,
                      first_image_index=first_image_index,
                      last_image_index=last_image_index,
                      thread_name=vis_name)
        else:
            # Attempting to just load the calibrated GUMS model
            gums_calibrated = load_obj_from_pickle(gums_calibrated_filename)
            driver_VO(camera_model=gums_calibrated,
                      scene_path=scene_path_omni,
                      scene_path_vo_results=scene_path_vo_results,
                      scene_img_filename_template=scene_img_filename_template,
                      depth_filename_template=None,
                      num_scene_images=num_scene_images,
                      visualize_VO=visualize_VO,
                      use_multithreads_for_VO=use_multithreads_for_VO,
                      step_for_scene_images=step_for_scene_images,
                      first_image_index=first_image_index,
                      last_image_index=last_image_index,
                      thread_name=vis_name)

    from omnistereo.common_cv import clean_up
    clean_up(wait_key_time=1)
    print("GOODBYE!")
Exemplo n.º 2
0
    else:
        cam_name = 0

#     img_file_name = "../data/real/rr/test/scene/office/image"

#     img_file_name = "../data/real/new/VICON/scene/office/image"
#     img_file_name = "../data/real/new/simple/calibration/chessboard"
#     img_file_name = "../data/real/new/simple/scene/office/image"
#     img_file_name = "../data/real/new/simple/scene/home/image"
#     img_file_name = "../data/real/new/simple/scene/outdoors/image"
#     img_file_name = "../data/real/rr/simple/calibration_test/charuco/chessboard"

    files_path_root = path.dirname(path.abspath(path.realpath(file_name)))
    file_basename = path.basename(file_name)

    make_sure_path_exists(files_path_root)
    file_name_resolved = path.join(files_path_root, file_basename)

    save_img_interval = -1  # -1: for manual saving, otherwise, specify the timing here
    # A Single Blackfly chamera
    cam = WebcamLive(cam_index=cam_name,
                     mirror_image=False,
                     file_name=file_name_resolved,
                     cam_model="BLACKFLY",
                     save_img_interval=save_img_interval)

    # A Single Chameleon chamera
    # cam = WebcamLive(cam_index=cam_name, mirror_image=False, img_file_name=file_name_resolved, cam_model="CHAMELEON")
    # A Duo Chameleon chameras
    # cam = WebcamLiveDuo(cam_indices=[0, 1], mirror_image=False, img_file_name=file_name_resolved, cam_models=["CHAMELEON", "CHAMELEON"], save_keys=['a', 's'], save_img_interval=save_img_interval)
Exemplo n.º 3
0
def main_rgbd_vo():
    scene_path = osp.realpath(osp.expanduser(args.sequence_path[0]))
    visualize_VO = args.visualize_VO

    hand_eye_T = None
    if args.is_synthetic:
        focal_length_m = 1. / 1000.0  # in [m]
        depth_is_Z = False  # The synthetic dataset encodes the radial (Euclidean) distance as depth
        # POV-Ray synthetic
        fx = 554.256258
        fy = 554.256258
        center_x = 319.5
        center_y = 239.5
        scaling_factor = 1. / 1000.0  # [mm] to [m]
        do_undistortion = False
        distortion_coeffs = np.array([0., 0., 0., 0., 0.])
        #=======================================================================
        # Align the optical axis of a perspective camera is the +Z axis
        xaxis, yaxis, zaxis = [1, 0, 0], [0, 1, 0], [0, 0, 1]
        # Recall, for the RGB-D sensor we need to rotate -90 degrees around the scene's [S] x-axis
        from omnistereo.transformations import rotation_matrix
        hand_eye_T = rotation_matrix(
            -np.pi / 2.0, xaxis
        )  # Not longer in place if the hand-eye transformation is given
        #=======================================================================
    else:
        focal_length_m = 1. / 1000.0  # in [m] DUMMY!
        depth_is_Z = True
        fx = fy = 525.0
        center_x = 319.5
        center_y = 239.5
        scaling_factor = 1. / 1000.0  # [mm] to [m]
        do_undistortion = False
        distortion_coeffs = np.array(
            [0.2624, -0.9531, -0.0054, 0.0026, 1.1633])

    # HARD-CODED flags:
    # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    only_visualize_frames_from_existing_VO_poses_file = False  # <<< SETME: Will not run VO if True, but just reload the file from an existing experiment
    # NOTE: For DEBUG, set use_multithreads_for_VO <-- False
    use_multithreads_for_VO = True  # <<< 3D Visualization interactivity (is more responsive) when running the VO as a threads
    step_for_scene_images = 1
    first_image_index = 0
    last_image_index = -1  # -1 for up to the last one
    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    if not args.is_synthetic:
        hand_eye_transformation_filename = osp.realpath(
            osp.expanduser(args.hand_eye_transformation))
        hand_eye_transformation_file_exists = osp.isfile(
            hand_eye_transformation_filename)
        if hand_eye_transformation_file_exists:
            from omnistereo.common_tools import get_poses_from_file
            T_Cest_wrt_Rgt_poses_7_tum_format_list, T_Cest_wrt_Rgt_transform_matrices_list = get_poses_from_file(
                poses_filename=hand_eye_transformation_filename,
                input_units="m",
                output_working_units="m",
                indices=None,
                pose_format="tum",
                zero_up_wrt_origin=False,
                initial_T=None)
            hand_eye_T = T_Cest_wrt_Rgt_transform_matrices_list[
                0]  # There should be a single transformation in this file

    scene_prefix_filename = "*.png"
    scene_path_rgbd = osp.join(scene_path, "rgbd")
    scene_rgb_img_filename_template = osp.join(scene_path_rgbd, "rgb",
                                               scene_prefix_filename)
    num_scene_images = len(
        fnmatch.filter(listdir(osp.join(scene_path_rgbd, "rgb")),
                       scene_prefix_filename))
    scene_depth_filename_template = osp.join(scene_path_rgbd, "depth",
                                             scene_prefix_filename)
    scene_path_vo_results = osp.join(scene_path,
                                     "results-rgbd")  # VO Results path
    make_sure_path_exists(scene_path_vo_results)
    path_to_scene_name, scene_name = osp.split(scene_path)

    rgbd_cam_model = RGBDCamModel(fx=fx,
                                  fy=fy,
                                  center_x=center_x,
                                  center_y=center_y,
                                  scaling_factor=scaling_factor,
                                  do_undistortion=do_undistortion,
                                  depth_is_Z=depth_is_Z,
                                  focal_length_m=focal_length_m)
    rgbd_cam_model.T_Cest_wrt_Rgt = hand_eye_T  # Apply hand-eye transformation for the camera (as found from some preceding procedure)
    # Use the thread_name parameter to name the VO Visualization window:
    vis_name = "%s-%s" % (scene_name, "RGB-D")
    if only_visualize_frames_from_existing_VO_poses_file:
        from omnistereo.common_plot import replay_VO_visualization
        replay_VO_visualization(scene_path_vo_results=scene_path_vo_results,
                                first_image_index=first_image_index,
                                last_image_index=last_image_index,
                                step_for_poses=step_for_scene_images,
                                vis_name=vis_name)
    else:
        from omnistereo.pose_est_tools import driver_VO
        driver_VO(camera_model=rgbd_cam_model,
                  scene_path=scene_path_rgbd,
                  scene_path_vo_results=scene_path_vo_results,
                  scene_img_filename_template=scene_rgb_img_filename_template,
                  depth_filename_template=scene_depth_filename_template,
                  num_scene_images=num_scene_images,
                  visualize_VO=visualize_VO,
                  use_multithreads_for_VO=use_multithreads_for_VO,
                  step_for_scene_images=step_for_scene_images,
                  first_image_index=first_image_index,
                  last_image_index=last_image_index,
                  thread_name=vis_name)

    from omnistereo.common_cv import clean_up
    clean_up(wait_key_time=1)
    print("GOODBYE!")
def main_demo():
    is_synthetic = True
    model_version = "old"  # Set to "old" for the PUBLISHED params, or "new" for the new one
    experiment_name = "simple"  # "simple", "VICON", "CVPR", "with_misalignment-4", etc.  # <<<<<- SET For example, "VICON" uses ground truth data, otherwise use "simple"

    # HYPERBOLIC Parameters (Used in Publication):
    #===========================================================================
    # k1 = 5.7319  # Unitless
    # k2 = 9.7443  # Unitless
    # Using millimeters
    # r_sys = 37.0
    # r_reflex = 17.226
    # r_cam = 7.25
    # c1 = 123.488
    # c2 = 241.803
    # d = 233.684
    #===========================================================================
    # vvvvvvvvvvvvvvvvvvvvvvv OPTIONS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    load_model_from_file = True  # <<< SETME: to load omnistereo model from a pickle or start anew
    show_panoramic_img = True
    show_3D_model = False
    get_pointclouds = True
    compute_new_3D_points = True
    dense_cloud = True
    manual_point_selection = False
    save_pcd_point_cloud = False

    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    # vvvvvvvvvvvvvvvvvvvvvvv SETUP vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    data_root = "data"  # The root folder for all data
    if is_synthetic:
        model_type = "synthetic"
    else:
        model_type = "real"
    data_path_prefix = osp.join(data_root, model_type, model_version,
                                experiment_name)
    # For SHOWING OFF: virtual office
    scene_name = "scene"
    scene_path = osp.join(
        data_path_prefix, scene_name
    )  # Pose estimation experiment: Translation on x only by 0, 25 cm and 75 cm (wrt init)
    scene_img_filename_template = osp.join(
        scene_path, "office-*.png")  # With PUBLISHED parameters
    # scene_img_filename_template = osp.join(data_path_prefix, scene_path, "office" + model_version + "-*.png")  # NEW design
    img_indices = [
    ]  # Choosing a predefined set of images to work with out of the set
    img_index = 0  # <<<<<------ Choosing an arbitrary image to work with out of the set

    omnistereo_model_filename = osp.join(data_path_prefix,
                                         "omnistereo-hyperbolic.pkl")
    # ------------------------------------------------
    radial_bounds_filename = osp.join(data_path_prefix, "radial_bounds.pkl")
    # ------------------------------------------------
    points_3D_filename_template = osp.join(
        scene_path, "3d_points-" + model_version + "-*.pkl")

    if get_pointclouds:
        points_3D_filename_template = "3d_points-*.pkl"
        features_detected_filename_template = "sparse_correspondences-*.pkl"
        if dense_cloud:
            points_3D_path = osp.join(scene_path, "cloud_dense")
        else:
            points_3D_path = osp.join(scene_path, "cloud_sparse")
        make_sure_path_exists(points_3D_path)
        stereo_tuner_filename = osp.join(scene_path, "stereo_tuner.pkl")

    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    from omnistereo.common_cv import has_opencv, get_images
    opencv_exists = has_opencv()

    omni_images_list = get_images(scene_img_filename_template,
                                  indices_list=img_indices,
                                  show_images=True)
    # Read params from file and scale to [mm] units since using [cm] (only those params with dimensions)
    theoretical_params_filename = osp.join(
        data_root, "parameters-%s.txt" % (model_version))

    if load_model_from_file:
        omnistereo_model = load_obj_from_pickle(omnistereo_model_filename)
    else:
        # omni_img_filename = scene_img_filename_template.replace("*", str(img_index), 1)
        # omni_img = cv2.imread(omni_img_filename, 1)
        omni_img = omni_images_list[img_index]
        omnistereo_model = init_omnistereo_theoretical(
            omni_img,
            radial_bounds_filename,
            theoretical_params_filename,
            model_version,
            is_synthetic=is_synthetic)
        pano_width = np.pi * np.linalg.norm(
            omnistereo_model.bot_model.lowest_img_point -
            omnistereo_model.bot_model.precalib_params.center_point)
        omnistereo_model.set_current_omni_image(
            omni_img,
            pano_width_in_pixels=pano_width,
            generate_panoramas=True,
            idx=img_index,
            view=True)
        save_obj_in_pickle(omnistereo_model, omnistereo_model_filename,
                           locals())

    #===========================================================================
    # sanity_check(omnistereo_model)
    #===========================================================================

    # Get pixel from pano test
    u, v, m_homo = omnistereo_model.top_model.panorama.get_panorama_pixel_coords_from_direction_angles(
        theta=np.deg2rad([10., 11, 80, -10]),
        psi=np.deg2rad([1, 12., 360, 60]))

    if show_panoramic_img and opencv_exists:
        pano_win_name_prefix = "DEMO - "
        omnistereo_model.view_all_panoramas(
            scene_img_filename_template,
            img_indices,
            win_name_modifier=pano_win_name_prefix,
            use_mask=True,
            mask_color_RGB=(0, 255, 0))

    if show_3D_model:  # Figure 4 (MDPI Sensors journal article)
        try:
            # Drawing forward projection from 3D points:
            xw, yw, zw = 80, 10, 100
            # Pw = [(xw, yw, zw), (-xw, yw, zw), (xw, -yw, zw), (-xw, -yw, zw)]
            Pw = [(xw, yw, zw)]
            from omnistereo.common_plot import draw_fwd_projection_omnistereo
            draw_fwd_projection_omnistereo(omnistereo_model,
                                           Pw,
                                           verbose=True,
                                           fig_size=None)
            plt.show()  # Show both figures in separate windows
        except ImportError:
            print("MPLOT3D could not be imported for 3D visualization!")

            try:
                # NOTE: drawing with visvis and PyQt4 is troublesome when OpenCV is displaying windows that are using Qt5!!!
                # Drawing just the model:
                from omnistereo.common_plot import draw_omnistereo_model_visvis
                draw_omnistereo_model_visvis(omnistereo_model,
                                             finish_drawing=True,
                                             show_grid_box=False,
                                             mirror_transparency=0.5,
                                             show_reference_frame=True)
                # common_plot.draw_model_mono_visvis(omnistereo_model.top_model.theoretical_model, finish_drawing=True, show_grid_box=False, show_reference_frame=True)

            except ImportError:
                print("VISVIS could not be imported for 3D visualization!")
                try:
                    # USING Vispy:
                    from omnistereo.common_plot import draw_omnistereo_model_vispy
                    draw_omnistereo_model_vispy(omnistereo_model,
                                                show_grid=True,
                                                backend='pyqt4')
                except ImportError:
                    print("VISPY could not be imported for 3D visualization!")

    # UNCOMMENT THE FOLLOWING CODE BLOCKS AS DESIRED:
    # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

    #===========================================================================
    # Draw a single mirror's profile in 2D
    # from omnistereo.common_plot import draw_fwd_projection
    # draw_fwd_projection(omnistereo_model.top_model)
    #===========================================================================

    # Drawing backprojected pixels AND covariance ellipsoids
    #===========================================================================
    # # Warning: Don't use anything less than 10 because it will be hard to visualize
    # pixels_to_skew = 0
    # #     delta_pixel = np.array([[65, 40, 20, 10]])
    # delta_pixel = np.array([[75., 47.4, 23.7]])
    # # For example, 1 pixel disparity produces a convergence about 50 m away
    # # whereas, with a disparity of 10 pixels, the diraction rays converge around 2.5 m away (horizontal range).
    # #     m1 = np.array([[[920, cam_mirror1.v_center, 1], [940, cam_mirror1.v_center, 1], [950, cam_mirror1.v_center, 1], [960, cam_mirror1.v_center, 1]]])
    # m1 = np.array([[[920, omnistereo_model.top_model.precalib_params.v_center, 1], [930, omnistereo_model.top_model.precalib_params.v_center, 1], [950, omnistereo_model.top_model.precalib_params.v_center, 1]]])
    # az1, el1 = omnistereo_model.top_model.get_direction_angles_from_pixel(m1)
    # u2, v2, m2_same_el1 = omnistereo_model.bot_model.get_pixel_from_direction_angles(az1, el1)
    # m2 = np.dstack((u2 - delta_pixel, v2 - pixels_to_skew))  # Needs to decrease delta_pixel pixels (disparity) on u2 (only for this example on the u-axis) so the elevation on mirror 2 increases for convergence
    # from omnistereo.common_plot import draw_bak_projection_visvis
    # draw_bak_projection_visvis(omnistereo_model, m1, m2, number_of_std_deviations=1, draw_covariance=True, line_thickness=2, show_grid_box=True, show_labels=False, plot_density_function=False)
    #===========================================================================

    # Drawing a single point backprojected AND its covariance ellipsoids
    #===========================================================================
    #===========================================================================
    # pixels_to_skew = 0
    # delta_pixel = np.array([[150]])
    # m1 = np.array([[[920, omnistereo_model.top_model.precalib_params.v_center, 1]]])
    # az1, el1 = omnistereo_model.top_model.get_direction_angles_from_pixel(m1)
    # m2 = np.dstack((m1[..., 0] - delta_pixel * np.cos(az1), m1[..., 1] - delta_pixel * np.sin(az1) - pixels_to_skew))  # Needs to decrease delta_pixel pixels (disparity) on u2 (only for this example on the u-axis) so the elevation on mirror 2 increases for convergence
    #===========================================================================
    #===========================================================================
    # Using visvis:
    # from omnistereo.common_plot import draw_bak_projection_visvis
    # draw_bak_projection_visvis(omnistereo_model, m1, m2, number_of_std_deviations=1, draw_covariance=True, plot_density_function=True)
    #===========================================================================
    #===========================================================================
    # Using matplotlib only:
    # from omnistereo.common_plot import draw_bak_projection
    # draw_bak_projection(omnistereo_model, m1, m2)
    #===========================================================================

    #===========================================================================
    # # Figure 9 (Sensors Journal article)
    # from omnistereo.common_plot import plot_k_vs_rsys_for_vFOV
    # plot_k_vs_rsys_for_vFOV(omnistereo_model.top_model, fig_size=None)
    #===========================================================================

    #===========================================================================
    # # Figure 10 (Sensors Journal article)
    # from omnistereo.common_plot import plot_k_vs_baseline_for_vFOV
    # plot_k_vs_baseline_for_vFOV(omnistereo_model, fig_size=None)
    #===========================================================================

    #===========================================================================
    # from omnistereo.common_plot import plot_mirror_profiles
    # plot_mirror_profiles(omnistereo_model)
    #===========================================================================

    #===========================================================================
    # # Figure 11 (Sensors Journal article)
    # from omnistereo.common_plot import plot_catadioptric_spatial_resolution_vs_k
    # plot_catadioptric_spatial_resolution_vs_k(omnistereo_model, fig_size=None, legend_location=None)
    #===========================================================================

    # Plotting spatial resolution

    #===========================================================================
    # from omnistereo.common_plot import plot_perspective_camera_spatial_resolution
    # plot_perspective_camera_spatial_resolution(omnistereo_model.top_model.precalib_params, in_2D=True)
    #===========================================================================

    #===========================================================================
    # from omnistereo.common_plot import plot_catadioptric_spatial_resolution_by_BakerNayar
    # plot_catadioptric_spatial_resolution_by_BakerNayar(omnistereo_model)
    #===========================================================================

    #===========================================================================
    # # Figure 12 (Sensors Journal article)
    # from omnistereo.common_plot import plot_catadioptric_spatial_resolution
    # plot_catadioptric_spatial_resolution(omnistereo_model, in_2D=True, eta_max=18, fig_size=None)
    #===========================================================================

    # Range variation:
    #===========================================================================
    # Pns_high = omnistereo_model.get_triangulated_point_wrt_Oc(omnistereo_model.top_model.highest_elevation_angle, omnistereo_model.bot_model.highest_elevation_angle, 0)
    # Pns_mid = omnistereo_model.get_triangulated_point_wrt_Oc(omnistereo_model.top_model.lowest_elevation_angle, omnistereo_model.bot_model.highest_elevation_angle, 0)
    # Pns_low = omnistereo_model.get_triangulated_point_wrt_Oc(omnistereo_model.top_model.lowest_elevation_angle, omnistereo_model.bot_model.lowest_elevation_angle, 0)
    # print(Pns_high, Pns_mid, Pns_low)
    # hor_range_min_for_plot = min(Pns_low[0, 0, 0], Pns_high[0, 0, 0])
    # vert_range_min_for_plot = min(Pns_low[0, 0, 2], Pns_high[0, 0, 2])
    # vert_range_max_for_plot = max(Pns_low[0, 0, 2], Pns_high[0, 0, 2])
    # delta_z_mirror1, z_level_1 = omnistereo_model.top_model.get_vertical_range_variation(hor_range_min_for_plot)
    # delta_rho_mirror1, rho_level_1 = omnistereo_model.top_model.get_horizontal_range_variation(vert_range_min_for_plot)
    # delta_phi_mirror1, phi_level_1 = omnistereo_model.top_model.get_angular_range_variation(150)
    # delta_z_mirror2, z_level_2 = omnistereo_model.bot_model.get_vertical_range_variation(hor_range_min_for_plot)
    # delta_rho_mirror2, rho_level_2 = omnistereo_model.bot_model.get_horizontal_range_variation(vert_range_min_for_plot)
    # delta_phi_mirror2, phi_level_2 = omnistereo_model.bot_model.get_angular_range_variation(150)
    #===========================================================================

    #===========================================================================
    # # Figure 17 (Sensors Journal article)
    # from omnistereo.common_plot import plot_range_variation_due_to_pixel_disparity
    # plot_range_variation_due_to_pixel_disparity(omnistereo_model, disp_min=1, disp_max=100, fig_size=None)
    #===========================================================================

    #===========================================================================
    # from omnistereo.common_plot import plot_effect_of_pixel_disparity_on_range
    # plot_effect_of_pixel_disparity_on_range(omnistereo_model, disp_min=1, disp_max=100, disp_nums=5, use_log=True, plot_zoom=True, fig_size=None)
    #===========================================================================

    #===========================================================================
    # from omnistereo.common_plot import plot_vertical_range_variation
    # plot_vertical_range_variation(omnistereo_model, hor_range_max=30, depth_nums=5, use_meters=True, fig_size=None)
    #===========================================================================

    #===========================================================================
    # from omnistereo.common_plot import plot_horizontal_range_variation
    # plot_horizontal_range_variation(omnistereo_model, vertical_range_min=-500, vertical_range_max=500, depth_nums=5, use_meters=False, fig_size=None)
    #===========================================================================

    plt.show()  # Show both figures in separate windows

    if get_pointclouds:
        stereo_tuner_filename = osp.join(scene_path, "stereo_tuner.pkl")
        from omnistereo.common_plot import compute_pointclouds_simple
        compute_pointclouds_simple(
            omnistereo_model,
            omni_img_filename_template=None,
            img_indices=[img_index],
            compute_new_3D_points=compute_new_3D_points,
            dense_cloud=dense_cloud,
            manual_point_selection=manual_point_selection,
            load_stereo_tuner_from_pickle=True,
            save_pcl=save_pcd_point_cloud,
            points_3D_path=points_3D_path,
            stereo_tuner_filename=stereo_tuner_filename,
            tune_live=False,
            save_sparse_features=False,
            load_sparse_features_from_file=False)

    from omnistereo.common_cv import clean_up
    clean_up(wait_key_time=0)
Exemplo n.º 5
0
def main_sos_vo():
    scene_path = osp.realpath(osp.expanduser(args.results_path[0]))
    gums_calibrated_filename = osp.realpath(
        osp.expanduser(args.calibrated_gums_file))
    visualize_VO = args.visualize_VO

    # HARD-CODED flags:
    # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    use_perfect_model_VO = False  # WARNING: It may be used only when using SYNTHETIC images
    only_visualize_frames_from_existing_VO_poses_file = False  # <<< SETME: Will not run VO if True, but just reload the file from an existing experiment
    # NOTE: For DEBUG, set use_multithreads_for_VO <-- False
    use_multithreads_for_VO = True  # <<< 3D Visualization interactivity (is more responsive) when running the VO as a threads
    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    scene_path_vo_results = osp.join(scene_path,
                                     "results-omni")  # VO Results path
    make_sure_path_exists(scene_path_vo_results)
    vis_name = "LIVE-SOS"
    if only_visualize_frames_from_existing_VO_poses_file:
        from omnistereo.common_plot import replay_VO_visualization
        replay_VO_visualization(scene_path_vo_results=scene_path_vo_results,
                                first_image_index=0,
                                last_image_index=-1,
                                step_for_poses=1,
                                vis_name=vis_name)
    else:
        from omnistereo.pose_est_tools import driver_VO_live
        from omnistereo.webcam_live import WebcamLive, CamAsWorkingThread
        cam = WebcamLive(cam_index=0,
                         mirror_image=False,
                         file_name="",
                         cam_model="BLACKFLY",
                         show_img=True)
        success, omni_frame = cam.get_single_frame()
        # Use camera as a working thread in order to obtain the most recent image from the buffer:
        cam_working_thread = CamAsWorkingThread(cam=cam)

        # Use the thread_name parameter to name the VO Visualization window:
        if use_perfect_model_VO:
            print("Using 'theoretical' model for", vis_name)
            from omnistereo.cata_hyper_model import get_theoretical_OmniStereo
            from omnistereo.common_cv import get_images
            mirror_images = get_images(calib_img_filename_template,
                                       indices_list=[0],
                                       show_images=False,
                                       return_names_only=False)
            use_existing_radial_bounds = True
            hyperbolic_model_theoretical = get_theoretical_OmniStereo(
                omni_img=mirror_images,
                radial_bounds_filename=radial_bounds_filename,
                theoretical_params_filename=theoretical_params_filename,
                model_version=model_version,
                is_synthetic=is_synthetic,
                use_existing_radial_bounds=use_existing_radial_bounds)
            driver_VO_live(camera_model=hyperbolic_model_theoretical,
                           scene_path_vo_results=scene_path_vo_results,
                           cam_working_thread=cam_working_thread,
                           visualize_VO=visualize_VO,
                           use_multithreads_for_VO=use_multithreads_for_VO,
                           thread_name=vis_name)
        else:
            # Attempting to just load the calibrated GUMS model
            gums_calibrated = load_obj_from_pickle(gums_calibrated_filename)
            driver_VO_live(camera_model=gums_calibrated,
                           scene_path_vo_results=scene_path_vo_results,
                           cam_working_thread=cam_working_thread,
                           visualize_VO=visualize_VO,
                           use_multithreads_for_VO=use_multithreads_for_VO,
                           thread_name=vis_name)

    from omnistereo.common_cv import clean_up
    clean_up(wait_key_time=1)
    print("GOODBYE!")
def main_demo():
    is_synthetic = True
    model_version = "old"  # Set to "old" for the PUBLISHED params, or "new" for the new one
    experiment_name = (
        "simple"
    )  # "simple", "VICON", "CVPR", "with_misalignment-4", etc.  # <<<<<- SET For example, "VICON" uses ground truth data, otherwise use "simple"

    # HYPERBOLIC Parameters (Used in Publication):
    # ===========================================================================
    # k1 = 5.7319  # Unitless
    # k2 = 9.7443  # Unitless
    # Using millimeters
    # r_sys = 37.0
    # r_reflex = 17.226
    # r_cam = 7.25
    # c1 = 123.488
    # c2 = 241.803
    # d = 233.684
    # ===========================================================================
    # vvvvvvvvvvvvvvvvvvvvvvv OPTIONS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    load_model_from_file = True  # <<< SETME: to load omnistereo model from a pickle or start anew
    show_panoramic_img = True
    show_3D_model = False
    get_pointclouds = True
    compute_new_3D_points = True
    dense_cloud = True
    manual_point_selection = False
    save_pcd_point_cloud = False

    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    # vvvvvvvvvvvvvvvvvvvvvvv SETUP vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    data_root = "data"  # The root folder for all data
    if is_synthetic:
        model_type = "synthetic"
    else:
        model_type = "real"
    data_path_prefix = osp.join(data_root, model_type, model_version, experiment_name)
    # For SHOWING OFF: virtual office
    scene_name = "scene"
    scene_path = osp.join(
        data_path_prefix, scene_name
    )  # Pose estimation experiment: Translation on x only by 0, 25 cm and 75 cm (wrt init)
    scene_img_filename_template = osp.join(scene_path, "office-*.png")  # With PUBLISHED parameters
    # scene_img_filename_template = osp.join(data_path_prefix, scene_path, "office" + model_version + "-*.png")  # NEW design
    img_indices = []  # Choosing a predefined set of images to work with out of the set
    img_index = 0  # <<<<<------ Choosing an arbitrary image to work with out of the set

    omnistereo_model_filename = osp.join(data_path_prefix, "omnistereo-hyperbolic.pkl")
    # ------------------------------------------------
    radial_bounds_filename = osp.join(data_path_prefix, "radial_bounds.pkl")
    # ------------------------------------------------
    points_3D_filename_template = osp.join(scene_path, "3d_points-" + model_version + "-*.pkl")

    if get_pointclouds:
        points_3D_filename_template = "3d_points-*.pkl"
        features_detected_filename_template = "sparse_correspondences-*.pkl"
        if dense_cloud:
            points_3D_path = osp.join(scene_path, "cloud_dense")
        else:
            points_3D_path = osp.join(scene_path, "cloud_sparse")
        make_sure_path_exists(points_3D_path)
        stereo_tuner_filename = osp.join(scene_path, "stereo_tuner.pkl")

    # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    from omnistereo.common_cv import has_opencv, get_images

    opencv_exists = has_opencv()

    omni_images_list = get_images(scene_img_filename_template, indices_list=img_indices, show_images=True)
    # Read params from file and scale to [mm] units since using [cm] (only those params with dimensions)
    theoretical_params_filename = osp.join(data_root, "parameters-%s.txt" % (model_version))

    if load_model_from_file:
        omnistereo_model = load_obj_from_pickle(omnistereo_model_filename)
    else:
        # omni_img_filename = scene_img_filename_template.replace("*", str(img_index), 1)
        # omni_img = cv2.imread(omni_img_filename, 1)
        omni_img = omni_images_list[img_index]
        omnistereo_model = init_omnistereo_theoretical(
            omni_img, radial_bounds_filename, theoretical_params_filename, model_version, is_synthetic=is_synthetic
        )
        pano_width = np.pi * np.linalg.norm(
            omnistereo_model.bot_model.lowest_img_point - omnistereo_model.bot_model.precalib_params.center_point
        )
        omnistereo_model.set_current_omni_image(
            omni_img, pano_width_in_pixels=pano_width, generate_panoramas=True, idx=img_index, view=True
        )
        save_obj_in_pickle(omnistereo_model, omnistereo_model_filename, locals())

    # ===========================================================================
    # sanity_check(omnistereo_model)
    # ===========================================================================

    # Get pixel from pano test
    u, v, m_homo = omnistereo_model.top_model.panorama.get_panorama_pixel_coords_from_direction_angles(
        theta=np.deg2rad([10.0, 11, 80, -10]), psi=np.deg2rad([1, 12.0, 360, 60])
    )

    if show_panoramic_img and opencv_exists:
        pano_win_name_prefix = "DEMO - "
        omnistereo_model.view_all_panoramas(
            scene_img_filename_template,
            img_indices,
            win_name_modifier=pano_win_name_prefix,
            use_mask=True,
            mask_color_RGB=(0, 255, 0),
        )

    if show_3D_model:  # Figure 4 (MDPI Sensors journal article)
        try:
            # Drawing forward projection from 3D points:
            xw, yw, zw = 80, 10, 100
            # Pw = [(xw, yw, zw), (-xw, yw, zw), (xw, -yw, zw), (-xw, -yw, zw)]
            Pw = [(xw, yw, zw)]
            from omnistereo.common_plot import draw_fwd_projection_omnistereo

            draw_fwd_projection_omnistereo(omnistereo_model, Pw, verbose=True, fig_size=None)
            plt.show()  # Show both figures in separate windows
        except ImportError:
            print("MPLOT3D could not be imported for 3D visualization!")

            try:
                # NOTE: drawing with visvis and PyQt4 is troublesome when OpenCV is displaying windows that are using Qt5!!!
                # Drawing just the model:
                from omnistereo.common_plot import draw_omnistereo_model_visvis

                draw_omnistereo_model_visvis(
                    omnistereo_model,
                    finish_drawing=True,
                    show_grid_box=False,
                    mirror_transparency=0.5,
                    show_reference_frame=True,
                )
                # common_plot.draw_model_mono_visvis(omnistereo_model.top_model.theoretical_model, finish_drawing=True, show_grid_box=False, show_reference_frame=True)

            except ImportError:
                print("VISVIS could not be imported for 3D visualization!")
                try:
                    # USING Vispy:
                    from omnistereo.common_plot import draw_omnistereo_model_vispy

                    draw_omnistereo_model_vispy(omnistereo_model, show_grid=True, backend="pyqt4")
                except ImportError:
                    print("VISPY could not be imported for 3D visualization!")

    # UNCOMMENT THE FOLLOWING CODE BLOCKS AS DESIRED:
    # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

    # ===========================================================================
    # Draw a single mirror's profile in 2D
    # from omnistereo.common_plot import draw_fwd_projection
    # draw_fwd_projection(omnistereo_model.top_model)
    # ===========================================================================

    # Drawing backprojected pixels AND covariance ellipsoids
    # ===========================================================================
    # # Warning: Don't use anything less than 10 because it will be hard to visualize
    # pixels_to_skew = 0
    # #     delta_pixel = np.array([[65, 40, 20, 10]])
    # delta_pixel = np.array([[75., 47.4, 23.7]])
    # # For example, 1 pixel disparity produces a convergence about 50 m away
    # # whereas, with a disparity of 10 pixels, the diraction rays converge around 2.5 m away (horizontal range).
    # #     m1 = np.array([[[920, cam_mirror1.v_center, 1], [940, cam_mirror1.v_center, 1], [950, cam_mirror1.v_center, 1], [960, cam_mirror1.v_center, 1]]])
    # m1 = np.array([[[920, omnistereo_model.top_model.precalib_params.v_center, 1], [930, omnistereo_model.top_model.precalib_params.v_center, 1], [950, omnistereo_model.top_model.precalib_params.v_center, 1]]])
    # az1, el1 = omnistereo_model.top_model.get_direction_angles_from_pixel(m1)
    # u2, v2, m2_same_el1 = omnistereo_model.bot_model.get_pixel_from_direction_angles(az1, el1)
    # m2 = np.dstack((u2 - delta_pixel, v2 - pixels_to_skew))  # Needs to decrease delta_pixel pixels (disparity) on u2 (only for this example on the u-axis) so the elevation on mirror 2 increases for convergence
    # from omnistereo.common_plot import draw_bak_projection_visvis
    # draw_bak_projection_visvis(omnistereo_model, m1, m2, number_of_std_deviations=1, draw_covariance=True, line_thickness=2, show_grid_box=True, show_labels=False, plot_density_function=False)
    # ===========================================================================

    # Drawing a single point backprojected AND its covariance ellipsoids
    # ===========================================================================
    # ===========================================================================
    # pixels_to_skew = 0
    # delta_pixel = np.array([[150]])
    # m1 = np.array([[[920, omnistereo_model.top_model.precalib_params.v_center, 1]]])
    # az1, el1 = omnistereo_model.top_model.get_direction_angles_from_pixel(m1)
    # m2 = np.dstack((m1[..., 0] - delta_pixel * np.cos(az1), m1[..., 1] - delta_pixel * np.sin(az1) - pixels_to_skew))  # Needs to decrease delta_pixel pixels (disparity) on u2 (only for this example on the u-axis) so the elevation on mirror 2 increases for convergence
    # ===========================================================================
    # ===========================================================================
    # Using visvis:
    # from omnistereo.common_plot import draw_bak_projection_visvis
    # draw_bak_projection_visvis(omnistereo_model, m1, m2, number_of_std_deviations=1, draw_covariance=True, plot_density_function=True)
    # ===========================================================================
    # ===========================================================================
    # Using matplotlib only:
    # from omnistereo.common_plot import draw_bak_projection
    # draw_bak_projection(omnistereo_model, m1, m2)
    # ===========================================================================

    # ===========================================================================
    # # Figure 9 (Sensors Journal article)
    # from omnistereo.common_plot import plot_k_vs_rsys_for_vFOV
    # plot_k_vs_rsys_for_vFOV(omnistereo_model.top_model, fig_size=None)
    # ===========================================================================

    # ===========================================================================
    # # Figure 10 (Sensors Journal article)
    # from omnistereo.common_plot import plot_k_vs_baseline_for_vFOV
    # plot_k_vs_baseline_for_vFOV(omnistereo_model, fig_size=None)
    # ===========================================================================

    # ===========================================================================
    # from omnistereo.common_plot import plot_mirror_profiles
    # plot_mirror_profiles(omnistereo_model)
    # ===========================================================================

    # ===========================================================================
    # # Figure 11 (Sensors Journal article)
    # from omnistereo.common_plot import plot_catadioptric_spatial_resolution_vs_k
    # plot_catadioptric_spatial_resolution_vs_k(omnistereo_model, fig_size=None, legend_location=None)
    # ===========================================================================

    # Plotting spatial resolution

    # ===========================================================================
    # from omnistereo.common_plot import plot_perspective_camera_spatial_resolution
    # plot_perspective_camera_spatial_resolution(omnistereo_model.top_model.precalib_params, in_2D=True)
    # ===========================================================================

    # ===========================================================================
    # from omnistereo.common_plot import plot_catadioptric_spatial_resolution_by_BakerNayar
    # plot_catadioptric_spatial_resolution_by_BakerNayar(omnistereo_model)
    # ===========================================================================

    # ===========================================================================
    # # Figure 12 (Sensors Journal article)
    # from omnistereo.common_plot import plot_catadioptric_spatial_resolution
    # plot_catadioptric_spatial_resolution(omnistereo_model, in_2D=True, eta_max=18, fig_size=None)
    # ===========================================================================

    # Range variation:
    # ===========================================================================
    # Pns_high = omnistereo_model.get_triangulated_point_wrt_Oc(omnistereo_model.top_model.highest_elevation_angle, omnistereo_model.bot_model.highest_elevation_angle, 0)
    # Pns_mid = omnistereo_model.get_triangulated_point_wrt_Oc(omnistereo_model.top_model.lowest_elevation_angle, omnistereo_model.bot_model.highest_elevation_angle, 0)
    # Pns_low = omnistereo_model.get_triangulated_point_wrt_Oc(omnistereo_model.top_model.lowest_elevation_angle, omnistereo_model.bot_model.lowest_elevation_angle, 0)
    # print(Pns_high, Pns_mid, Pns_low)
    # hor_range_min_for_plot = min(Pns_low[0, 0, 0], Pns_high[0, 0, 0])
    # vert_range_min_for_plot = min(Pns_low[0, 0, 2], Pns_high[0, 0, 2])
    # vert_range_max_for_plot = max(Pns_low[0, 0, 2], Pns_high[0, 0, 2])
    # delta_z_mirror1, z_level_1 = omnistereo_model.top_model.get_vertical_range_variation(hor_range_min_for_plot)
    # delta_rho_mirror1, rho_level_1 = omnistereo_model.top_model.get_horizontal_range_variation(vert_range_min_for_plot)
    # delta_phi_mirror1, phi_level_1 = omnistereo_model.top_model.get_angular_range_variation(150)
    # delta_z_mirror2, z_level_2 = omnistereo_model.bot_model.get_vertical_range_variation(hor_range_min_for_plot)
    # delta_rho_mirror2, rho_level_2 = omnistereo_model.bot_model.get_horizontal_range_variation(vert_range_min_for_plot)
    # delta_phi_mirror2, phi_level_2 = omnistereo_model.bot_model.get_angular_range_variation(150)
    # ===========================================================================

    # ===========================================================================
    # # Figure 17 (Sensors Journal article)
    # from omnistereo.common_plot import plot_range_variation_due_to_pixel_disparity
    # plot_range_variation_due_to_pixel_disparity(omnistereo_model, disp_min=1, disp_max=100, fig_size=None)
    # ===========================================================================

    # ===========================================================================
    # from omnistereo.common_plot import plot_effect_of_pixel_disparity_on_range
    # plot_effect_of_pixel_disparity_on_range(omnistereo_model, disp_min=1, disp_max=100, disp_nums=5, use_log=True, plot_zoom=True, fig_size=None)
    # ===========================================================================

    # ===========================================================================
    # from omnistereo.common_plot import plot_vertical_range_variation
    # plot_vertical_range_variation(omnistereo_model, hor_range_max=30, depth_nums=5, use_meters=True, fig_size=None)
    # ===========================================================================

    # ===========================================================================
    # from omnistereo.common_plot import plot_horizontal_range_variation
    # plot_horizontal_range_variation(omnistereo_model, vertical_range_min=-500, vertical_range_max=500, depth_nums=5, use_meters=False, fig_size=None)
    # ===========================================================================

    plt.show()  # Show both figures in separate windows

    if get_pointclouds:
        stereo_tuner_filename = osp.join(scene_path, "stereo_tuner.pkl")
        from omnistereo.common_plot import compute_pointclouds_simple

        compute_pointclouds_simple(
            omnistereo_model,
            omni_img_filename_template=None,
            img_indices=[img_index],
            compute_new_3D_points=compute_new_3D_points,
            dense_cloud=dense_cloud,
            manual_point_selection=manual_point_selection,
            load_stereo_tuner_from_pickle=True,
            save_pcl=save_pcd_point_cloud,
            points_3D_path=points_3D_path,
            stereo_tuner_filename=stereo_tuner_filename,
            tune_live=False,
            save_sparse_features=False,
            load_sparse_features_from_file=False,
        )

    from omnistereo.common_cv import clean_up

    clean_up(wait_key_time=0)