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)
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)
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)))