[tracks/skeleton] add info label, tracks move widget to better pos
This commit is contained in:
parent
2bc071c15d
commit
d8fe654ac8
@ -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):
|
||||||
|
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user