[tracks/skeleton] add info label, tracks move widget to better pos

This commit is contained in:
Jan Grewe 2025-02-06 14:39:50 +01:00
parent 2bc071c15d
commit d8fe654ac8
2 changed files with 44 additions and 13 deletions

View File

@ -1,11 +1,12 @@
import logging import logging
import numpy as np 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.QtWidgets import QGraphicsScene, QGraphicsEllipseItem, QGraphicsRectItem, QGraphicsLineItem
from PySide6.QtCore import Qt 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): class Skeleton(QGraphicsRectItem):
skeleton_grid = [(0, 1), (1, 2), (1, 3), (1, 4), (2, 5)] 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.setMouseTracking(True)
self._view.setScene(self._scene) self._view.setScene(self._scene)
font = QFont()
font.setPointSize(9)
self._info_label = QLabel("")
self._info_label.setFont(font)
lyt = QVBoxLayout() lyt = QVBoxLayout()
lyt.addWidget(self._view) lyt.addWidget(self._view)
lyt.addWidget(self._info_label)
lyt.addWidget(self._slider) lyt.addWidget(self._slider)
self.setLayout(lyt) self.setLayout(lyt)
@ -72,6 +79,13 @@ class SkeletonWidget(QWidget):
self._scene.changed.connect(lambda: self._view.fitInView(self._scene.sceneRect(), self._scene.changed.connect(lambda: self._view.fitInView(self._scene.sceneRect(),
Qt.AspectRatioMode.KeepAspectRatio)) 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): def clear(self):
for i in range(len(self._skeletons)): for i in range(len(self._skeletons)):
item = self._skeletons.pop() item = self._skeletons.pop()
@ -80,6 +94,7 @@ class SkeletonWidget(QWidget):
del item del item
self._skeletons = [] self._skeletons = []
self.update() self.update()
self.updateInfo(-1)
def on_sliderMoved(self): def on_sliderMoved(self):
if self._current_skeleton is not None and self._current_skeleton.scene() == self._scene: 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): if self._slider.value() < len(self._skeletons):
self._current_skeleton = self._skeletons[self._slider.value()] self._current_skeleton = self._skeletons[self._slider.value()]
self._scene.addItem(self._current_skeleton) self._scene.addItem(self._current_skeleton)
self.updateInfo(self._slider.value())
def update(self): def update(self):
logging.debug("SkeletonWidget: update") logging.debug("SkeletonWidget: update")
if len(self._skeletons) > 0: if len(self._skeletons) > 0:
self._scene.addItem(self._skeletons[-1]) self._scene.addItem(self._skeletons[-1])
self._current_skeleton = self._skeletons[-1] self._current_skeleton = self._skeletons[-1]
self.updateInfo(len(self._skeletons)-1)
self._slider.setMaximum(len(self._skeletons)) self._slider.setMaximum(len(self._skeletons))
self._slider.setMinimum(0) self._slider.setMinimum(0)
self._slider.setValue(len(self._skeletons)) 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._scene.setSceneRect(self._minx, self._miny, self._maxx - self._minx, self._maxy - self._miny)
self._view.fitInView(self._scene.sceneRect(), Qt.AspectRatioMode.KeepAspectRatio) 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): def check_extent(x, y, w, h):
if len(self._skeletons) == 0: if len(self._skeletons) == 0:
self._minx = x self._minx = x
@ -123,16 +140,25 @@ class SkeletonWidget(QWidget):
boxh = np.max(coords[:, 1]) - boxy boxh = np.max(coords[:, 1]) - boxy
check_extent(boxx, boxy, boxw, boxh) check_extent(boxx, boxy, boxw, boxh)
item = Skeleton(boxx, boxy, boxw, boxh, coords, brush) 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) self._skeletons.append(item)
if update: if update:
self.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] num_detections = 0 if coordinates is None else coordinates.shape[0]
logging.debug("SkeletonWidget: add %i Skeletons", num_detections) 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): 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() self.update()
# def addSkeleton(self, coords, detection_id, brush): # def addSkeleton(self, coords, detection_id, brush):

View File

@ -320,6 +320,14 @@ class FixTracks(QWidget):
} }
self._detectionView = DetectionView() self._detectionView = DetectionView()
self._detectionView.signals.itemsSelected.connect(self.on_detectionsSelected) 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 = QProgressBar(self)
self._progress_bar.setMaximumHeight(20) self._progress_bar.setMaximumHeight(20)
self._progress_bar.setValue(0) self._progress_bar.setValue(0)
@ -353,9 +361,6 @@ class FixTracks(QWidget):
self._controls_widget.fwd.connect(self.on_forward) self._controls_widget.fwd.connect(self.on_forward)
self._controls_widget.back.connect(self.on_backward) self._controls_widget.back.connect(self.on_backward)
self._skeleton = SkeletonWidget()
# self._skeleton.setMaximumSize(QSize(400, 400))
self._saveBtn = QPushButton("Save") self._saveBtn = QPushButton("Save")
self._saveBtn.setShortcut("Ctrl+S") self._saveBtn.setShortcut("Ctrl+S")
self._saveBtn.setEnabled(False) self._saveBtn.setEnabled(False)
@ -388,8 +393,8 @@ class FixTracks(QWidget):
cntrlBox = QHBoxLayout() cntrlBox = QHBoxLayout()
cntrlBox.addItem(QSpacerItem(200, 100, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding)) cntrlBox.addItem(QSpacerItem(200, 100, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Expanding))
cntrlBox.addWidget(self._controls_widget) cntrlBox.addWidget(self._controls_widget, alignment=Qt.AlignmentFlag.AlignCenter)
cntrlBox.addWidget(self._skeleton)
vbox = QVBoxLayout() vbox = QVBoxLayout()
vbox.addLayout(timelinebox) vbox.addLayout(timelinebox)
vbox.addLayout(cntrlBox) vbox.addLayout(cntrlBox)
@ -398,7 +403,7 @@ class FixTracks(QWidget):
container.setLayout(vbox) container.setLayout(vbox)
splitter = QSplitter(Qt.Orientation.Vertical) splitter = QSplitter(Qt.Orientation.Vertical)
splitter.addWidget(self._detectionView) splitter.addWidget(top_splitter)
splitter.addWidget(container) splitter.addWidget(container)
splitter.setStretchFactor(0, 3) splitter.setStretchFactor(0, 3)
splitter.setStretchFactor(1, 1) splitter.setStretchFactor(1, 1)
@ -586,7 +591,7 @@ class FixTracks(QWidget):
self._data.setUserSelection(ids) self._data.setUserSelection(ids)
self._controls_widget.setSelectedTracks(tracks) self._controls_widget.setSelectedTracks(tracks)
self._skeleton.clear() 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() self.update()
def moveWindow(self, stepsize): def moveWindow(self, stepsize):