Skip to content

Commit f6788f0

Browse files
author
arch
committed
add ui for tracking result cut #18, #19
1 parent 0080230 commit f6788f0

File tree

2 files changed

+109
-1
lines changed

2 files changed

+109
-1
lines changed

funscript_editor/algorithms/funscriptgenerator.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import threading
1111

1212
from dataclasses import dataclass
13-
from PyQt5 import QtCore
13+
from PyQt5 import QtCore, QtWidgets
1414
from scipy.interpolate import interp1d
1515

1616
from funscript_editor.algorithms.videotracker import StaticVideoTracker
@@ -20,6 +20,7 @@
2020
from funscript_editor.algorithms.scenedetect import SceneDetectFromFile, SceneContentDetector, SceneThresholdDetector
2121
from funscript_editor.algorithms.signal import Signal
2222
from funscript_editor.ui.opencvui import OpenCV_GUI, OpenCV_GUI_Parameters
23+
from funscript_editor.ui.cut_tracking_result import CutTrackingResultWidget
2324

2425
import multiprocessing as mp
2526
import numpy as np
@@ -965,6 +966,12 @@ def run(self) -> None:
965966
return
966967

967968
for metric in self.funscripts.keys():
969+
# TODO does not work hear we are not in main thread
970+
# app = QtWidgets.QApplication(sys.argv)
971+
# w = CutTrackingResultWidget(self.score, [metric])
972+
# w.show()
973+
# app.exec_()
974+
# print("result", w.result)
968975
idx_dict = self.determine_change_points(metric)
969976
self.create_funscript(idx_dict, metric)
970977

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import sys
2+
import random
3+
4+
from PyQt5.QtCore import Qt
5+
from PyQt5.QtWidgets import QApplication, QHBoxLayout, QVBoxLayout, QLabel, QPushButton, QSlider, QVBoxLayout, QWidget
6+
7+
import pyqtgraph as pg
8+
from funscript_editor.algorithms.signal import Signal
9+
10+
11+
class Slider(QWidget):
12+
def __init__(self, prefix_txt, maximum, init_value=0):
13+
super(Slider, self).__init__(parent=None)
14+
self.horizontalLayout = QHBoxLayout(self)
15+
self.prefix_txt = prefix_txt
16+
self.label = QLabel(self)
17+
self.horizontalLayout.addWidget(self.label)
18+
self.slider = QSlider(self)
19+
self.slider.setOrientation(Qt.Horizontal)
20+
self.horizontalLayout.addWidget(self.slider)
21+
self.resize(self.sizeHint())
22+
23+
self.maximum = maximum
24+
self.slider.setMaximum(maximum)
25+
self.slider.setSingleStep(1)
26+
27+
self.slider.valueChanged.connect(self.setLabelValue)
28+
self.x = init_value
29+
self.setLabelValue(self.slider.value())
30+
self.slider.setValue(init_value)
31+
32+
def setLabelValue(self, value):
33+
self.x = value
34+
self.label.setText(f"{self.prefix_txt} {self.x: <8}")
35+
36+
37+
class CutTrackingResultWidget(QWidget):
38+
def __init__(self, raw_score, metrics, parent=None):
39+
super(QWidget, self).__init__(parent=parent)
40+
pg.setConfigOption("background","w")
41+
self.verticalLayout = QVBoxLayout(self)
42+
43+
self.raw_score = raw_score
44+
data_len = max([len(raw_score[k]) for k in raw_score if k in metrics])
45+
46+
self.w1 = Slider("Start at Frame", data_len, 0)
47+
self.verticalLayout.addWidget(self.w1)
48+
49+
self.w2 = Slider("Stop at Frame", data_len, data_len)
50+
self.verticalLayout.addWidget(self.w2)
51+
52+
self.btn = QPushButton("OK")
53+
self.verticalLayout.addWidget(self.btn)
54+
self.btn.clicked.connect(self.close)
55+
56+
self.win = pg.GraphicsLayoutWidget(title="Cut Tracking result")
57+
self.verticalLayout.addWidget(self.win)
58+
self.p6 = self.win.addPlot(title="Tracking result")
59+
self.p6.setYRange(0,100)
60+
self.p6.setXRange(0,data_len)
61+
self.p6.vb.setLimits(xMin=0, xMax=data_len, yMin=0, yMax=100)
62+
self.p6.setMouseEnabled(y=False)
63+
colors = ["b", "r", "g", "c", "m", "k", "y"]
64+
self.curve = { k: self.p6.plot(pen=pg.mkPen(c, width=2.0)) for c,k in zip(colors, metrics) }
65+
self.update_plot()
66+
67+
self.w1.slider.valueChanged.connect(self.update_plot)
68+
self.w2.slider.valueChanged.connect(self.update_plot)
69+
70+
self.result = {
71+
"start": 0,
72+
"stop": data_len
73+
}
74+
75+
76+
def update_plot(self):
77+
start = self.w1.x
78+
stop = self.w2.x
79+
self.result = {
80+
"start": start,
81+
"stop": stop
82+
}
83+
for k in self.curve:
84+
if start < stop:
85+
new_score = self.raw_score[k][start:stop]
86+
self.curve[k].setData([start+i for i in range(stop-start)], new_score)
87+
else:
88+
self.curve[k].setData([])
89+
90+
91+
if __name__ == '__main__':
92+
raw_data = {
93+
'd': [random.randint(0, 99) for _ in range(500)],
94+
'x': [random.randint(0, 99) for _ in range(500)],
95+
'y': [random.randint(0, 99) for _ in range(500)]
96+
}
97+
app = QApplication(sys.argv)
98+
w = CutTrackingResultWidget(raw_data, ["x", "y"])
99+
w.show()
100+
app.exec_()
101+
print(w.result)

0 commit comments

Comments
 (0)