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) <noreply@anthropic.com>
This commit is contained in:
@@ -63,6 +63,7 @@ class Camera:
|
|||||||
self.mode = "simulation" # "gphoto2", "webcam", "simulation"
|
self.mode = "simulation" # "gphoto2", "webcam", "simulation"
|
||||||
self.webcam = None
|
self.webcam = None
|
||||||
self.webcam_index = -1
|
self.webcam_index = -1
|
||||||
|
self._preview_webcam_fallback = None
|
||||||
|
|
||||||
def connecter(self, source=None) -> bool:
|
def connecter(self, source=None) -> bool:
|
||||||
"""Connecte la camera. source: 'gphoto2', 'webcam:0', 'webcam:2', etc."""
|
"""Connecte la camera. source: 'gphoto2', 'webcam:0', 'webcam:2', etc."""
|
||||||
@@ -113,6 +114,9 @@ class Camera:
|
|||||||
|
|
||||||
def deconnecter(self):
|
def deconnecter(self):
|
||||||
"""Deconnecte l'appareil photo."""
|
"""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:
|
if self.camera and GPHOTO2_DISPONIBLE:
|
||||||
try:
|
try:
|
||||||
self.camera.exit()
|
self.camera.exit()
|
||||||
@@ -196,10 +200,34 @@ class Camera:
|
|||||||
if self.mode == "webcam":
|
if self.mode == "webcam":
|
||||||
return self._preview_webcam()
|
return self._preview_webcam()
|
||||||
elif self.mode == "gphoto2":
|
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:
|
else:
|
||||||
return self._preview_simulation()
|
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:
|
def _preview_gphoto2(self) -> bytes | None:
|
||||||
try:
|
try:
|
||||||
fichier = self.camera.capture_preview()
|
fichier = self.camera.capture_preview()
|
||||||
|
|||||||
Reference in New Issue
Block a user