diff --git a/fixtracks/icons/Unbenannt.afdesign b/fixtracks/icons/Unbenannt.afdesign index 36af438..2da5fd5 100644 Binary files a/fixtracks/icons/Unbenannt.afdesign and b/fixtracks/icons/Unbenannt.afdesign differ diff --git a/fixtracks/widgets/detectionview.py b/fixtracks/widgets/detectionview.py index e69ce7d..1ed68ea 100644 --- a/fixtracks/widgets/detectionview.py +++ b/fixtracks/widgets/detectionview.py @@ -78,7 +78,7 @@ class DetectionView(QWidget): super().__init__(parent) self._img = None self._pixmapitem = None - self._scene = None + self._scene = DetectionScene() self._view = QGraphicsView() self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self._view.setMouseTracking(True) @@ -89,7 +89,6 @@ class DetectionView(QWidget): def setImage(self, image: QImage): self._img = image - self._scene = DetectionScene() self._scene.signals.itemsSelected.connect(self.on_itemSelection) self._pixmapitem = self._scene.addPixmap(QPixmap.fromImage(self._img)) self._view.setScene(self._scene) @@ -104,11 +103,14 @@ class DetectionView(QWidget): del it def addDetections(self, coordinates:np.array, track_ids:np.array, detection_ids:np.array, brush:QBrush): - logging.debug("DetectionView: add %i detections with color", coordinates.shape[0]) - image_rect = self._pixmapitem.boundingRect() - for i in range(coordinates.shape[0]): + 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, 0] y = coordinates[i, 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(0, track_ids[i]) item.setData(1, detection_ids[i]) diff --git a/fixtracks/widgets/tracks.py b/fixtracks/widgets/tracks.py index 5e53962..bd1548c 100644 --- a/fixtracks/widgets/tracks.py +++ b/fixtracks/widgets/tracks.py @@ -7,7 +7,7 @@ import pandas as pd from PySide6.QtCore import Qt, QThreadPool, Signal, QAbstractTableModel, QSortFilterProxyModel, QSize, QObject from PySide6.QtGui import QImage, QBrush, QColor, QFont from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QComboBox -from PySide6.QtWidgets import QSpinBox, QSpacerItem, QProgressBar, QTableView, QSplitter, QGridLayout, QFileDialog +from PySide6.QtWidgets import QSpinBox, QSpacerItem, QProgressBar, QSplitter, QGridLayout, QFileDialog, QGridLayout from fixtracks.utils.reader import PickleLoader from fixtracks.utils.writer import PickleWriter @@ -293,6 +293,11 @@ class DataController(QObject): with open(filename, 'wb') as f: pickle.dump(df, f) + def numKeypoints(self): + if len(self._data["keypoints"]) == 0: + return 0 + return self._data["keypoints"][0].shape[0] + class FixTracks(QWidget): back = Signal() @@ -327,11 +332,18 @@ class FixTracks(QWidget): self._windowspinner.setSingleStep(100) self._windowspinner.setValue(500) self._windowspinner.valueChanged.connect(self.on_windowSizeChanged) + self._keypointcombo = QComboBox() + self._keypointcombo.currentIndexChanged.connect(self.on_keypointSelected) + + combo_layout = QGridLayout() + combo_layout.addWidget(QLabel("Window:"), 0, 0) + combo_layout.addWidget(self._windowspinner, 0, 1) + combo_layout.addWidget(QLabel("Keypoint:"), 1, 0) + combo_layout.addWidget(self._keypointcombo, 1, 1) timelinebox = QHBoxLayout() timelinebox.addWidget(self._timeline) - timelinebox.addWidget(QLabel("Window")) - timelinebox.addWidget(self._windowspinner) + timelinebox.addLayout(combo_layout) self._controls_widget = SelectionControls() self._controls_widget.assignOne.connect(self.on_assignOne) @@ -407,7 +419,8 @@ class FixTracks(QWidget): def update_detectionView(df, name): if len(df) == 0: return - coords = np.stack(df["keypoints"].values).astype(np.float32)[:,0,:] + keypoint = self._keypointcombo.currentIndex() + coords = np.stack(df["keypoints"].values).astype(np.float32)[:, keypoint,:] tracks = df["track"].values.astype(int) ids = df.index.values.astype(int) self._detectionView.addDetections(coords, tracks, ids, self._brushes[name]) @@ -459,6 +472,12 @@ class FixTracks(QWidget): self._data_combo.addItem("Please select") self._data_combo.addItems(self.fileList) self._data_combo.setCurrentIndex(0) + + def populateKeypointCombo(self, num_keypoints): + self._keypointcombo.clear() + for i in range(num_keypoints): + self._keypointcombo.addItem(str(i)) + self._keypointcombo.setCurrentIndex(0) def _on_dataOpenend(self, state): logging.info("Finished loading data with state %s", state) @@ -467,6 +486,7 @@ class FixTracks(QWidget): self._progress_bar.setValue(0) if state and self._reader is not None: self._data.setData(self._reader.asdict) + self.populateKeypointCombo(self._data.numKeypoints()) self._timeline.setDetectionData(self._data.data) maxframes = self._data.max("frame") rel_width = self._windowspinner.value() / maxframes @@ -474,6 +494,9 @@ class FixTracks(QWidget): self.update() self._saveBtn.setEnabled(True) + def on_keypointSelected(self): + self.update() + def on_save(self): logging.debug("Saving fixtracks results") self._tasklabel.setText("Saving results to file...")