working left preview

extract VideoPreview class and refactoring
This commit is contained in:
Jan Grewe 2024-12-22 00:15:12 +01:00
parent 9449ad45ad
commit 37f505a725

View File

@ -7,6 +7,44 @@ from PyQt6.QtGui import QImage, QPixmap, QColor, QPen
from fixtracks.util import ImageReader 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): class MergeDetections(QWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
@ -18,31 +56,24 @@ class MergeDetections(QWidget):
layout = QVBoxLayout() layout = QVBoxLayout()
layout.addWidget(QLabel("Merge Detections!")) layout.addWidget(QLabel("Merge Detections!"))
self.line_pen = QPen(QColor.fromString("red"), 4)
self.left_datacombo = QComboBox() self.left_datacombo = QComboBox()
self.left_videocombo = QComboBox() self.left_videocombo = QComboBox()
self.left_datacombo.addItems(self._files) self.left_datacombo.addItems(self._files)
self.left_videocombo.addItems(self._files) self.left_videocombo.addItems(self._files)
self.left_posspinner = QSpinBox() self.left_posspinner = QSpinBox()
self.left_posspinner.valueChanged.connect(self.on_leftmergelinemove) self.left_posspinner.valueChanged.connect(self.on_leftmergelinemove)
self.left_preview = QGraphicsView() self.left_preview = VideoPreview(self)
self.left_preview.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
self.left_line = None
self.scene = None
self.right_datacombo = QComboBox() self.right_datacombo = QComboBox()
self.right_videocombo = QComboBox() self.right_videocombo = QComboBox()
self.right_datacombo.addItems(self._files) self.right_datacombo.addItems(self._files)
self.right_videocombo.addItems(self._files) self.right_videocombo.addItems(self._files)
self.right_posspinner = QSpinBox() self.right_posspinner = QSpinBox()
self.right_preview = QLabel() self.right_posspinner.valueChanged.connect(self.on_rightmergelinemove)
self.right_preview.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) self.right_preview = VideoPreview(self)
self.right_line = None
layout.addLayout(self.layout_controls()) layout.addLayout(self.layout_controls())
splitter = QGridLayout() splitter = QGridLayout()
# splitter.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
splitter.addWidget(self.left_preview, 0, 0) splitter.addWidget(self.left_preview, 0, 0)
splitter.addWidget(self.right_preview, 0, 1) splitter.addWidget(self.right_preview, 0, 1)
splitter.setColumnStretch(0, 1) splitter.setColumnStretch(0, 1)
@ -51,7 +82,6 @@ class MergeDetections(QWidget):
self.setLayout(layout) self.setLayout(layout)
def layout_controls(self): def layout_controls(self):
grd = QGridLayout() grd = QGridLayout()
grd.addWidget(QLabel("Left:"), 0, 0) grd.addWidget(QLabel("Left:"), 0, 0)
@ -110,6 +140,13 @@ class MergeDetections(QWidget):
self.left_videocombo.currentIndexChanged.connect(self.on_leftvideoSelection) self.left_videocombo.currentIndexChanged.connect(self.on_leftvideoSelection)
# self._files = file_list # 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): def on_rightvideoSelection(self):
logging.debug("Video selection of the %s side", "right") logging.debug("Video selection of the %s side", "right")
self.right_imagereader = ImageReader(self.right_videocombo.currentText(), 100) self.right_imagereader = ImageReader(self.right_videocombo.currentText(), 100)
@ -119,13 +156,10 @@ class MergeDetections(QWidget):
def right_imgreaderDone(self, state): def right_imgreaderDone(self, state):
logging.debug("Right image reader done with state %s", str(state)) logging.debug("Right image reader done with state %s", str(state))
frame = self.right_imagereader.frame frame = self.right_imagereader.frame
height, width, _ = frame.shape img = self._toImage(frame)
bytesPerLine = 3 * width self.right_preview.set_image(img)
img = QImage(frame.data, width, height, bytesPerLine, QImage.Format.Format_BGR888).rgbSwapped() self.right_posspinner.setMaximum(img.width() - 1)
self.right_preview.setPixmap(QPixmap.fromImage(img).scaledToHeight(self.right_preview.height())) self.right_posspinner.setValue(img.width() - 1)
self.right_posspinner.setMaximum(width)
self.left_posspinner.setValue(width-1)
def on_leftvideoSelection(self): def on_leftvideoSelection(self):
logging.debug("Video selection of the %s side", "left") logging.debug("Video selection of the %s side", "left")
@ -136,36 +170,13 @@ class MergeDetections(QWidget):
def left_imgreaderDone(self, state): def left_imgreaderDone(self, state):
logging.debug("Left image reader done with state %s", str(state)) logging.debug("Left image reader done with state %s", str(state))
frame = self.left_imagereader.frame frame = self.left_imagereader.frame
height, width, _ = frame.shape img = self._toImage(frame)
bytesPerLine = 3 * width self.left_preview.set_image(img)
img = QImage(frame.data, width, height, bytesPerLine, QImage.Format.Format_BGR888).rgbSwapped() self.left_posspinner.setMaximum(img.width() - 1)
self.scene = QGraphicsScene() self.left_posspinner.setValue(img.width() - 1)
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()
def on_leftmergelinemove(self): def on_leftmergelinemove(self):
image_rect = self._left_pixmap.boundingRect() self.left_preview.set_lineposition(self.left_posspinner.value())
for i in self.scene.items():
if isinstance(i, QGraphicsLineItem):
self.scene.removeItem(i)
x = self.left_posspinner.value() def on_leftmergelinemove(self):
start_x = image_rect.left() + x self.right_preview.set_lineposition(self.right_posspinner.value())
start_y = image_rect.top()
end_y = image_rect.bottom()
self.scene.addLine(start_x, start_y, start_x, end_y, self.line_pen)