refactor: update camera handling with mock implementation and improve signal connections
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
64
controllers/mock_gphoto.py
Normal file
64
controllers/mock_gphoto.py
Normal 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)
|
||||||
Reference in New Issue
Block a user