[merger] save a merged image along with the merged detections

This commit is contained in:
Jan Grewe 2025-01-22 09:40:22 +01:00
parent 7b4c2f35eb
commit 3b76969d9b

View File

@ -1,8 +1,8 @@
import logging import logging
import pathlib
from PySide6.QtCore import Qt, QThreadPool, Signal, Slot 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.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.reader import ImageReader, DataFrameReader
from fixtracks.utils.merger import Merger from fixtracks.utils.merger import Merger
@ -16,18 +16,19 @@ class VideoPreview(QWidget):
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._scene = None self._scene = None
self._pixmap = None self._pixmapitem = None
self._left = left self._left = left
layout = QVBoxLayout() layout = QVBoxLayout()
layout.addWidget(self._view) layout.addWidget(self._view)
self.setLayout(layout) self.setLayout(layout)
def set_image(self, img): def set_image(self, img):
self._image = img
self._scene = QGraphicsScene() 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.setScene(self._scene)
self._view.fitInView(self._scene.sceneRect(), aspectRadioMode=Qt.AspectRatioMode.KeepAspectRatio) 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_x = image_rect.right() if self._left else image_rect.left()
start_y = image_rect.top() start_y = image_rect.top()
end_y = image_rect.bottom() end_y = image_rect.bottom()
@ -36,7 +37,7 @@ class VideoPreview(QWidget):
self._view.show() self._view.show()
def set_lineposition(self, position): def set_lineposition(self, position):
image_rect = self._pixmap.boundingRect() image_rect = self._pixmapitem.boundingRect()
for i in self._scene.items(): for i in self._scene.items():
if isinstance(i, QGraphicsLineItem): if isinstance(i, QGraphicsLineItem):
self._scene.removeItem(i) self._scene.removeItem(i)
@ -46,6 +47,10 @@ class VideoPreview(QWidget):
end_y = image_rect.bottom() end_y = image_rect.bottom()
self._scene.addLine(start_x, start_y, start_x, end_y, self._line_pen) self._scene.addLine(start_x, start_y, start_x, end_y, self._line_pen)
@property
def image(self):
return self._image
class MergeDetections(QWidget): class MergeDetections(QWidget):
back = Signal() back = Signal()
@ -310,6 +315,25 @@ class MergeDetections(QWidget):
# preview_enabled = self.left_videocombo.currentIndex() > 0 and self.right_videocombo.currentIndex() > 0 # preview_enabled = self.left_videocombo.currentIndex() > 0 and self.right_videocombo.currentIndex() > 0
# self._mergePreviewBtn.setEnabled(preview_enabled) # 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): def on_save(self):
logging.debug("Save merge results") logging.debug("Save merge results")
if self._merger is not None: if self._merger is not None:
@ -321,6 +345,10 @@ class MergeDetections(QWidget):
if not file_path.endswith(".pkl"): if not file_path.endswith(".pkl"):
file_path += ".pkl" file_path += ".pkl"
self._merger.save(file_path) 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: else:
logging.debug("Saving failed! Merger is None!") logging.debug("Saving failed! Merger is None!")