studia/jezyki-skryptowe/image-editor/ImageProcessingWorker.py

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()