Пример #1
0
           Anton Sobinov
lab: Sliman Bensmaia
"""

# %% 0 Imports
import os

import ncams

BASE_DIR = os.path.join('C:\\', 'FLIR_cameras', 'PublicExample')

# %% 1 Load camera_config
# Works if calibration and pose estimation has been done before and saved
cdatetime = '2019.12.09_16.23.02'
camera_config_dir = os.path.join(BASE_DIR, 'camconf_' + cdatetime)
camera_config = ncams.yaml_to_config(
    os.path.join(camera_config_dir, 'config.yaml'))

# %% 2 Run the multi-calibration on all cameras
calibration_config = ncams.multi_camera_calibration(camera_config,
                                                    inspect=True)

# export to disk
ncams.export_calibration(calibration_config)

# %% 3 Do the pose estimation
pose_estimation_config = ncams.camera_pose.one_shot_multi_PnP(
    camera_config, calibration_config)

# Does it look okay?
ncams.camera_pose.plot_poses(pose_estimation_config)
Пример #2
0
def main():
    cdatetime = '2019.12.19_10.38.38'
    camera_config_dir = os.path.join(BASE_DIR, 'camconf_' + cdatetime)
    camera_config = ncams.yaml_to_config(
        os.path.join(camera_config_dir, 'config.yaml'))

    calibration_config, pose_estimation_config = ncams.load_camera_config(
        camera_config)

    session_shortnames = (
        'exp_session_2019.12.20_09.49.42_AS_CMG_1',
        'exp_session_2019.12.20_09.56.37_AS_CMG_2',
        'exp_session_2019.12.20_09.57.31_AS_CMG_3',
        'exp_session_2019.12.20_09.58.36_AS_CMG_4',
        'exp_session_2019.12.20_10.09.44_AS_CMG_5',
        'exp_session_2019.12.20_10.16.13_AS_CMG_6',
        'exp_session_2019.12.20_10.34.40_AS_CMG_7',
        'exp_session_2019.12.20_10.39.45_AS_CMG_8',
        'exp_session_2019.12.20_10.45.01_AS_CMG_9',
        'exp_session_2019.12.20_10.51.06_AS_CMG_10',
        'exp_session_2019.12.20_11.11.21_AS_CMG_11',
        'exp_session_2019.12.20_11.17.24_AS_CMG_12',
        'exp_session_2019.12.20_11.21.52_AS_CMG_13',
    )

    for session_shortname in session_shortnames:
        print('Processing session {}'.format(session_shortname))
        session_full_filename = os.path.join(BASE_DIR, session_shortname,
                                             'session_config.yaml')
        session_config = ncams.import_session_config(session_full_filename)

        session_config['video_path'] = 'videos'
        session_config['ud_video_path'] = 'undistorted_videos'

        for p in (os.path.join(session_config['session_path'],
                               session_config['video_path']),
                  os.path.join(session_config['session_path'],
                               session_config['ud_video_path'])):
            if not os.path.isdir(p):
                print('Making dir {}'.format(p))
                os.mkdir(p)

        for serial in camera_config['serials']:
            session_config['cam_dicts'][serial]['pic_dir'] = session_config[
                'cam_dicts'][serial]['name']
            session_config['cam_dicts'][serial]['video'] = os.path.join(
                session_config['video_path'],
                session_config['cam_dicts'][serial]['name'] + '.mp4')
            session_config['cam_dicts'][serial]['ud_video'] = os.path.join(
                session_config['ud_video_path'],
                session_config['cam_dicts'][serial]['name'] + '.mp4')

        for cam_dict in session_config['cam_dicts'].values():
            image_list = ncams.utils.get_image_list(
                sort=True,
                path=os.path.join(session_config['session_path'],
                                  cam_dict['pic_dir']))
            print('\tMaking a video for camera {} from {} images.'.format(
                cam_dict['name'], len(image_list)))
            ncams.images_to_video(image_list,
                                  cam_dict['video'],
                                  fps=session_config['frame_rate'],
                                  output_folder=session_config['session_path'])

        for icam, serial in enumerate(camera_config['serials']):
            cam_dict = session_config['cam_dicts'][serial]
            ncams.undistort_video(os.path.join(session_config['session_path'],
                                               cam_dict['video']),
                                  calibration_config['dicts'][serial],
                                  crop_and_resize=False,
                                  output_filename=os.path.join(
                                      session_config['session_path'],
                                      cam_dict['ud_video']))
            print('\tCamera {} video undistorted.'.format(cam_dict['name']))

        ncams.export_session_config(session_config)
Пример #3
0
def main():
    cdatetime = '2019.12.19_10.38.38'
    camera_config_dir = os.path.join(BASE_DIR, 'camconf_' + cdatetime)
    camera_config = ncams.yaml_to_config(
        os.path.join(camera_config_dir, 'config.yaml'))

    calibration_config, pose_estimation_config = ncams.load_camera_config(
        camera_config)

    # #  Load a session config from a file
    # session_full_filename = os.path.join(BASE_DIR, 'exp_session_2019.12.09_16.40.45_AS_CMG_2',
    #                                      'session_config.yaml')
    # session_config = ncams.import_session_config(session_full_filename)

    # %% 2b Load an existing DLC project with the labeled frames
    dlc_prj_name = '2019.12.20_8camsNoMarkers'
    scorer = 'AS'
    prj_date = '2019-12-23'
    dlc_proj_name = '-'.join([dlc_prj_name, scorer, prj_date])
    proj_path = os.path.join(BASE_DIR, dlc_proj_name)
    config_path = os.path.join(proj_path, 'config.yaml')

    print('Existing config_path: "{}"'.format(config_path))

    labeled_csv_path = os.path.join(proj_path, 'labeled_videos')
    if not os.path.isdir(labeled_csv_path):
        os.mkdir(labeled_csv_path)

    # print('training network')
    # deeplabcut.train_network(config_path, gputouse=0, saveiters=100, maxiters=250000,
    #                          displayiters=10)

    # print('Evaluating network...')
    # deeplabcut.evaluate_network(config_path, plotting=False)

    # which videos do you want to train on?
    video_path = os.path.join(BASE_DIR, 'exp_session_2019.12.20_videos')
    training_videos = [
        os.path.join(video_path, fname)
        for fname in ('4_cam19194005.mp4', '4_cam19194008.mp4',
                      '4_cam19194009.mp4', '4_cam19194013.mp4',
                      '4_cam19335177.mp4', '4_cam19340298.mp4',
                      '4_cam19340300.mp4', '4_cam19340396.mp4',
                      '5_cam19194005.mp4', '5_cam19194008.mp4',
                      '5_cam19194009.mp4', '5_cam19194013.mp4',
                      '5_cam19335177.mp4', '5_cam19340298.mp4',
                      '5_cam19340300.mp4', '5_cam19340396.mp4',
                      '6_cam19194005.mp4', '6_cam19194008.mp4',
                      '6_cam19194009.mp4', '6_cam19194013.mp4',
                      '6_cam19335177.mp4', '6_cam19340298.mp4',
                      '6_cam19340300.mp4', '6_cam19340396.mp4')
    ]
    # print('analyzing videos')
    # deeplabcut.analyze_videos(config_path, training_videos,
    #                           gputouse=0, save_as_csv=True, destfolder=labeled_csv_path)

    # print('making labeled videos')
    # deeplabcut.create_labeled_video(config_path, training_videos, destfolder=labeled_csv_path,
    #                                 draw_skeleton=True)

    # %% 3 Triangulation from multiple cameras
    method = 'full_rank'
    threshold = 0.9
    triangulated_path = os.path.join(
        proj_path, 'triangulated_{}_{}'.format(method, threshold))
    if not os.path.exists(triangulated_path):
        os.mkdir(triangulated_path)

    # make all videos
    # file_prefixes = ['4', '5', '6']
    # for file_prefix in file_prefixes:
    #     print('Working on session {}'.format(file_prefix))
    #     triangulated_path2 = os.path.join(triangulated_path, 'session{}'.format(file_prefix))
    #     triangulated_csv = os.path.join(triangulated_path2, 'triangulated_points{}.csv'.format(
    #         '' if len(file_prefix) == 0 else '_'+file_prefix))
    #     triangulated_csv_p = os.path.join(
    #         triangulated_path2, 'triangulated_points{}_smoothed.csv'.format(
    #             '' if len(file_prefix) == 0 else '_'+file_prefix))

    #     # ncams.triangulate(
    #     #     camera_config, triangulated_csv, calibration_config, pose_estimation_config, labeled_csv_path,
    #     #     threshold=threshold, method=method, undistorted_data=True, file_prefix=file_prefix)

    #     # ncams.process_triangulated_data(triangulated_csv, output_csv=triangulated_csv_p)

    #     # videos = [i for i in training_videos if ntpath.basename(i)[0] == file_prefix]

    #     # # %% 4 Make markered videos
    #     # ncams.make_triangulation_videos(camera_config, camera_config['serials'], videos,
    #     #                                 triangulated_csv_p, skeleton_config=config_path)

    #     # %% 5 Interactive demonstration with a slider
    #     # ncams.reconstruction.interactive_3d_plot(
    #     #     camera_config['serials'][0], camera_config, session_config, triangulated_csv,
    #     #     num_frames_limit=None)

    # make 1 pretty one
    file_prefix = '4'
    print('Working on session {}'.format(file_prefix))
    triangulated_path2 = os.path.join(triangulated_path,
                                      'session{}'.format(file_prefix))
    triangulated_csv_p = os.path.join(
        triangulated_path2, 'triangulated_points{}_smoothed.csv'.format(
            '' if len(file_prefix) == 0 else '_' + file_prefix))

    serial = 19335177
    frame_range = (260, 360)
    video_path = [
        i for i in training_videos
        if ntpath.basename(i)[0] == file_prefix and str(serial) in i
    ][0]
    output_path = os.path.join(triangulated_path2,
                               'pretty_{}_{}.mp4'.format(serial, file_prefix))
    ik_video_path = os.path.join(proj_path, 'ik_videos', 'marshmallow.webm')
    ncams.make_triangulation_video(
        video_path,
        triangulated_csv_p,
        skeleton_config=config_path,
        frame_range=frame_range,
        output_path=output_path,
        thrd_video_path=ik_video_path,
        thrd_video_frame_offset=0,
        third_video_crop_hw=[slice(50, -100),
                             slice(350, -700)],
        figure_dpi=300,
        ranges=((-0.33, 3), (-2, 2), (-1.33, 6.74)))