66
77import numpy as np
88import pyqtgraph as pg
9+
10+ from funscript_editor .algorithms .signal import Signal
911from funscript_editor .ui .cut_tracking_result import Slider
1012
13+
1114class PostprocessingWidget (QtWidgets .QWidget ):
12- def __init__ (self , metric , raw_score , parent = None ):
15+ def __init__ (self , metric , raw_score , video_info , parent = None ):
1316 super (QtWidgets .QWidget , self ).__init__ (parent = parent )
1417 pg .setConfigOption ("background" ,"w" )
1518 self .verticalLayout = QtWidgets .QVBoxLayout (self )
1619
20+ self .video_info = video_info
1721 self .metric = metric
1822 self .raw_score_idx = [x for x in range (len (raw_score ))]
1923 self .raw_score = raw_score
@@ -25,6 +29,7 @@ def __init__(self, metric, raw_score, parent=None):
2529 self .tabs_content = {}
2630 self .add_rdp_tab ()
2731 self .add_vw_tab ()
32+ self .add_custom_tab ()
2833 self .verticalLayout .addWidget (self .tabs )
2934 self .tabs .currentChanged .connect (self .update_plot )
3035
@@ -67,13 +72,44 @@ def add_vw_tab(self):
6772 tab_name = "Visvalingam-Whyatt"
6873 self .tabs_content [tab_name ] = {"main" : QtWidgets .QWidget (), "widgets" : {}}
6974 self .tabs_content [tab_name ]["main" ].layout = QtWidgets .QVBoxLayout (self )
70- self .tabs_content [tab_name ]["widgets" ]["epsilon" ] = Slider ("Epsilon" , 100 , 10 )
75+ self .tabs_content [tab_name ]["widgets" ]["epsilon" ] = Slider ("Epsilon" , 200 , 50 )
7176 self .tabs_content [tab_name ]["main" ].layout .addWidget (self .tabs_content [tab_name ]["widgets" ]["epsilon" ])
7277 self .tabs_content [tab_name ]["widgets" ]["epsilon" ].slider .valueChanged .connect (self .update_plot )
7378 self .tabs_content [tab_name ]["main" ].setLayout (self .tabs_content [tab_name ]["main" ].layout )
7479 self .tabs .addTab (self .tabs_content [tab_name ]["main" ], tab_name )
7580
7681
82+ def add_custom_tab (self ):
83+ tab_name = "Custom"
84+ self .tabs_content [tab_name ] = {"main" : QtWidgets .QWidget (), "widgets" : {}}
85+ self .tabs_content [tab_name ]["main" ].layout = QtWidgets .QVBoxLayout (self )
86+
87+ self .tabs_content [tab_name ]["widgets" ]["points" ] = QtWidgets .QComboBox ()
88+ self .tabs_content [tab_name ]["widgets" ]["points" ].addItems (["Local Min Max" , "Direction Changed" ])
89+ self .tabs_content [tab_name ]["widgets" ]["points" ].currentIndexChanged .connect (self .update_plot )
90+
91+ self .tabs_content [tab_name ]["widgets" ]["high_second_derivate" ] = QtWidgets .QCheckBox ("High Second Derivate" )
92+ self .tabs_content [tab_name ]["widgets" ]["high_second_derivate" ].stateChanged .connect (self .update_plot )
93+
94+ self .tabs_content [tab_name ]["widgets" ]["distance_minimization" ] = QtWidgets .QCheckBox ("Distance Minimization" )
95+ self .tabs_content [tab_name ]["widgets" ]["distance_minimization" ].stateChanged .connect (self .update_plot )
96+
97+ self .tabs_content [tab_name ]["widgets" ]["evenly_intermediate" ] = QtWidgets .QCheckBox ("Evenly Intermediate" )
98+ self .tabs_content [tab_name ]["widgets" ]["evenly_intermediate" ].stateChanged .connect (self .update_plot )
99+
100+ self .tabs_content [tab_name ]["widgets" ]["runs" ] = Slider ("Additionl Points Algorthm Runs" , 8 , 2 )
101+ self .tabs_content [tab_name ]["widgets" ]["runs" ].slider .valueChanged .connect (self .update_plot )
102+
103+ self .tabs_content [tab_name ]["main" ].layout .addWidget (self .tabs_content [tab_name ]["widgets" ]["points" ])
104+ self .tabs_content [tab_name ]["main" ].layout .addWidget (self .tabs_content [tab_name ]["widgets" ]["high_second_derivate" ])
105+ self .tabs_content [tab_name ]["main" ].layout .addWidget (self .tabs_content [tab_name ]["widgets" ]["distance_minimization" ])
106+ self .tabs_content [tab_name ]["main" ].layout .addWidget (self .tabs_content [tab_name ]["widgets" ]["evenly_intermediate" ])
107+ self .tabs_content [tab_name ]["main" ].layout .addWidget (self .tabs_content [tab_name ]["widgets" ]["runs" ])
108+
109+ self .tabs_content [tab_name ]["main" ].setLayout (self .tabs_content [tab_name ]["main" ].layout )
110+ self .tabs .addTab (self .tabs_content [tab_name ]["main" ], tab_name )
111+
112+
77113 def get_current_tab_name (self ) -> str :
78114 return self .tabs .tabText (self .tabs .currentIndex ())
79115
@@ -94,7 +130,36 @@ def update_plot(self):
94130 return
95131
96132 if current_tab_name == "Visvalingam-Whyatt" :
97- self .result_idx = simplify_coords_vw_idx (self .raw_score_np , float (self .tabs_content [current_tab_name ]["widgets" ]["epsilon" ].x ) / 10.0 )
133+ self .result_idx = simplify_coords_vw_idx (self .raw_score_np , float (self .tabs_content [current_tab_name ]["widgets" ]["epsilon" ].x ) / 1.0 )
134+ self .result_val = [val for idx ,val in enumerate (self .raw_score ) if idx in self .result_idx ]
135+ self .curve_result .setData (self .result_idx , self .result_val )
136+ return
137+
138+ if current_tab_name == "Custom" :
139+ base_algo = self .tabs_content [current_tab_name ]["widgets" ]["points" ].currentText ()
140+ runs = self .tabs_content [current_tab_name ]["widgets" ]["runs" ].x
141+
142+ base_point_algorithm = Signal .BasePointAlgorithm .local_min_max
143+ if base_algo == 'Direction Changed' :
144+ base_point_algorithm = Signal .BasePointAlgorithm .direction_changes
145+
146+ additional_points_algorithms = []
147+ if self .tabs_content [current_tab_name ]["widgets" ]["high_second_derivate" ].isChecked ():
148+ additional_points_algorithms .append (Signal .AdditionalPointAlgorithm .high_second_derivative )
149+
150+ if self .tabs_content [current_tab_name ]["widgets" ]["distance_minimization" ].isChecked ():
151+ additional_points_algorithms .append (Signal .AdditionalPointAlgorithm .distance_minimization )
152+
153+ if self .tabs_content [current_tab_name ]["widgets" ]["evenly_intermediate" ].isChecked ():
154+ additional_points_algorithms .append (Signal .AdditionalPointAlgorithm .evenly_intermediate )
155+
156+ signal = Signal (self .video_info .fps )
157+ self .result_idx = signal .decimate (
158+ self .raw_score ,
159+ base_point_algorithm ,
160+ additional_points_algorithms ,
161+ additional_points_repetitions = runs
162+ )
98163 self .result_val = [val for idx ,val in enumerate (self .raw_score ) if idx in self .result_idx ]
99164 self .curve_result .setData (self .result_idx , self .result_val )
100165 return
0 commit comments