#!/usr/bin/env python import argparse import bisect import os from argaze import GazeFeatures from argaze.TobiiGlassesPro2 import TobiiEntities def main(): """ Analyse Tobii segment fixations """ # manage arguments parser = argparse.ArgumentParser(description=main.__doc__.split('-')[0]) parser.add_argument('-s', '--segment_path', metavar='SEGMENT_PATH', type=str, default=None, help='segment path') parser.add_argument('-d', '--dispersion_threshold', metavar='DISPERSION_THRESHOLD', type=int, default=10, help='dispersion threshold in pixel') parser.add_argument('-t', '--duration_threshold', metavar='DURATION_THRESHOLD', type=int, default=100, help='duration threshold in millisecond') parser.add_argument('-o', '--output', metavar='OUT', type=str, default=None, help='destination path (segment folder by default)') args = parser.parse_args() if args.segment_path != None: # manage destination path if not os.path.exists(os.path.dirname(args.output)): os.makedirs(os.path.dirname(args.output)) print(f'{os.path.dirname(args.output)} folder created') # Load a tobii segment tobii_segment = TobiiEntities.TobiiSegment(args.segment_path) # Load a tobii segment video tobii_segment_video = tobii_segment.load_video() print(f'Video duration: {tobii_segment_video.get_duration()}, frame number: {tobii_segment_video.get_frame_number()}, width: {tobii_segment_video.get_width()}, height: {tobii_segment_video.get_height()}') # Load a tobii segment data tobii_segment_data = tobii_segment.load_data() print(f'Data keys: {tobii_segment_data.keys()}') # Access to timestamped gaze position data buffer tobii_ts_gaze_positions = tobii_segment_data.gidx_l_gp print(f'{len(tobii_ts_gaze_positions)} gaze positions loaded') # Access to video timestamp index tobii_vts = tobii_segment_data.vts print(f'{len(tobii_vts)} video timestamps loaded') # Format tobii gaze data into generic gaze data and store them using millisecond unit timestamp generic_ts_gaze_positions = GazeFeatures.TimeStampedGazePositions() for ts, tobii_data in tobii_ts_gaze_positions.items(): generic_data = GazeFeatures.GazePosition(tobii_data.gp[0] * tobii_segment_video.get_width(), tobii_data.gp[1] * tobii_segment_video.get_height()) generic_ts_gaze_positions[ts/1000] = generic_data print(f'Dispersion threshold: {args.dispersion_threshold}') print(f'Duration threshold: {args.duration_threshold}') fixation_analyser = GazeFeatures.DispersionBasedFixationIdentifier(generic_ts_gaze_positions, args.dispersion_threshold, args.duration_threshold) print(f'{len(fixation_analyser.fixations)} fixations found') # Export fixations analysis results if args.output != None: fixations_filepath = args.output else: fixations_filepath = f'{args.segment_path}/fixations.json' fixation_analyser.fixations.export_as_json(fixations_filepath) print(f'Fixations saved into {fixations_filepath}') if __name__ == '__main__': main()