46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
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()
|