From 7df190b5bce6a36e1a9af95c9d9b1a6b666bd267 Mon Sep 17 00:00:00 2001 From: Jules Date: Wed, 8 Apr 2026 08:33:59 +0200 Subject: [PATCH] Preview: fallback webcam quand le DSLR ne supporte pas le live view Le Canon 6D ne supporte pas capture_preview() via gphoto2. Utilise la webcam embarquee pour le preview tout en gardant le DSLR pour la capture. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/camera.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/backend/camera.py b/backend/camera.py index e61f114..efd8149 100644 --- a/backend/camera.py +++ b/backend/camera.py @@ -63,6 +63,7 @@ class Camera: self.mode = "simulation" # "gphoto2", "webcam", "simulation" self.webcam = None self.webcam_index = -1 + self._preview_webcam_fallback = None def connecter(self, source=None) -> bool: """Connecte la camera. source: 'gphoto2', 'webcam:0', 'webcam:2', etc.""" @@ -113,6 +114,9 @@ class Camera: def deconnecter(self): """Deconnecte l'appareil photo.""" + if self._preview_webcam_fallback: + self._preview_webcam_fallback.release() + self._preview_webcam_fallback = None if self.camera and GPHOTO2_DISPONIBLE: try: self.camera.exit() @@ -196,10 +200,34 @@ class Camera: if self.mode == "webcam": return self._preview_webcam() elif self.mode == "gphoto2": - return self._preview_gphoto2() + data = self._preview_gphoto2() + if data: + return data + # Fallback webcam pour le preview si le DSLR ne supporte pas le live view + if not self._preview_webcam_fallback: + self._init_preview_fallback() + if self._preview_webcam_fallback: + ret, frame = self._preview_webcam_fallback.read() + if ret: + _, buf = cv2.imencode(".jpg", frame, [cv2.IMWRITE_JPEG_QUALITY, 70]) + return buf.tobytes() + return self._preview_simulation() else: return self._preview_simulation() + def _init_preview_fallback(self): + """Ouvre une webcam pour le preview quand le DSLR ne supporte pas le live view.""" + webcams = lister_webcams() + for wc in webcams: + cap = cv2.VideoCapture(wc["index"]) + if cap.isOpened(): + cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) + cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) + self._preview_webcam_fallback = cap + log.info(f"Preview fallback webcam : {wc['nom']}") + return + log.warning("Aucune webcam disponible pour le preview fallback") + def _preview_gphoto2(self) -> bytes | None: try: fichier = self.camera.capture_preview()