import numpy as np import cv2 from PyQt6.QtCore import pyqtSignal, pyqtSlot, QThread from queue import Queue class ImageProcessingWorker(QThread): result_ready = pyqtSignal(np.ndarray) update_values = pyqtSignal(dict) def __init__(self, image, process_function): super().__init__() self.image = image self.process_function = process_function self.values_queue = Queue(maxsize=1) @pyqtSlot(dict) def process_image(self, values): self.queue(values) def queue(self, value): if self.values_queue.full(): try: self.values_queue.get_nowait() except Queue.Empty: pass self.values_queue.put(value) def run(self): while True: values = self.values_queue.get() if values is None: # A way to exit the thread break img = self.image.copy() processed_image = self.process_function(img, values) postprocessed_image = self.postprocess(processed_image) self.result_ready.emit(postprocessed_image) def postprocess(self, processed_image): return processed_image def stop(self): self.queue(None) self.wait() class RGBImageProcessingWorker(ImageProcessingWorker): def __init__(self, image, process_function): img = image.astype('float32') super().__init__(img, process_function) def postprocess(self, processed_image): return processed_image.astype('uint8') class HSVImageProcessingWorker(ImageProcessingWorker): def __init__(self, image, process_function): img = cv2.cvtColor(image, cv2.COLOR_RGB2HSV).astype('float32') super().__init__(img, process_function) def postprocess(self, processed_image): processed_image = processed_image.astype('uint8') return cv2.cvtColor(processed_image, cv2.COLOR_HSV2RGB) class HLSImageProcessingWorker(ImageProcessingWorker): def __init__(self, image, process_function): img = cv2.cvtColor(image, cv2.COLOR_RGB2HLS).astype('float32') super().__init__(img, process_function) def postprocess(self, processed_image): processed_image = processed_image.astype('uint8') return cv2.cvtColor(processed_image, cv2.COLOR_HLS2RGB)