from PySide6.QtCore import QObject, Signal, QTimer from PySide6.QtGui import QImage, QPixmap import cv2 import numpy as np from .base import BaseImageSource, BaseControlSource class OpenCVImageSource(BaseImageSource): def __init__(self, device_index=0, fps=30, parent=None): super().__init__(parent) self.device_index = device_index self.fps = fps self.cap = None self.timer = None def start(self): self.cap = cv2.VideoCapture(self.device_index) if not self.cap.isOpened(): self.errorOccurred.emit(f"Nie mogę otworzyć kamery {self.device_index}") return self.timer = QTimer() self.timer.timeout.connect(self._grab_frame) self.timer.start(int(1000 / self.fps)) def stop(self): if self.timer: self.timer.stop() if self.cap: self.cap.release() def _grab_frame(self): if self.cap is None: self.errorOccurred.emit(f"Kamera niezaincjalizowana!") return ret, frame = self.cap.read() if not ret: self.errorOccurred.emit("Brak obrazu z kamery OpenCV") return rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch = rgb_image.shape qimg = QImage(rgb_image.data, w, h, ch * w, QImage.Format.Format_RGB888) pixmap = QPixmap.fromImage(qimg) self.new_frame.emit(pixmap) class OpenCVControlSource(BaseControlSource): def __init__(self, cap: cv2.VideoCapture, parent=None): super().__init__(parent) self.cap = cap def set_parameter(self, name, value): prop_id = getattr(cv2, name, None) if prop_id is None: self.errorOccurred.emit(f"Nieznany parametr {name}") return self.cap.set(prop_id, value) self.parameterChanged.emit(name, value) def get_parameter(self, name): prop_id = getattr(cv2, name, None) if prop_id is None: self.errorOccurred.emit(f"Nieznany parametr {name}") return None return self.cap.get(prop_id) def list_parameters(self): return { "CAP_PROP_BRIGHTNESS": self.cap.get(cv2.CAP_PROP_BRIGHTNESS), "CAP_PROP_CONTRAST": self.cap.get(cv2.CAP_PROP_CONTRAST), "CAP_PROP_SATURATION": self.cap.get(cv2.CAP_PROP_SATURATION), "CAP_PROP_GAIN": self.cap.get(cv2.CAP_PROP_GAIN), "CAP_PROP_EXPOSURE": self.cap.get(cv2.CAP_PROP_EXPOSURE), }