@@ -34,6 +34,7 @@ class FunscriptGeneratorParameter:
3434 start_frame : int
3535 end_frame : int = - 1 # default is video end (-1)
3636 number_of_trackers : int = 1
37+ supervised_tracking_is_exit_condition : bool = True
3738
3839 # Settings
3940 points : str = "local_min_max"
@@ -392,35 +393,91 @@ def init_trackers(self, ffmpeg_stream: FFmpegStream) -> tuple:
392393 first_frame = ffmpeg_stream .read ()
393394 preview_frame = first_frame
394395 for tracker_number in range (self .params .number_of_trackers ):
395- bbox_woman = self .ui .bbox_selector (preview_frame , "Select {} Feature #{}" .format (self .get_target_name (0 ), tracker_number + 1 ))
396- preview_frame = self .ui .draw_box_to_image (preview_frame , bbox_woman , color = (255 ,0 ,255 ))
396+ bbox_woman = self .ui .bbox_selector (
397+ preview_frame ,
398+ "Select {} Feature #{}" .format (self .get_target_name (0 ), tracker_number + 1 )
399+ )
400+
401+ preview_frame = self .ui .draw_box_to_image (
402+ preview_frame ,
403+ bbox_woman ,
404+ color = (255 ,0 ,255 )
405+ )
406+
397407 if self .params .supervised_tracking :
398408 while True :
399- tracking_areas_woman [tracker_number ] = self .ui .bbox_selector (preview_frame , "Select the Supervised Tracking Area for the {} Feature #{}" .format (self .get_target_name (0 ), tracker_number + 1 ))
400- if StaticVideoTracker .is_bbox_in_tracking_area (bbox_woman , tracking_areas_woman [tracker_number ]): break
409+ tracking_areas_woman [tracker_number ] = self .ui .bbox_selector (
410+ preview_frame ,
411+ "Select the Supervised Tracking Area for the {} Feature #{}" .format (self .get_target_name (0 ), tracker_number + 1 )
412+ )
413+
414+ if StaticVideoTracker .is_bbox_in_tracking_area (bbox_woman , tracking_areas_woman [tracker_number ]):
415+ break
416+
401417 self .logger .error ("Invalid supervised tracking area selected" )
402- preview_frame = self .ui .draw_box_to_image (preview_frame , tracking_areas_woman [tracker_number ], color = (0 ,255 ,0 ))
403- trackers_woman [tracker_number ] = StaticVideoTracker (first_frame , bbox_woman , self .video_info .fps , supervised_tracking_area = tracking_areas_woman [tracker_number ])
418+
419+ preview_frame = self .ui .draw_box_to_image (
420+ preview_frame ,
421+ tracking_areas_woman [tracker_number ],
422+ color = (0 ,255 ,0 )
423+ )
424+
425+ trackers_woman [tracker_number ] = StaticVideoTracker (
426+ first_frame ,
427+ bbox_woman ,
428+ self .video_info .fps ,
429+ supervised_tracking_area = tracking_areas_woman [tracker_number ],
430+ supervised_tracking_is_exit_condition = self .params .supervised_tracking_is_exit_condition
431+ )
404432 else :
405- trackers_woman [tracker_number ] = StaticVideoTracker (first_frame , bbox_woman , self .video_info .fps )
433+ trackers_woman [tracker_number ] = StaticVideoTracker (
434+ first_frame ,
435+ bbox_woman ,
436+ self .video_info .fps
437+ )
406438
407439 if tracker_number == 0 :
408440 bboxes ['Woman' ][1 ] = { tracker_number : bbox_woman }
409441 else :
410442 bboxes ['Woman' ][1 ][tracker_number ] = bbox_woman
411443
412444 if self .params .track_men :
413- bbox_men = self .ui .bbox_selector (preview_frame , "Select {} Feature #{}" .format (self .get_target_name (1 ), tracker_number + 1 ))
445+ bbox_men = self .ui .bbox_selector (
446+ preview_frame ,
447+ "Select {} Feature #{}" .format (self .get_target_name (1 ), tracker_number + 1 )
448+ )
414449 preview_frame = self .ui .draw_box_to_image (preview_frame , bbox_men , color = (255 ,0 ,255 ))
415450 if self .params .supervised_tracking :
416451 while True :
417- tracking_areas_men [tracker_number ] = self .ui .bbox_selector (preview_frame , "Select the Supervised Tracking Area for the {} Feature #{}" .format (self .get_target_name (1 ), tracker_number + 1 ))
418- if StaticVideoTracker .is_bbox_in_tracking_area (bbox_men , tracking_areas_men [tracker_number ]): break
452+ tracking_areas_men [tracker_number ] = self .ui .bbox_selector (
453+ preview_frame ,
454+ "Select the Supervised Tracking Area for the {} Feature #{}" .format (self .get_target_name (1 ), tracker_number + 1 )
455+ )
456+
457+ if StaticVideoTracker .is_bbox_in_tracking_area (bbox_men , tracking_areas_men [tracker_number ]):
458+ break
459+
419460 self .logger .error ("Invalid supervised tracking area selected" )
420- preview_frame = self .ui .draw_box_to_image (preview_frame , tracking_areas_men [tracker_number ], color = (255 ,0 ,255 ))
421- trackers_men [tracker_number ] = StaticVideoTracker (first_frame , bbox_men , self .video_info .fps , supervised_tracking_area = tracking_areas_men [tracker_number ])
461+
462+ preview_frame = self .ui .draw_box_to_image (
463+ preview_frame ,
464+ tracking_areas_men [tracker_number ],
465+ color = (255 ,0 ,255 )
466+ )
467+
468+ trackers_men [tracker_number ] = StaticVideoTracker (
469+ first_frame ,
470+ bbox_men ,
471+ self .video_info .fps ,
472+ supervised_tracking_area = tracking_areas_men [tracker_number ],
473+ supervised_tracking_is_exit_condition = self .params .supervised_tracking_is_exit_condition
474+ )
422475 else :
423- trackers_men [tracker_number ] = StaticVideoTracker (first_frame , bbox_men , self .video_info .fps )
476+ trackers_men [tracker_number ] = StaticVideoTracker (
477+ first_frame ,
478+ bbox_men ,
479+ self .video_info .fps
480+ )
424481
425482 if tracker_number == 0 :
426483 bboxes ['Men' ][1 ] = { tracker_number : bbox_men }
@@ -434,7 +491,7 @@ def tracking(self) -> str:
434491 """ Tracking function to track the features in the video
435492
436493 TODO:
437- Tracking lost for multiple tracker
494+ bring back Tracking lost function
438495
439496 Returns:
440497 str: a process status message e.g. 'end of video reached'
@@ -513,7 +570,6 @@ def tracking(self) -> str:
513570 boxes_to_draw .append (tracking_areas_men [tracker_number ])
514571
515572
516-
517573 scene_change_quit_flag = False
518574 if scene_detector .is_scene_change (frame_num - 1 + self .params .start_frame ):
519575 self .logger .info ("Scene change detected, Pause tracking" )
@@ -615,16 +671,14 @@ def finished(self, status: str, success :bool) -> None:
615671 self .funscriptCompleted .emit (self .funscript , status , success )
616672
617673
618- def apply_shift (self , frame_number : int , metric : str , position : str ) -> int :
619- """ Apply shift to predicted frame positions
674+ def get_absolute_framenumber (self , frame_number : int ) -> int :
675+ """ Get the absoulte frame number
620676
621677 Args:
622678 frame_number (int): relative frame number
623- metric (str): metric to apply the shift
624- position (str): keyword ['max', 'min', 'None']
625679
626680 Returns:
627- int: real frame position
681+ int: absolute frame position
628682 """
629683 return self .params .start_frame + frame_number
630684
@@ -709,7 +763,7 @@ def create_funscript(self, idx_dict: dict) -> None:
709763 for idx in range (len (output_score )):
710764 self .funscript .add_action (
711765 output_score [idx ],
712- FFmpegStream .frame_to_millisec (self .apply_shift (idx , self . params . metric , 'None' ), self .video_info .fps )
766+ FFmpegStream .frame_to_millisec (self .get_absolute_framenumber (idx ), self .video_info .fps )
713767 )
714768
715769 else :
@@ -718,13 +772,13 @@ def create_funscript(self, idx_dict: dict) -> None:
718772 for idx in idx_dict ['min' ]:
719773 self .funscript .add_action (
720774 round (output_score [idx ]),
721- FFmpegStream .frame_to_millisec (self .apply_shift (idx , self . params . metric , 'min' ), self .video_info .fps )
775+ FFmpegStream .frame_to_millisec (self .get_absolute_framenumber (idx ), self .video_info .fps )
722776 )
723777
724778 for idx in idx_dict ['max' ]:
725779 self .funscript .add_action (
726780 round (output_score [idx ]),
727- FFmpegStream .frame_to_millisec (self .apply_shift (idx , self . params . metric , 'max' ), self .video_info .fps )
781+ FFmpegStream .frame_to_millisec (self .get_absolute_framenumber (idx ), self .video_info .fps )
728782 )
729783
730784
0 commit comments