refactor: update camera handling with mock implementation and improve signal connections

This commit is contained in:
2025-09-15 20:58:05 +02:00
parent 6133c9fb18
commit 2187536c7d
3 changed files with 82 additions and 5 deletions

View File

@@ -1,11 +1,14 @@
import gphoto2 as gp # import gphoto2 as gp
import numpy as np import numpy as np
import cv2 import cv2
from PySide6.QtCore import QObject, QThread, Signal from PySide6.QtCore import QObject, QThread, Signal
from PySide6.QtGui import QImage, QPixmap from PySide6.QtGui import QImage, QPixmap
# try:
# import gphoto2 as gp
# except:
from . import mock_gphoto as gp
class CameraWorker(QObject): class CameraWorker(QObject):
frameReady = Signal(QPixmap) frameReady = Signal(QPixmap)
@@ -20,7 +23,7 @@ class CameraWorker(QObject):
def start_camera(self): def start_camera(self):
"""Uruchom kamerę i zacznij pobierać klatki""" """Uruchom kamerę i zacznij pobierać klatki"""
try: try:
self.camera = gp.Camera() self.camera = gp.Camera() # type: ignore
self.camera.init() self.camera.init()
self.running = True self.running = True
self._capture_loop() self._capture_loop()

View File

@@ -1,10 +1,11 @@
from PySide6.QtWidgets import QPushButton
from pathlib import Path from pathlib import Path
from core.database import DatabaseManager from core.database import DatabaseManager
from core.media import MediaRepository from core.media import MediaRepository
from ui.widgets.color_list_widget import ColorListWidget from ui.widgets.color_list_widget import ColorListWidget
from ui.widgets.thumbnail_list_widget import ThumbnailListWidget from ui.widgets.thumbnail_list_widget import ThumbnailListWidget
from ui.widgets.split_view_widget import SplitView from ui.widgets.split_view_widget import SplitView
from PySide6.QtWidgets import QPushButton from .camera_controller import CameraController
class MainController: class MainController:
@@ -14,6 +15,8 @@ class MainController:
self.media_repo = MediaRepository(self.db) self.media_repo = MediaRepository(self.db)
self.media_repo.sync_media() self.media_repo.sync_media()
self.camera_controller = CameraController()
self.view = view self.view = view
self.color_list: ColorListWidget = view.color_list_widget self.color_list: ColorListWidget = view.color_list_widget
self.thumbnail_list: ThumbnailListWidget = view.thumbnail_widget self.thumbnail_list: ThumbnailListWidget = view.thumbnail_widget
@@ -26,6 +29,13 @@ class MainController:
self.color_list.editColor.connect(self.on_edit_color) self.color_list.editColor.connect(self.on_edit_color)
self.thumbnail_list.selectedThumbnail.connect(self.on_thumbnail_selected) self.thumbnail_list.selectedThumbnail.connect(self.on_thumbnail_selected)
self.camera_controller.errorOccurred.connect(self.split_view.widget_start.set_info_text)
self.camera_controller.frameReady.connect(self.split_view.set_live_image)
self.split_view.widget_start.camera_start_btn.clicked.connect(self.camera_controller.start)
def start_camera(self):
pass
def load_colors(self) -> None: def load_colors(self) -> None:
colors = self.db.get_all_colors() colors = self.db.get_all_colors()
print("Loaded colors:", colors) print("Loaded colors:", colors)

View File

@@ -0,0 +1,64 @@
import cv2
import numpy as np
class GPhoto2Error(Exception):
pass
class CameraFileMock:
"""Mock obiektu zwracanego przez gphoto2.Camera.capture_preview()"""
def __init__(self, frame: np.ndarray):
# Kodowanie do JPEG, żeby symulować prawdziwe dane z kamery
success, buf = cv2.imencode(".jpg", frame)
if not success:
raise GPhoto2Error("Nie udało się zakodować ramki testowej.")
self._data = buf.tobytes()
def get_data_and_size(self):
return self._data
return self._data, len(self._data)
class Camera:
def __init__(self):
self._frame_counter = 0
self._running = False
def init(self):
self._running = True
print("[my_gphoto] Kamera MOCK zainicjalizowana")
def exit(self):
self._running = False
print("[my_gphoto] Kamera MOCK wyłączona")
def capture_preview(self):
if not self._running:
raise GPhoto2Error("Kamera MOCK nie jest uruchomiona")
# przykład 1: wczytaj stały obrazek z pliku
# frame = cv2.imread("test_frame.jpg")
# if frame is None:
# raise GPhoto2Error("Nie znaleziono test_frame.jpg")
# przykład 2: wygeneruj kolorową planszę
h, w = 480, 640
color = (self._frame_counter % 255, 100, 200)
frame = np.full((h, w, 3), color, dtype=np.uint8)
# dodanie napisu
text = "OBRAZ TESTOWY"
font = cv2.FONT_HERSHEY_SIMPLEX
scale = 1.5
thickness = 3
color_text = (255, 255, 255)
(text_w, text_h), _ = cv2.getTextSize(text, font, scale, thickness)
x = (w - text_w) // 2
y = (h + text_h) // 2
cv2.putText(frame, text, (x, y), font, scale, color_text, thickness, cv2.LINE_AA)
self._frame_counter += 1
return CameraFileMock(frame)