[timeline] improvements and use in tracks

This commit is contained in:
Jan Grewe 2025-01-26 23:24:22 +01:00
parent df878ea95e
commit 336f9b0a4c
2 changed files with 27 additions and 13 deletions

View File

@ -58,6 +58,8 @@ class DetectionTimeline(QWidget):
self._trackone = trackone_id self._trackone = trackone_id
self._tracktwo = tracktwo_id self._tracktwo = tracktwo_id
self._data = detectiondata self._data = detectiondata
self._rangeStart = 0.0
self._rangeStop = 1.0
self._width = 2000 self._width = 2000
self._stepCount = 200 self._stepCount = 200
self._bg_brush = QBrush(QColor(20, 20, 20, 255)) self._bg_brush = QBrush(QColor(20, 20, 20, 255))
@ -76,12 +78,13 @@ class DetectionTimeline(QWidget):
font.setPointSize(15) font.setPointSize(15)
font.setBold(False) font.setBold(False)
self._scene = QGraphicsScene(QRectF(0, 0, self._width, 50.))
self._scene.setBackgroundBrush(self._bg_brush)
self._view = QGraphicsView() self._view = QGraphicsView()
self._view.setRenderHints(QPainter.RenderHint.Antialiasing | QPainter.RenderHint.SmoothPixmapTransform); self._view.setRenderHints(QPainter.RenderHint.Antialiasing | QPainter.RenderHint.SmoothPixmapTransform);
self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio) self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio)
self._scene = QGraphicsScene(QRectF(0, 0, self._width, 50.))
self._scene.setBackgroundBrush(self._bg_brush)
t1_label = self._scene.addText("track 1", font) t1_label = self._scene.addText("track 1", font)
t1_label.setDefaultTextColor(self._t1_pen.color()) t1_label.setDefaultTextColor(self._t1_pen.color())
@ -133,6 +136,14 @@ class DetectionTimeline(QWidget):
if t2_coverage[i]: self._scene.addLine(pos[i], 17, pos[i], 32., pen=self._t2_pen) if t2_coverage[i]: self._scene.addLine(pos[i], 17, pos[i], 32., pen=self._t2_pen)
if other_coverage[i]: self._scene.addLine(pos[i], 34, pos[i], 49., pen=self._other_pen) if other_coverage[i]: self._scene.addLine(pos[i], 34, pos[i], 49., pen=self._other_pen)
@property
def rangeStart(self):
return self._rangeStart
@property
def rangeStop(self):
return self._rangeStop
def fit_scene_to_view(self): def fit_scene_to_view(self):
"""Scale the image to fit the QGraphicsView.""" """Scale the image to fit the QGraphicsView."""
self._view.fitInView(self._scene.sceneRect(), Qt.KeepAspectRatio) self._view.fitInView(self._scene.sceneRect(), Qt.KeepAspectRatio)
@ -147,9 +158,9 @@ class DetectionTimeline(QWidget):
start_pos = x - w/2 + scene_width/2 start_pos = x - w/2 + scene_width/2
end_pos = x + w/2 + scene_width/2 end_pos = x + w/2 + scene_width/2
range_start = np.round(start_pos / scene_width, 3) self._rangeStart = np.round(start_pos / scene_width, 3)
range_end = np.round(end_pos / scene_width, 3) self._rangeStop = np.round(end_pos / scene_width, 3)
self.signals.windowMoved.emit(range_start, range_end) self.signals.windowMoved.emit(self._rangeStart, self._rangeStop)
# TODO add method to change window size # TODO add method to change window size

View File

@ -11,7 +11,7 @@ from PySide6.QtWidgets import QSpinBox, QSpacerItem, QFileDialog, QProgressBar,
from fixtracks.utils.reader import PickleLoader from fixtracks.utils.reader import PickleLoader
from fixtracks.widgets.detectionview import DetectionView from fixtracks.widgets.detectionview import DetectionView
from fixtracks.widgets.timeline import Timeline from fixtracks.widgets.timeline import Timeline
from fixtracks.widgets.detectiontimeline import DetectionTimeline
class PoseTableModel(QAbstractTableModel): class PoseTableModel(QAbstractTableModel):
column_header = ["frame", "track"] column_header = ["frame", "track"]
@ -108,8 +108,8 @@ class FixTracks(QWidget):
self._progress_bar.setValue(0) self._progress_bar.setValue(0)
self._tasklabel = QLabel() self._tasklabel = QLabel()
self._timeline = Timeline() self._timeline = DetectionTimeline()
self._timeline.signals.changed.connect(self.on_windowChanged) self._timeline.signals.windowMoved.connect(self.on_windowChanged)
self._windowspinner = QSpinBox() self._windowspinner = QSpinBox()
self._windowspinner.setRange(100, 10000) self._windowspinner.setRange(100, 10000)
self._windowspinner.setSingleStep(100) self._windowspinner.setSingleStep(100)
@ -208,8 +208,11 @@ class FixTracks(QWidget):
left_trackid = 1 left_trackid = 1
right_trackid = 2 right_trackid = 2
start_frame = self._timeline.sliderPosition - self._windowspinner.value() // 2 max_frames = np.max(self._dataframe.frame.values)
stop_frame = self._timeline.sliderPosition + self._windowspinner.value() // 2 start = self._timeline.rangeStart
stop = self._timeline._rangeStop
start_frame = np.floor(start * max_frames)
stop_frame = np.ceil(stop * max_frames)
df = self._dataframe[(self._dataframe.frame >= start_frame) & (self._dataframe.frame < stop_frame)] df = self._dataframe[(self._dataframe.frame >= start_frame) & (self._dataframe.frame < stop_frame)]
assigned_left = df[(df.track == left_trackid)] assigned_left = df[(df.track == left_trackid)]
@ -235,7 +238,7 @@ class FixTracks(QWidget):
self._progress_bar.setValue(0) self._progress_bar.setValue(0)
if state and self._reader is not None: if state and self._reader is not None:
self._dataframe = self._reader.data self._dataframe = self._reader.data
self._timeline.setRange(np.max(self._dataframe.frame.values), self._windowspinner.value()) self._timeline.setDetectionData(self._dataframe)
self.populateTables() self.populateTables()
def on_save(self): def on_save(self):
@ -251,8 +254,8 @@ class FixTracks(QWidget):
def on_assignRight(self): def on_assignRight(self):
pass pass
def on_windowChanged(self, value): def on_windowChanged(self, start, stop):
logging.info("Timeline reports window change") logging.info("Timeline reports window change to range %f %f percent of data", start, stop)
self.populateTables() self.populateTables()