From d8fe654ac87cd1ed7a8612954ea52e12fdaf222f Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Thu, 6 Feb 2025 14:39:50 +0100 Subject: [PATCH] [tracks/skeleton] add info label, tracks move widget to better pos --- fixtracks/widgets/skeleton.py | 38 +++++++++++++++++++++++++++++------ fixtracks/widgets/tracks.py | 19 +++++++++++------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/fixtracks/widgets/skeleton.py b/fixtracks/widgets/skeleton.py index 37140ce..e2fd2bb 100644 --- a/fixtracks/widgets/skeleton.py +++ b/fixtracks/widgets/skeleton.py @@ -1,11 +1,12 @@ import logging import numpy as np -from PySide6.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QGraphicsView, QSlider, QPushButton +from PySide6.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QGraphicsView, QSlider, QPushButton, QLabel from PySide6.QtWidgets import QGraphicsScene, QGraphicsEllipseItem, QGraphicsRectItem, QGraphicsLineItem from PySide6.QtCore import Qt -from PySide6.QtGui import QBrush, QColor, QPen, QPainter +from PySide6.QtGui import QBrush, QColor, QPen, QPainter, QFont +from fixtracks.widgets.detectionview import DetectionData class Skeleton(QGraphicsRectItem): skeleton_grid = [(0, 1), (1, 2), (1, 3), (1, 4), (2, 5)] @@ -63,8 +64,14 @@ class SkeletonWidget(QWidget): self._view.setMouseTracking(True) self._view.setScene(self._scene) + font = QFont() + font.setPointSize(9) + self._info_label = QLabel("") + self._info_label.setFont(font) + lyt = QVBoxLayout() lyt.addWidget(self._view) + lyt.addWidget(self._info_label) lyt.addWidget(self._slider) self.setLayout(lyt) @@ -72,6 +79,13 @@ class SkeletonWidget(QWidget): self._scene.changed.connect(lambda: self._view.fitInView(self._scene.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio)) + def updateInfo(self, index): + if index > -1: + s = self._skeletons[index] + self._info_label.setText(f"Detection id {s.data(DetectionData.ID.value)}, track {s.data(DetectionData.TRACK_ID.value)} on frame {s.data(DetectionData.FRAME.value)}") + else: + self._info_label.setText("") + def clear(self): for i in range(len(self._skeletons)): item = self._skeletons.pop() @@ -80,6 +94,7 @@ class SkeletonWidget(QWidget): del item self._skeletons = [] self.update() + self.updateInfo(-1) def on_sliderMoved(self): if self._current_skeleton is not None and self._current_skeleton.scene() == self._scene: @@ -87,12 +102,14 @@ class SkeletonWidget(QWidget): if self._slider.value() < len(self._skeletons): self._current_skeleton = self._skeletons[self._slider.value()] self._scene.addItem(self._current_skeleton) + self.updateInfo(self._slider.value()) def update(self): logging.debug("SkeletonWidget: update") if len(self._skeletons) > 0: self._scene.addItem(self._skeletons[-1]) self._current_skeleton = self._skeletons[-1] + self.updateInfo(len(self._skeletons)-1) self._slider.setMaximum(len(self._skeletons)) self._slider.setMinimum(0) self._slider.setValue(len(self._skeletons)) @@ -100,7 +117,7 @@ class SkeletonWidget(QWidget): self._scene.setSceneRect(self._minx, self._miny, self._maxx - self._minx, self._maxy - self._miny) self._view.fitInView(self._scene.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio) - def addSkeleton(self, coords, detection_id, brush, update=True): + def addSkeleton(self, coords, detection_id, frame, track, brush, update=True): def check_extent(x, y, w, h): if len(self._skeletons) == 0: self._minx = x @@ -123,16 +140,25 @@ class SkeletonWidget(QWidget): boxh = np.max(coords[:, 1]) - boxy check_extent(boxx, boxy, boxw, boxh) item = Skeleton(boxx, boxy, boxw, boxh, coords, brush) - item.setData(0, detection_id) + item.setData(DetectionData.ID.value, detection_id) + item.setData(DetectionData.TRACK_ID.value, track) + item.setData(DetectionData.FRAME.value, frame) self._skeletons.append(item) if update: self.update() - def addSkeletons(self, coordinates:np.ndarray, detection_ids:np.ndarray, brush:QBrush): + def addSkeletons(self, coordinates:np.ndarray, detection_ids:np.ndarray, + frames:np.ndarray, tracks:np.ndarray, brush:QBrush): num_detections = 0 if coordinates is None else coordinates.shape[0] logging.debug("SkeletonWidget: add %i Skeletons", num_detections) + sorting = np.argsort(frames) + coordinates = coordinates[sorting,:, :] + detection_ids = detection_ids[sorting] + frames = frames[sorting] + tracks = tracks[sorting] for i in range(num_detections): - self.addSkeleton(coordinates[i,:,:], detection_ids[i], brush=brush, update=False) + self.addSkeleton(coordinates[i,:,:], detection_ids[i], frames[i], + tracks[i], brush=brush, update=False) self.update() # def addSkeleton(self, coords, detection_id, brush): diff --git a/fixtracks/widgets/tracks.py b/fixtracks/widgets/tracks.py index 66f78ce..feb798f 100644 --- a/fixtracks/widgets/tracks.py +++ b/fixtracks/widgets/tracks.py @@ -320,6 +320,14 @@ class FixTracks(QWidget): } self._detectionView = DetectionView() self._detectionView.signals.itemsSelected.connect(self.on_detectionsSelected) + self._skeleton = SkeletonWidget() + # self._skeleton.setMaximumSize(QSize(400, 400)) + top_splitter = QSplitter(Qt.Orientation.Horizontal) + top_splitter.addWidget(self._detectionView) + top_splitter.addWidget(self._skeleton) + top_splitter.setStretchFactor(0, 2) + top_splitter.setStretchFactor(1, 1) + self._progress_bar = QProgressBar(self) self._progress_bar.setMaximumHeight(20) self._progress_bar.setValue(0) @@ -353,9 +361,6 @@ class FixTracks(QWidget): self._controls_widget.fwd.connect(self.on_forward) self._controls_widget.back.connect(self.on_backward) - self._skeleton = SkeletonWidget() - # self._skeleton.setMaximumSize(QSize(400, 400)) - self._saveBtn = QPushButton("Save") self._saveBtn.setShortcut("Ctrl+S") self._saveBtn.setEnabled(False) @@ -388,8 +393,8 @@ class FixTracks(QWidget): cntrlBox = QHBoxLayout() cntrlBox.addItem(QSpacerItem(200, 100, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding)) - cntrlBox.addWidget(self._controls_widget) - cntrlBox.addWidget(self._skeleton) + cntrlBox.addWidget(self._controls_widget, alignment=Qt.AlignmentFlag.AlignCenter) + vbox = QVBoxLayout() vbox.addLayout(timelinebox) vbox.addLayout(cntrlBox) @@ -398,7 +403,7 @@ class FixTracks(QWidget): container.setLayout(vbox) splitter = QSplitter(Qt.Orientation.Vertical) - splitter.addWidget(self._detectionView) + splitter.addWidget(top_splitter) splitter.addWidget(container) splitter.setStretchFactor(0, 3) splitter.setStretchFactor(1, 1) @@ -586,7 +591,7 @@ class FixTracks(QWidget): self._data.setUserSelection(ids) self._controls_widget.setSelectedTracks(tracks) self._skeleton.clear() - self._skeleton.addSkeletons(coordinates, ids, QBrush(QColor(10, 255, 65, 255))) + self._skeleton.addSkeletons(coordinates, ids, frames, tracks, QBrush(QColor(10, 255, 65, 255))) self.update() def moveWindow(self, stepsize):