[detectionview] works on TrackingData now

This commit is contained in:
Jan Grewe 2025-02-21 16:22:46 +01:00
parent 2ff1af7c36
commit 0f1b1d6252

View File

@ -3,12 +3,12 @@ import numpy as np
from PySide6.QtWidgets import QWidget, QVBoxLayout, QSizePolicy, QGraphicsView, QGraphicsScene, QGraphicsEllipseItem, QGraphicsRectItem
from PySide6.QtCore import Qt, QPointF, QRectF, QPointF
from PySide6.QtGui import QPixmap, QBrush, QColor, QImage
from PySide6.QtGui import QPixmap, QBrush, QColor, QImage, QPen
from fixtracks.info import PACKAGE_ROOT
from fixtracks.utils.signals import DetectionSignals, DetectionViewSignals, DetectionSceneSignals
from ..utils.enums import DetectionData
from fixtracks.utils.enums import DetectionData, Tracks
from fixtracks.utils.trackingdata import TrackingData
class Detection(QGraphicsEllipseItem):
signals = DetectionSignals()
@ -79,6 +79,7 @@ class DetectionView(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._img = None
self._data = None
self._pixmapitem = None
self._scene = DetectionScene()
# self.setRenderHint(QGraphicsView.RenderFlag.Ren Antialiasing)
@ -90,7 +91,6 @@ class DetectionView(QWidget):
self._minZoom = 0.1
self._maxZoom = 10
self._currentZoom = 1.0
lyt = QVBoxLayout()
lyt.addWidget(self._view)
self.setLayout(lyt)
@ -116,6 +116,9 @@ class DetectionView(QWidget):
self._view.setScene(self._scene)
self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio)
def setData(self, data:TrackingData):
self._data = data
def clearDetections(self):
items = self._scene.items()
if items is not None:
@ -124,23 +127,34 @@ class DetectionView(QWidget):
self._scene.removeItem(it)
del it
def addDetections(self, coordinates:np.array, track_ids:np.array, detection_ids:np.array, frames: np.array,
keypoint:int, brush:QBrush):
def updateDetections(self, keypoint=-1):
self.clearDetections()
if self._data is None:
return
frames = self._data.selectedData("frame")
tracks = self._data.selectedData("track")
coordinates = self._data.coordinates(selection=True)
centercoordinates = self._data.centerOfGravity(selection=True)
userlabeled = self._data.selectedData("userlabeled")
indices = self._data.selectedData("index")
image_rect = self._pixmapitem.boundingRect() if self._pixmapitem is not None else QRectF(0,0,0,0)
num_detections = coordinates.shape[0]
for i in range(num_detections):
x = coordinates[i, keypoint, 0]
y = coordinates[i, keypoint, 1]
c = brush.color()
c.setAlpha(int(i * 255 / num_detections))
brush.setColor(c)
item = Detection(image_rect.left() + x, image_rect.top() + y, 20, 20, brush=brush)
item.setData(DetectionData.TRACK_ID.value, track_ids[i])
item.setData(DetectionData.ID.value, detection_ids[i])
for i, idx in enumerate(indices):
t = tracks[i]
c = Tracks.fromValue(t).toColor()
if keypoint >= 0:
x = coordinates[i, keypoint, 0]
y = coordinates[i, keypoint, 1]
else:
x = centercoordinates[i, 0]
y = centercoordinates[i, 1]
item = Detection(image_rect.left() + x, image_rect.top() + y, 20, 20, brush=QBrush(c))
item.setData(DetectionData.TRACK_ID.value, tracks[i])
item.setData(DetectionData.ID.value, idx)
item.setData(DetectionData.COORDINATES.value, coordinates[i, :, :])
item.setData(DetectionData.FRAME.value, frames[i])
item = self._scene.addItem(item)
# logging.debug("DetectionView: Number of items in scene: %i", len(self._scene.items()))
def fit_image_to_view(self):
"""Scale the image to fit the QGraphicsView."""
@ -159,7 +173,7 @@ class DetectionView(QWidget):
def main():
def items_selected(items):
print("items selected")
# FIXME The following code will no longer work...
import pickle
import numpy as np
from IPython import embed