absolute-rotation-scale.py
# Esta obra está licenciada bajo la licencia MIT.
# Copyright (c) 2013-2023 OpenMV LLC. Todos los derechos reservados.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Rotación/escala absoluta por flujo óptico
#
# Este ejemplo muestra cómo usar su OpenMV Cam para medir
# rotación/escala comparando la imagen actual con una
# anterior. Tenga en cuenta que solo se maneja rotación/escala,
# no traslación en X e Y en este modo.
#
# Para ejecutar esta demostración de forma efectiva, monte su OpenMV Cam sobre una base
# estable y gire LENTAMENTE la cámara alrededor del lente y mueva la cámara
# hacia adelante/atrás para ver cómo cambian los números.
# Es decir, solo cambios en la dirección Z.
#
# NOTA: debe usar una resolución pequeña que sea potencia de 2 al usar
# find_displacement(). Esto se debe a que el algoritmo funciona mediante
# algo llamado correlación de fase, que realiza la comparación de imágenes
# usando FFT. Una resolución que no sea potencia de 2 requiere relleno hasta una potencia
# de 2, lo que reduce la utilidad de los resultados del algoritmo. Por favor,
# use una resolución como B64X64 o B64X32 (2 veces más rápido).
#
# Su OpenMV Cam admite resoluciones potencia de 2 de 64x32, 64x64,
# 128x64 y 128x128. Si desea una resolución de 32x32, puede crearla
# ejecutando "img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA)" sobre una imagen de 64x64.
import csi
import image
import time
import math
csi0 = csi.CSI()
csi0.reset() # Restablecer e inicializar el sensor.
csi0.pixformat(csi.RGB565) # Establecer el formato de píxel a RGB565 (o GRAYSCALE)
csi0.framesize((64, 64)) # Establezca el tamaño de fotograma en 64x64... (o 64x32)...
csi0.snapshot(time=2000) # Esperar a que los ajustes surtan efecto.
clock = time.clock() # Crear un objeto clock para registrar los FPS.
# Cree un segundo framebuffer en el heap.
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
extra_fb.draw_image(csi0.snapshot())
while True:
clock.tick() # Registre los milisegundos transcurridos entre snapshots().
img = csi0.snapshot() # Tomar una foto y devolver la imagen.
# Este algoritmo es difícil de probar sin un montaje perfecto... Así que aquí hay un truco para comprobar que funciona.
# Introduzca un valor de z_rotation abajo y debería ver que la salida r es igual a ese valor.
if 0:
expected_rotation = 20.0
img.rotation_corr(z_rotation=expected_rotation)
# Este algoritmo es difícil de probar sin un montaje perfecto... Así que aquí hay un truco para comprobar que funciona.
# Introduzca un valor de zoom abajo y debería ver que la salida z es igual a ese valor.
if 0:
expected_zoom = 0.8
img.rotation_corr(zoom=expected_zoom)
# En este ejemplo nunca actualizamos la imagen antigua, para medir el cambio absoluto.
displacement = extra_fb.find_displacement(img, logpolar=True)
# Los resultados de desplazamiento son ruidosos sin filtrado, por lo que sacrificamos algo de precisión.
rotation_change = int(math.degrees(displacement.rotation) * 5) / 5.0
zoom_amount = displacement.scale
if (
displacement.response > 0.1
): # Por debajo de 0.1 aproximadamente (según el caso), los resultados son solo ruido.
print(
"{0:+f}r {1:+f}z {2} {3} FPS".format(
rotation_change, zoom_amount, displacement.response, clock.fps()
)
)
else:
print(clock.fps())