Uno delle maggiori limitazioni della PiCam HQ e' quella di avere il fuoco e l'iride manuali
Per il fuoco ho letto che il valore del laplaciano e' una forma di calcolo della nitidezza dell'immagine. Nell'esempio qui sotto viene effettuato il calcolo realtime del valore del laplaciano e si deve spostare con delicatezza (il ritardo delle immagini e' sensibile) il fuoco fino ad ottenere il valore massimo
import cv2
import subprocess
import numpy as np
width, height = 640, 480
frame_size = width * height * 3 // 2 # YUV420p format: 1.5 bytes per pixel
cmd = [
"rpicam-vid",
"--width", str(width),
"--height", str(height),
"--framerate", "30",
"--codec", "yuv420",
"-t", "0",
"--output", "-"
]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
try:
while True:
# Leggi il frame
raw_frame = b''
while len(raw_frame) < frame_size:
chunk = proc.stdout.read(frame_size - len(raw_frame))
if not chunk:
break
raw_frame += chunk
if len(raw_frame) < frame_size:
break # Fine stream o errore
# Converti in matrice YUV420
yuv = np.frombuffer(raw_frame, dtype=np.uint8).reshape((height * 3 // 2, width))
# Canale Y per misura di fuoco
y = yuv[:height, :]
# Calcola varianza del Laplaciano
laplacian = cv2.Laplacian(y, cv2.CV_64F)
variance = laplacian.var()
# Converti YUV420 a BGR per visualizzazione
bgr = cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_I420)
# Visualizza risultato
cv2.putText(bgr, f"Fuoco: {variance:.2f}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("rpicam HQ", bgr)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
proc.terminate()
cv2.destroyAllWindows()

Nessun commento:
Posta un commento