[detectionview, tracks] selection of keypoint supported ...

aalpha value of detection codes for time
This commit is contained in:
Jan Grewe 2025-02-02 16:19:38 +01:00
parent b9943f176b
commit f366d6b8ff
3 changed files with 34 additions and 9 deletions

Binary file not shown.

View File

@ -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])

View File

@ -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...")