From 3b76969d9b83cd678a473a9f347fb5d884fd4148 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Wed, 22 Jan 2025 09:40:22 +0100 Subject: [PATCH] [merger] save a merged image along with the merged detections --- fixtracks/widgets/detectionmerge.py | 48 +++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/fixtracks/widgets/detectionmerge.py b/fixtracks/widgets/detectionmerge.py index 587a23c..a1179e9 100644 --- a/fixtracks/widgets/detectionmerge.py +++ b/fixtracks/widgets/detectionmerge.py @@ -1,8 +1,8 @@ import logging - -from PySide6.QtCore import Qt, QThreadPool, Signal, Slot +import pathlib +from PySide6.QtCore import Qt, QThreadPool, Signal, Slot, QRect, QSize, QPoint from PySide6.QtWidgets import QWidget, QGridLayout, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QComboBox, QSizePolicy, QSpinBox, QGraphicsView, QGraphicsScene, QGraphicsLineItem, QSpacerItem, QProgressDialog, QFileDialog -from PySide6.QtGui import QImage, QPixmap, QColor, QPen +from PySide6.QtGui import QImage, QPixmap, QColor, QPen, QPainter from fixtracks.utils.reader import ImageReader, DataFrameReader from fixtracks.utils.merger import Merger @@ -11,23 +11,24 @@ from fixtracks.utils.merger import Merger class VideoPreview(QWidget): def __init__(self, left=True, parent=None): super().__init__(parent) - self._image = None - self._line_pen = QPen(QColor.fromString("red"), 4) + self._image = None + self._line_pen = QPen(QColor.fromString("red"), 4) self._view = QGraphicsView() self._view.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self._scene = None - self._pixmap = None + self._pixmapitem = None self._left = left layout = QVBoxLayout() layout.addWidget(self._view) self.setLayout(layout) def set_image(self, img): + self._image = img self._scene = QGraphicsScene() - self._pixmap = self._scene.addPixmap(QPixmap.fromImage(img)) + self._pixmapitem = self._scene.addPixmap(QPixmap.fromImage(img)) self._view.setScene(self._scene) self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio) - image_rect = self._pixmap.boundingRect() + image_rect = self._pixmapitem.boundingRect() start_x = image_rect.right() if self._left else image_rect.left() start_y = image_rect.top() end_y = image_rect.bottom() @@ -36,16 +37,20 @@ class VideoPreview(QWidget): self._view.show() def set_lineposition(self, position): - image_rect = self._pixmap.boundingRect() + image_rect = self._pixmapitem.boundingRect() for i in self._scene.items(): if isinstance(i, QGraphicsLineItem): self._scene.removeItem(i) - start_x = image_rect.left() + position + start_x = image_rect.left() + position start_y = image_rect.top() end_y = image_rect.bottom() self._scene.addLine(start_x, start_y, start_x, end_y, self._line_pen) + @property + def image(self): + return self._image + class MergeDetections(QWidget): back = Signal() @@ -310,6 +315,25 @@ class MergeDetections(QWidget): # preview_enabled = self.left_videocombo.currentIndex() > 0 and self.right_videocombo.currentIndex() > 0 # self._mergePreviewBtn.setEnabled(preview_enabled) + def merge_images(self): + limg = self.left_preview.image + left_cut = self.left_posspinner.value() + rimg = self.right_preview.image + right_cut = self.right_posspinner.value() + + lrect = QRect(0, 0, left_cut, limg.height()) + rrect = QRect(right_cut, 0, rimg.width() - right_cut, rimg.height()) + imgsize = QSize(lrect.width() + rrect.width(), rrect.height()) + lselection = limg.copy(lrect) + rselection = rimg.copy(rrect)\ + + img = QImage(imgsize, limg.format()) + painter = QPainter(img) + painter.drawImage(QPoint(0,0), lselection) + painter.drawImage(QPoint(lrect.width(), 0), rselection) + painter.end() + return img + def on_save(self): logging.debug("Save merge results") if self._merger is not None: @@ -321,6 +345,10 @@ class MergeDetections(QWidget): if not file_path.endswith(".pkl"): file_path += ".pkl" self._merger.save(file_path) + p = pathlib.Path(file_path) + img = self.merge_images() + img_name = p.with_suffix(".png") + img.save(str(img_name)) else: logging.debug("Saving failed! Merger is None!")