[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
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!")