Scripts test liveview : pygame, pyqt6, opencv, tkinter - mesure FPS et premiere image
This commit is contained in:
48
scripts/test_opencv.py
Normal file
48
scripts/test_opencv.py
Normal 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
56
scripts/test_pygame.py
Normal 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
93
scripts/test_pyqt6.py
Normal 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
60
scripts/test_tkinter.py
Normal 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")
|
||||||
Reference in New Issue
Block a user