Scripts test liveview : pygame, pyqt6, opencv, tkinter - mesure FPS et premiere image

This commit is contained in:
2026-04-09 12:42:50 +02:00
parent 19d1998704
commit a1a0ce0503
4 changed files with 257 additions and 0 deletions

48
scripts/test_opencv.py Normal file
View File

@@ -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")

56
scripts/test_pygame.py Normal file
View File

@@ -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}")

93
scripts/test_pyqt6.py Normal file
View File

@@ -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)

60
scripts/test_tkinter.py Normal file
View File

@@ -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")