import numpy as np from PyQt6.QtCore import pyqtSignal, pyqtSlot, QThread from queue import Queue import cv2 class ImageProcessingWorker(QThread): result_ready = pyqtSignal(np.ndarray) # Signal to emit the processed image update_values = pyqtSignal(dict) # Signal to receive new values 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) processed_image = processed_image.astype('uint8') rgb_image = cv2.cvtColor(processed_image, cv2.COLOR_HSV2RGB) self.result_ready.emit(rgb_image) def stop(self): self.queue(None) self.wait()