From 37f505a7255990f67ea564d062e74ffc97b63595 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Sun, 22 Dec 2024 00:15:12 +0100 Subject: [PATCH] working left preview extract VideoPreview class and refactoring --- fixtracks/detectionmerge.py | 111 ++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 50 deletions(-) diff --git a/fixtracks/detectionmerge.py b/fixtracks/detectionmerge.py index b0adad6..38204a2 100644 --- a/fixtracks/detectionmerge.py +++ b/fixtracks/detectionmerge.py @@ -7,6 +7,44 @@ from PyQt6.QtGui import QImage, QPixmap, QColor, QPen from fixtracks.util import ImageReader +class VideoPreview(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + 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 + layout = QVBoxLayout() + layout.addWidget(self._view) + self.setLayout(layout) + + def set_image(self, img): + self._scene = QGraphicsScene() + self._pixmap = self._scene.addPixmap(QPixmap.fromImage(img)) + self._view.setScene(self._scene) + self._view.fitInView(self._scene.sceneRect(), mode=Qt.AspectRatioMode.KeepAspectRatio) + image_rect = self._pixmap.boundingRect() + start_x = image_rect.right() + start_y = image_rect.top() + end_y = image_rect.bottom() + + self._scene.addLine(start_x, start_y, start_x, end_y, self._line_pen) + self._view.show() + + def set_lineposition(self, position): + image_rect = self._pixmap.boundingRect() + for i in self._scene.items(): + if isinstance(i, QGraphicsLineItem): + self._scene.removeItem(i) + + 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) + + class MergeDetections(QWidget): def __init__(self, parent=None): super().__init__(parent) @@ -18,39 +56,31 @@ class MergeDetections(QWidget): layout = QVBoxLayout() layout.addWidget(QLabel("Merge Detections!")) - self.line_pen = QPen(QColor.fromString("red"), 4) - self.left_datacombo = QComboBox() self.left_videocombo = QComboBox() self.left_datacombo.addItems(self._files) self.left_videocombo.addItems(self._files) self.left_posspinner = QSpinBox() self.left_posspinner.valueChanged.connect(self.on_leftmergelinemove) - self.left_preview = QGraphicsView() - self.left_preview.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - self.left_line = None - self.scene = None - + self.left_preview = VideoPreview(self) + self.right_datacombo = QComboBox() self.right_videocombo = QComboBox() self.right_datacombo.addItems(self._files) self.right_videocombo.addItems(self._files) self.right_posspinner = QSpinBox() - self.right_preview = QLabel() - self.right_preview.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - self.right_line = None + self.right_posspinner.valueChanged.connect(self.on_rightmergelinemove) + self.right_preview = VideoPreview(self) layout.addLayout(self.layout_controls()) splitter = QGridLayout() - # splitter.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) splitter.addWidget(self.left_preview, 0, 0) splitter.addWidget(self.right_preview, 0, 1) splitter.setColumnStretch(0, 1) splitter.setColumnStretch(1, 1) layout.addLayout(splitter) - + self.setLayout(layout) - def layout_controls(self): grd = QGridLayout() @@ -110,6 +140,13 @@ class MergeDetections(QWidget): self.left_videocombo.currentIndexChanged.connect(self.on_leftvideoSelection) # self._files = file_list + def _toImage(self, frame): + height, width, _ = frame.shape + bytesPerLine = 3 * width + img = QImage(frame.data, width, height, bytesPerLine, QImage.Format.Format_BGR888).rgbSwapped() + # pm = QPixmap.fromImage(img) + return img + def on_rightvideoSelection(self): logging.debug("Video selection of the %s side", "right") self.right_imagereader = ImageReader(self.right_videocombo.currentText(), 100) @@ -119,13 +156,10 @@ class MergeDetections(QWidget): def right_imgreaderDone(self, state): logging.debug("Right image reader done with state %s", str(state)) frame = self.right_imagereader.frame - height, width, _ = frame.shape - bytesPerLine = 3 * width - img = QImage(frame.data, width, height, bytesPerLine, QImage.Format.Format_BGR888).rgbSwapped() - self.right_preview.setPixmap(QPixmap.fromImage(img).scaledToHeight(self.right_preview.height())) - self.right_posspinner.setMaximum(width) - self.left_posspinner.setValue(width-1) - + img = self._toImage(frame) + self.right_preview.set_image(img) + self.right_posspinner.setMaximum(img.width() - 1) + self.right_posspinner.setValue(img.width() - 1) def on_leftvideoSelection(self): logging.debug("Video selection of the %s side", "left") @@ -136,36 +170,13 @@ class MergeDetections(QWidget): def left_imgreaderDone(self, state): logging.debug("Left image reader done with state %s", str(state)) frame = self.left_imagereader.frame - height, width, _ = frame.shape - bytesPerLine = 3 * width - img = QImage(frame.data, width, height, bytesPerLine, QImage.Format.Format_BGR888).rgbSwapped() - self.scene = QGraphicsScene() - self._left_pixmap = self.scene.addPixmap(QPixmap.fromImage(img)) - self.left_preview.setScene(self.scene) - self.left_preview.fitInView(self.scene.sceneRect(), mode=Qt.AspectRatioMode.KeepAspectRatio) - - # self.left_preview.setPixmap(QPixmap.fromImage(img).scaledToHeight(self.left_preview.height())) - self.left_posspinner.setMaximum(width-1) - self.left_posspinner.setValue(width-1) - image_rect = self._left_pixmap.boundingRect() - - x = self.left_posspinner.value() - start_x = image_rect.left() + x - start_y = image_rect.top() - end_y = image_rect.bottom() - - self.left_line = self.scene.addLine(start_x, start_y, start_x, end_y, self.line_pen) - self.left_preview.show() + img = self._toImage(frame) + self.left_preview.set_image(img) + self.left_posspinner.setMaximum(img.width() - 1) + self.left_posspinner.setValue(img.width() - 1) def on_leftmergelinemove(self): - image_rect = self._left_pixmap.boundingRect() - for i in self.scene.items(): - if isinstance(i, QGraphicsLineItem): - self.scene.removeItem(i) + self.left_preview.set_lineposition(self.left_posspinner.value()) - x = self.left_posspinner.value() - start_x = image_rect.left() + x - start_y = image_rect.top() - end_y = image_rect.bottom() - - self.scene.addLine(start_x, start_y, start_x, end_y, self.line_pen) + def on_leftmergelinemove(self): + self.right_preview.set_lineposition(self.right_posspinner.value())