differential-rotation-scale.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
#
# Flusso ottico differenziale di rotazione/scala
#
# Questo esempio mostra come usare la tua OpenMV Cam per misurare
# la rotazione/scala confrontando l'immagine corrente e quella
# precedente tra loro. Nota che in questa modalità viene gestita solo
# la rotazione/scala, non la traslazione X e Y.
#
# Per eseguire efficacemente questa demo, monta la tua OpenMV Cam su una base
# stabile e ruota LENTAMENTE la fotocamera attorno all'obiettivo, spostando la fotocamera
# avanti/indietro per vedere i numeri cambiare.
# Ovvero solo cambiamenti nella direzione Z.
#
# 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 time
import math
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 = csi0.snapshot() # Scatta una foto e restituisce l'immagine.
# Questo algoritmo è difficile da testare senza un supporto perfetto... Quindi ecco un trucco per vedere che funziona.
# Inserisci un valore z_rotation qui sotto e dovresti vedere che l'output r sia uguale a quel valore.
if 0:
expected_rotation = 20.0
extra_fb.rotation_corr(z_rotation=(-expected_rotation))
# Questo algoritmo è difficile da testare senza un supporto perfetto... Quindi ecco un trucco per vedere che funziona.
# Inserisci un valore zoom qui sotto e dovresti vedere che l'output z sia uguale a quel valore.
if 0:
expected_zoom = 0.8
extra_fb.rotation_corr(zoom=(2.00 - expected_zoom))
displacement = extra_fb.find_displacement(img, logpolar=True)
extra_fb.draw_image(img)
# I risultati di offset sono rumorosi senza filtraggio, quindi si sacrifica un po' di precisione.
rotation_change = int(math.degrees(displacement.rotation) * 5) / 5.0
zoom_amount = displacement.scale
if (
displacement.response > 0.1
): # Al di sotto di circa 0.1 (i risultati possono variare) i risultati sono solo rumore.
print(
"{0:+f}r {1:+f}z {2} {3} FPS".format(
rotation_change, zoom_amount, displacement.response, clock.fps()
)
)
else:
print(clock.fps())