[detectionview, tracks] selection of keypoint supported ...
aalpha value of detection codes for time
This commit is contained in:
parent
b9943f176b
commit
f366d6b8ff
Binary file not shown.
@ -78,7 +78,7 @@ class DetectionView(QWidget):
|
|||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self._img = None
|
self._img = None
|
||||||
self._pixmapitem = None
|
self._pixmapitem = None
|
||||||
self._scene = None
|
self._scene = DetectionScene()
|
||||||
self._view = QGraphicsView()
|
self._view = QGraphicsView()
|
||||||
self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
|
self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
|
||||||
self._view.setMouseTracking(True)
|
self._view.setMouseTracking(True)
|
||||||
@ -89,7 +89,6 @@ class DetectionView(QWidget):
|
|||||||
|
|
||||||
def setImage(self, image: QImage):
|
def setImage(self, image: QImage):
|
||||||
self._img = image
|
self._img = image
|
||||||
self._scene = DetectionScene()
|
|
||||||
self._scene.signals.itemsSelected.connect(self.on_itemSelection)
|
self._scene.signals.itemsSelected.connect(self.on_itemSelection)
|
||||||
self._pixmapitem = self._scene.addPixmap(QPixmap.fromImage(self._img))
|
self._pixmapitem = self._scene.addPixmap(QPixmap.fromImage(self._img))
|
||||||
self._view.setScene(self._scene)
|
self._view.setScene(self._scene)
|
||||||
@ -104,11 +103,14 @@ class DetectionView(QWidget):
|
|||||||
del it
|
del it
|
||||||
|
|
||||||
def addDetections(self, coordinates:np.array, track_ids:np.array, detection_ids:np.array, brush:QBrush):
|
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() if self._pixmapitem is not None else QRectF(0,0,0,0)
|
||||||
image_rect = self._pixmapitem.boundingRect()
|
num_detections = coordinates.shape[0]
|
||||||
for i in range(coordinates.shape[0]):
|
for i in range(num_detections):
|
||||||
x = coordinates[i, 0]
|
x = coordinates[i, 0]
|
||||||
y = coordinates[i, 1]
|
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 = Detection(image_rect.left() + x, image_rect.top() + y, 20, 20, brush=brush)
|
||||||
item.setData(0, track_ids[i])
|
item.setData(0, track_ids[i])
|
||||||
item.setData(1, detection_ids[i])
|
item.setData(1, detection_ids[i])
|
||||||
|
@ -7,7 +7,7 @@ import pandas as pd
|
|||||||
from PySide6.QtCore import Qt, QThreadPool, Signal, QAbstractTableModel, QSortFilterProxyModel, QSize, QObject
|
from PySide6.QtCore import Qt, QThreadPool, Signal, QAbstractTableModel, QSortFilterProxyModel, QSize, QObject
|
||||||
from PySide6.QtGui import QImage, QBrush, QColor, QFont
|
from PySide6.QtGui import QImage, QBrush, QColor, QFont
|
||||||
from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QComboBox
|
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.reader import PickleLoader
|
||||||
from fixtracks.utils.writer import PickleWriter
|
from fixtracks.utils.writer import PickleWriter
|
||||||
@ -293,6 +293,11 @@ class DataController(QObject):
|
|||||||
with open(filename, 'wb') as f:
|
with open(filename, 'wb') as f:
|
||||||
pickle.dump(df, 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):
|
class FixTracks(QWidget):
|
||||||
back = Signal()
|
back = Signal()
|
||||||
@ -327,11 +332,18 @@ class FixTracks(QWidget):
|
|||||||
self._windowspinner.setSingleStep(100)
|
self._windowspinner.setSingleStep(100)
|
||||||
self._windowspinner.setValue(500)
|
self._windowspinner.setValue(500)
|
||||||
self._windowspinner.valueChanged.connect(self.on_windowSizeChanged)
|
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 = QHBoxLayout()
|
||||||
timelinebox.addWidget(self._timeline)
|
timelinebox.addWidget(self._timeline)
|
||||||
timelinebox.addWidget(QLabel("Window"))
|
timelinebox.addLayout(combo_layout)
|
||||||
timelinebox.addWidget(self._windowspinner)
|
|
||||||
|
|
||||||
self._controls_widget = SelectionControls()
|
self._controls_widget = SelectionControls()
|
||||||
self._controls_widget.assignOne.connect(self.on_assignOne)
|
self._controls_widget.assignOne.connect(self.on_assignOne)
|
||||||
@ -407,7 +419,8 @@ class FixTracks(QWidget):
|
|||||||
def update_detectionView(df, name):
|
def update_detectionView(df, name):
|
||||||
if len(df) == 0:
|
if len(df) == 0:
|
||||||
return
|
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)
|
tracks = df["track"].values.astype(int)
|
||||||
ids = df.index.values.astype(int)
|
ids = df.index.values.astype(int)
|
||||||
self._detectionView.addDetections(coords, tracks, ids, self._brushes[name])
|
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.addItem("Please select")
|
||||||
self._data_combo.addItems(self.fileList)
|
self._data_combo.addItems(self.fileList)
|
||||||
self._data_combo.setCurrentIndex(0)
|
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):
|
def _on_dataOpenend(self, state):
|
||||||
logging.info("Finished loading data with state %s", state)
|
logging.info("Finished loading data with state %s", state)
|
||||||
@ -467,6 +486,7 @@ class FixTracks(QWidget):
|
|||||||
self._progress_bar.setValue(0)
|
self._progress_bar.setValue(0)
|
||||||
if state and self._reader is not None:
|
if state and self._reader is not None:
|
||||||
self._data.setData(self._reader.asdict)
|
self._data.setData(self._reader.asdict)
|
||||||
|
self.populateKeypointCombo(self._data.numKeypoints())
|
||||||
self._timeline.setDetectionData(self._data.data)
|
self._timeline.setDetectionData(self._data.data)
|
||||||
maxframes = self._data.max("frame")
|
maxframes = self._data.max("frame")
|
||||||
rel_width = self._windowspinner.value() / maxframes
|
rel_width = self._windowspinner.value() / maxframes
|
||||||
@ -474,6 +494,9 @@ class FixTracks(QWidget):
|
|||||||
self.update()
|
self.update()
|
||||||
self._saveBtn.setEnabled(True)
|
self._saveBtn.setEnabled(True)
|
||||||
|
|
||||||
|
def on_keypointSelected(self):
|
||||||
|
self.update()
|
||||||
|
|
||||||
def on_save(self):
|
def on_save(self):
|
||||||
logging.debug("Saving fixtracks results")
|
logging.debug("Saving fixtracks results")
|
||||||
self._tasklabel.setText("Saving results to file...")
|
self._tasklabel.setText("Saving results to file...")
|
||||||
|
Loading…
Reference in New Issue
Block a user