differential-rotation-scale.py
# Dieses Werk ist unter der MIT-Lizenz lizenziert.
# Copyright (c) 2013-2023 OpenMV LLC. Alle Rechte vorbehalten.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Differenzieller optischer Fluss Rotation/Skalierung
#
# Dieses Beispiel zeigt, wie Sie mit Ihrer OpenMV Cam
# Rotation/Skalierung messen, indem das aktuelle und das vorherige
# Bild miteinander verglichen werden. Beachten Sie, dass in diesem Modus nur Rotation/Skalierung
# verarbeitet wird - nicht die X- und Y-Translation.
#
# Um diese Demo effektiv auszuführen, montieren Sie Ihre OpenMV Cam bitte auf einer stabilen
# Unterlage und drehen Sie die Kamera LANGSAM um das Objektiv und bewegen Sie die Kamera
# vor und zurück, um zu sehen, wie sich die Werte ändern.
# D. h. nur Änderungen in Z-Richtung.
#
# HINWEIS: Bei der Verwendung von
# find_displacement() müssen Sie eine kleine Auflösung verwenden, die eine Zweierpotenz ist. Dies liegt daran, dass der Algorithmus auf
# der sogenannten Phasenkorrelation basiert, die den Bildvergleich
# mittels FFTs durchführt. Eine Auflösung, die keine Zweierpotenz ist, erfordert ein Auffüllen auf eine Zweierpotenz,
# was die Aussagekraft der Algorithmusergebnisse verringert. Bitte
# verwenden Sie eine Auflösung wie B64X64 oder B64X32 (2x schneller).
#
# Ihre OpenMV Cam unterstützt Zweierpotenz-Auflösungen von 64x32, 64x64,
# 128x64 und 128x128. Wenn Sie eine Auflösung von 32x32 wünschen, können Sie diese
# erzeugen, indem Sie "img.scale(x_scale=0.5, y_scale=0.5, hint=image.AREA)" auf ein 64x64-Bild anwenden.
import csi
import image
import time
import math
csi0 = csi.CSI()
csi0.reset() # Sensor zurücksetzen und initialisieren.
csi0.pixformat(csi.RGB565) # Pixelformat auf RGB565 (oder GRAYSCALE) setzen
csi0.framesize((64, 64)) # Bildgröße auf 64x64 setzen ... (oder 64x32) ...
csi0.snapshot(time=2000) # Warten, bis die Einstellungen wirksam werden.
clock = time.clock() # Ein Clock-Objekt erstellen, um die FPS zu verfolgen.
# Erstellt einen zweiten Framebuffer auf dem Heap.
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
extra_fb.draw_image(csi0.snapshot())
while True:
clock.tick() # Erfasst die vergangenen Millisekunden zwischen den Aufrufen von snapshots().
img = csi0.snapshot() # Nimmt ein Bild auf und gibt es zurück.
# Dieser Algorithmus ist ohne eine perfekte Vorrichtung schwer zu testen ... Hier ist daher ein Trick, um zu sehen, dass er funktioniert.
# Geben Sie unten einen z_rotation-Wert ein, und die r-Ausgabe sollte diesem entsprechen.
if 0:
expected_rotation = 20.0
extra_fb.rotation_corr(z_rotation=(-expected_rotation))
# Dieser Algorithmus ist ohne eine perfekte Vorrichtung schwer zu testen ... Hier ist daher ein Trick, um zu sehen, dass er funktioniert.
# Geben Sie unten einen zoom-Wert ein, und die z-Ausgabe sollte diesem entsprechen.
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)
# Offset-Ergebnisse sind ohne Filterung verrauscht, daher nehmen wir eine geringere Genauigkeit in Kauf.
rotation_change = int(math.degrees(displacement.rotation) * 5) / 5.0
zoom_amount = displacement.scale
if (
displacement.response > 0.1
): # Unter etwa 0.1 (YMMV) sind die Ergebnisse nur noch Rauschen.
print(
"{0:+f}r {1:+f}z {2} {3} FPS".format(
rotation_change, zoom_amount, displacement.response, clock.fps()
)
)
else:
print(clock.fps())