differential-translation.py
# Questo lavoro è concesso in licenza MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Tutti i diritti riservati.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Traslazione del flusso ottico differenziale
#
# Questo esempio mostra come usare la tua OpenMV Cam per misurare la traslazione
# nella direzione X e Y confrontando l'immagine corrente e quella precedente
# immagine precedente tra loro. Nota che in questa modalità viene gestita solo
# la traslazione X e Y, non la rotazione/scala.
#
# Per eseguire efficacemente questa demo, monta la tua OpenMV Cam su una base
# base e traslala RAPIDAMENTE a sinistra, destra, su e giù, e
# osserva i numeri cambiare. Nota che è possibile vedere numeri di spostamento
# fino a +- metà della risoluzione orizzontale e verticale.
#
# NOTA È necessario usare una piccola risoluzione potenza di 2 quando si usa
# find_displacement(). Questo perché l'algoritmo è basato su
# qualcosa chiamato correlazione di fase, che esegue il confronto tra immagini
# usando le FFT. Una risoluzione che non è una potenza di 2 richiede un padding fino a una potenza
# di 2, il che riduce l'utilità dei risultati dell'algoritmo. Si prega di
# usare una risoluzione come B64X64 o B64X32 (2x più veloce).
#
# La tua OpenMV Cam supporta risoluzioni potenza di 2 di 64x32, 64x64,
# 128x64 e 128x128. Se desideri una risoluzione di 32x32 puoi crearla
# eseguendo "img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA)" su un'immagine 64x64.
import csi
import image
import sensor
import time
csi0 = csi.CSI()
csi0.reset() # Resetta e inizializza il sensore.
csi0.pixformat(csi.RGB565) # Imposta il formato pixel su RGB565 (o GRAYSCALE)
csi0.framesize((64, 64)) # Imposta la dimensione del fotogramma a 64x64... (o 64x32)...
csi0.snapshot(time=2000) # Attendi che le impostazioni abbiano effetto.
clock = time.clock() # Crea un oggetto clock per tracciare gli FPS.
# Crea un secondo frame buffer nell'heap.
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
extra_fb.draw_image(csi0.snapshot())
while True:
clock.tick() # Traccia i millisecondi trascorsi tra le chiamate a snapshot().
img = sensor.snapshot() # Scatta una foto e restituisce l'immagine.
displacement = extra_fb.find_displacement(img)
extra_fb.draw_image(img)
# I risultati di offset sono rumorosi senza filtraggio, quindi si sacrifica un po' di precisione.
sub_pixel_x = int(displacement.x_translation * 5) / 5.0
sub_pixel_y = int(displacement.y_translation * 5) / 5.0
if (
displacement.response > 0.1
): # Al di sotto di circa 0.1 (i risultati possono variare) i risultati sono solo rumore.
print(
"{0:+f}x {1:+f}y {2} {3} FPS".format(
sub_pixel_x, sub_pixel_y, displacement.response, clock.fps()
)
)
else:
print(clock.fps())