From a1a0ce0503b2acbff5762ba29b1c13eca6d8daa0 Mon Sep 17 00:00:00 2001 From: Jules Date: Thu, 9 Apr 2026 12:42:50 +0200 Subject: [PATCH] Scripts test liveview : pygame, pyqt6, opencv, tkinter - mesure FPS et premiere image --- scripts/test_opencv.py | 48 +++++++++++++++++++++ scripts/test_pygame.py | 56 +++++++++++++++++++++++++ scripts/test_pyqt6.py | 93 +++++++++++++++++++++++++++++++++++++++++ scripts/test_tkinter.py | 60 ++++++++++++++++++++++++++ 4 files changed, 257 insertions(+) create mode 100644 scripts/test_opencv.py create mode 100644 scripts/test_pygame.py create mode 100644 scripts/test_pyqt6.py create mode 100644 scripts/test_tkinter.py diff --git a/scripts/test_opencv.py b/scripts/test_opencv.py new file mode 100644 index 0000000..b178426 --- /dev/null +++ b/scripts/test_opencv.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +"""Test liveview avec OpenCV. Lance: DISPLAY=:0 python3 scripts/test_opencv.py""" +import time +import io +import numpy as np +import cv2 +import gphoto2 as gp + +cam = gp.Camera() +cam.init() +print("Camera connectee") + +t_start = time.time() +frame_count = 0 +premier_frame = None + +print("Appuie sur ESC pour quitter") +while True: + try: + t0 = time.time() + f = cam.capture_preview() + data = bytes(f.get_data_and_size()) + dt = time.time() - t0 + + if premier_frame is None: + premier_frame = time.time() - t_start + print(f"1ere image en : {premier_frame:.2f}s") + + arr = np.frombuffer(data, dtype=np.uint8) + img = cv2.imdecode(arr, cv2.IMREAD_COLOR) + img = cv2.resize(img, (960, 640)) + + frame_count += 1 + fps = frame_count / (time.time() - t_start) + cv2.putText(img, f"FPS: {fps:.1f} frame: {dt*1000:.0f}ms", (10, 30), + cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2) + + cv2.imshow("Test liveview OpenCV", img) + if cv2.waitKey(1) & 0xFF == 27: # ESC + break + + except Exception as e: + print(f"Erreur: {e}") + break + +cam.exit() +cv2.destroyAllWindows() +print(f"Total: {frame_count} frames, {frame_count/(time.time()-t_start):.1f} FPS") diff --git a/scripts/test_pygame.py b/scripts/test_pygame.py new file mode 100644 index 0000000..80dfd3f --- /dev/null +++ b/scripts/test_pygame.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Test liveview avec Pygame. Lance: python3 scripts/test_pygame.py""" +import time +import io +import gphoto2 as gp +import pygame + +cam = gp.Camera() +cam.init() +print("Camera connectee") + +pygame.init() +screen = pygame.display.set_mode((960, 640)) +pygame.display.set_caption("Test liveview Pygame") +clock = pygame.time.Clock() +font = pygame.font.SysFont(None, 36) + +t_start = time.time() +frame_count = 0 +premier_frame = None + +running = True +while running: + for event in pygame.event.get(): + if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE): + running = False + + try: + t0 = time.time() + f = cam.capture_preview() + data = bytes(f.get_data_and_size()) + dt = time.time() - t0 + + if premier_frame is None: + premier_frame = time.time() - t_start + print(f"1ere image en : {premier_frame:.2f}s") + + img_surface = pygame.image.load(io.BytesIO(data)) + img_surface = pygame.transform.scale(img_surface, (960, 640)) + screen.blit(img_surface, (0, 0)) + + frame_count += 1 + fps = frame_count / (time.time() - t_start) + txt = font.render(f"FPS: {fps:.1f} frame: {dt*1000:.0f}ms", True, (255, 255, 0)) + screen.blit(txt, (10, 10)) + pygame.display.flip() + + except Exception as e: + print(f"Erreur: {e}") + break + + clock.tick(30) + +cam.exit() +pygame.quit() +print(f"Total frames: {frame_count}, FPS moyen: {frame_count/(time.time()-t_start):.1f}") diff --git a/scripts/test_pyqt6.py b/scripts/test_pyqt6.py new file mode 100644 index 0000000..3e5f04a --- /dev/null +++ b/scripts/test_pyqt6.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Test liveview avec PyQt6. Lance: python3 scripts/test_pyqt6.py""" +import sys +import time +import io +import gphoto2 as gp +from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow, QVBoxLayout, QWidget +from PyQt6.QtCore import QThread, pyqtSignal, Qt +from PyQt6.QtGui import QPixmap, QImage + + +class PreviewThread(QThread): + frame_ready = pyqtSignal(bytes, float) + premier_frame_signal = pyqtSignal(float) + + def __init__(self, cam): + super().__init__() + self.cam = cam + self._running = True + self._premier = False + + def run(self): + t_start = time.time() + while self._running: + try: + t0 = time.time() + f = self.cam.capture_preview() + data = bytes(f.get_data_and_size()) + dt = time.time() - t0 + if not self._premier: + self._premier = True + self.premier_frame_signal.emit(time.time() - t_start) + self.frame_ready.emit(data, dt) + except Exception as e: + print(f"Erreur preview: {e}") + break + + def stop(self): + self._running = False + + +class MainWindow(QMainWindow): + def __init__(self, cam): + super().__init__() + self.setWindowTitle("Test liveview PyQt6") + self.resize(960, 640) + self.t_start = time.time() + self.frame_count = 0 + + self.label_img = QLabel() + self.label_img.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.label_info = QLabel("Attente premiere image...") + self.label_info.setStyleSheet("color: yellow; background: black; font-size: 18px; padding: 5px;") + + layout = QVBoxLayout() + layout.addWidget(self.label_img) + layout.addWidget(self.label_info) + widget = QWidget() + widget.setLayout(layout) + self.setCentralWidget(widget) + + self.thread = PreviewThread(cam) + self.thread.frame_ready.connect(self.on_frame) + self.thread.premier_frame_signal.connect(self.on_premier) + self.thread.start() + + def on_premier(self, t): + print(f"1ere image en : {t:.2f}s") + + def on_frame(self, data, dt): + self.frame_count += 1 + img = QImage.fromData(data) + pix = QPixmap.fromImage(img).scaled(960, 600, Qt.AspectRatioMode.KeepAspectRatio) + self.label_img.setPixmap(pix) + fps = self.frame_count / (time.time() - self.t_start) + self.label_info.setText(f"FPS: {fps:.1f} frame: {dt*1000:.0f}ms total frames: {self.frame_count}") + + def closeEvent(self, e): + self.thread.stop() + self.thread.wait() + super().closeEvent(e) + + +cam = gp.Camera() +cam.init() +print("Camera connectee") + +app = QApplication(sys.argv) +win = MainWindow(cam) +win.show() +ret = app.exec() +cam.exit() +sys.exit(ret) diff --git a/scripts/test_tkinter.py b/scripts/test_tkinter.py new file mode 100644 index 0000000..058c63e --- /dev/null +++ b/scripts/test_tkinter.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Test liveview avec Tkinter. Lance: DISPLAY=:0 python3 scripts/test_tkinter.py""" +import time +import io +import tkinter as tk +from PIL import Image, ImageTk +import gphoto2 as gp + +cam = gp.Camera() +cam.init() +print("Camera connectee") + +root = tk.Tk() +root.title("Test liveview Tkinter") +root.geometry("960x680") +root.configure(bg="black") + +label_img = tk.Label(root, bg="black") +label_img.pack() +label_info = tk.Label(root, text="Attente...", fg="yellow", bg="black", font=("Arial", 16)) +label_info.pack() + +t_start = time.time() +frame_count = 0 +premier_frame = None + + +def update(): + global frame_count, premier_frame + try: + t0 = time.time() + f = cam.capture_preview() + data = bytes(f.get_data_and_size()) + dt = time.time() - t0 + + if premier_frame is None: + premier_frame = time.time() - t_start + print(f"1ere image en : {premier_frame:.2f}s") + + img = Image.open(io.BytesIO(data)).resize((960, 640)) + photo = ImageTk.PhotoImage(img) + label_img.config(image=photo) + label_img.image = photo + + frame_count += 1 + fps = frame_count / (time.time() - t_start) + label_info.config(text=f"FPS: {fps:.1f} frame: {dt*1000:.0f}ms frames: {frame_count}") + + except Exception as e: + print(f"Erreur: {e}") + root.quit() + return + + root.after(33, update) # ~30fps + + +root.after(100, update) +root.mainloop() +cam.exit() +print(f"Total: {frame_count} frames")