ScanSlicer/scanslicer/controller_detection.py

71 lines
2.4 KiB
Python

import traceback
import cv2
from PySide6.QtCore import QObject, QRunnable, QThreadPool, Signal
from PySide6.QtGui import QImage
from PySide6.QtWidgets import QMessageBox
# DetectionTaskSignals: class definition for ScanSlicer behavior.
class DetectionTaskSignals(QObject):
status = Signal(str)
finished = Signal(object, object, object)
failed = Signal(str)
# DetectionTask: class definition for ScanSlicer behavior.
class DetectionTask(QRunnable):
# __init__: function definition for ScanSlicer behavior.
def __init__(self, autoslicer):
super().__init__()
self.autoslicer = autoslicer
self.signals = DetectionTaskSignals()
# run: function definition for ScanSlicer behavior.
def run(self):
try:
boxes, filter_preview_image = self.autoslicer.autodetect_slices(
self.signals.status.emit,
preview_filter_output=True,
)
normal_preview_image = cv2.cvtColor(self.autoslicer.image, cv2.COLOR_BGR2RGB)
self.signals.finished.emit(boxes, filter_preview_image, normal_preview_image)
except Exception as exc:
details = f"{exc}\n\n{traceback.format_exc()}"
self.signals.failed.emit(details)
# AutotuneTaskSignals: class definition for ScanSlicer behavior.
class AutotuneTaskSignals(QObject):
status = Signal(str)
finished = Signal(object)
failed = Signal(str)
# AutotuneTask: class definition for ScanSlicer behavior.
class AutotuneTask(QRunnable):
# __init__: function definition for ScanSlicer behavior.
def __init__(self, autoslicer, profile_name):
super().__init__()
self.autoslicer = autoslicer
self.profile_name = profile_name
self.signals = AutotuneTaskSignals()
# run: function definition for ScanSlicer behavior.
def run(self):
try:
result = self.autoslicer.autotune_for_current_image(
self.signals.status.emit,
profile_name=self.profile_name,
)
self.signals.finished.emit(result)
except Exception as exc:
details = f"{exc}\n\n{traceback.format_exc()}"
self.signals.failed.emit(details)
# rgb_array_to_qimage: function definition for ScanSlicer behavior.
def rgb_array_to_qimage(image):
h, w, c = image.shape
bytes_per_line = c * w
return QImage(image.data, w, h, bytes_per_line, QImage.Format_RGB888).copy()