83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
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),
|
|
} |