in_memory_advanced_frame_differencing.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
#
# Beispiel für fortgeschrittene Frame-Differenzbildung
#
# Dieses Beispiel demonstriert die Verwendung von Frame-Differenzbildung mit Ihrer OpenMV Cam. Dieses
# Beispiel ist fortgeschritten, weil es eine Aktualisierung des Hintergrunds durchführt, um mit der
# sich mit der Zeit ändernden Hintergrundbildproblematik umzugehen.
import csi
import image
import time
TRIGGER_THRESHOLD = 5
BG_UPDATE_FRAMES = 50 # Wie viele Frames vor dem Überblenden.
BG_UPDATE_BLEND = 128 # Wie stark geblendet werden soll... ([0-255]==[0.0-1.0]).
csi0 = csi.CSI()
csi0.reset() # Sensor zurücksetzen und initialisieren.
csi0.pixformat(csi.RGB565) # oder csi.RGB565
csi0.framesize(csi.QVGA) # oder csi.QQVGA (oder andere)
csi0.snapshot(time=2000) # Neue Einstellungen wirksam werden lassen.
csi0.auto_whitebal(False) # Weißabgleich ausschalten.
clock = time.clock() # Verfolgt die FPS.
# Erstellt einen zweiten Framebuffer auf dem Heap.
extra_fb = image.Image(csi0.width(), csi0.height(), csi0.pixformat())
print("About to save background image...")
csi0.snapshot(time=2000) # Dem Benutzer Zeit geben, sich bereitzumachen.
extra_fb.draw_image(csi0.snapshot())
print("Saved background image - Now frame differencing!")
triggered = False
frame_count = 0
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.
frame_count += 1
if frame_count > BG_UPDATE_FRAMES:
frame_count = 0
# Neuen Frame einblenden. Wir verwenden hier 255-alpha, weil wir
# den neuen Frame in den Hintergrund einblenden wollen. Nicht den Hintergrund in den
# neuen Frame, was einfach alpha wäre. Blend ersetzt jedes Pixel durch
# ((NEW*(alpha))+(OLD*(255-alpha)))/255. Ein niedriger alpha-Wert führt also zu
# geringer Überblendung des neuen Bildes, während ein hoher alpha-Wert zu starker
# Überblendung des neuen Bildes führt. Wir müssen das für dieses Update umkehren.
img.blend(extra_fb, alpha=(255 - BG_UPDATE_BLEND))
extra_fb.draw_image(img)
# Das Bild durch die Frame-Differenz "abs(NEW-OLD)" ersetzen.
img.difference(extra_fb)
hist = img.get_histogram()
# Der folgende Code funktioniert, indem er den Wert des 99. Perzentils (z. B. den
# Nicht-Ausreißer-Maximalwert) mit dem Wert des 90. Perzentils vergleicht (z. B. einen Nicht-Maximal-
# Wert). Die Differenz zwischen den beiden Werten wächst, je mehr Pixel im
# Differenzbild sich zu ändern scheinen.
diff = hist.get_percentile(0.99).l_value - hist.get_percentile(0.90).l_value
triggered = diff > TRIGGER_THRESHOLD
print(clock.fps(), triggered) # Hinweis: Ihre OpenMV Cam läuft etwa halb so schnell, während
# sie mit Ihrem Computer verbunden ist. Die FPS sollten sich erhöhen, sobald die Verbindung getrennt wird.