linear_regression.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 lineare Regression
#
# Dieses Beispiel zeigt, wie die Methode get_regression() auf Ihrer OpenMV Cam verwendet wird,
# um die lineare Regression einer ROI zu ermitteln. Mit dieser Methode können Sie einfach
# einen Roboter bauen, der Linien verfolgen kann, die alle ungefähr in dieselbe Richtung zeigen,
# aber nicht tatsächlich verbunden sind. Verwenden Sie find_blobs() für Linien, die schön
# verbunden sind, um bessere Filteroptionen und Kontrolle zu erhalten.
#
# get_regression() läuft in O(N^2)-Zeit auf dem Bild. Um dies handhabbar zu halten,
# wird die Quell-ROI vor dem Anpassen der Linie flächenskaliert in einen temporären Puffer verkleinert;
# die Puffergröße ist über das Schlüsselwortargument target_size=(w, h) konfigurierbar
# (Standard (80, 60)). Übergeben Sie ein größeres Tupel, um mit höherer Auflösung zu arbeiten.
import csi
import time
THRESHOLD = (0, 100) # Graustufen-Schwellenwert für dunkle Dinge.
BINARY_VISIBLE = True # Zuerst ein Binärdurchgang, um zu sehen, worauf die lineare Regression läuft.
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
clock = time.clock() # um manchmal einen Frame zu verarbeiten.
while True:
clock.tick()
img = csi0.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else csi0.snapshot()
# Gibt ein Linienobjekt zurück, das den von find_lines() und
# find_line_segments() zurückgegebenen Linienobjekten ähnlich ist. Sie haben die Attribute x1, y1, x2, y2, length,
# theta (Rotation in Grad), rho und magnitude.
#
# magnitude gibt an, wie gut die lineare Regression funktioniert hat. Im Allgemeinen
# gilt: je größer der Wert, desto besser...
line = img.get_regression([(255, 255) if BINARY_VISIBLE else THRESHOLD])
if line:
img.draw_line(line, color=127)
print(
"FPS %f, mag = %s" % (clock.fps(), str(line.magnitude) if (line) else "N/A")
)
# Zu negativen rho-Werten:
#
# Ein [theta+0:-rho]-Tupel ist dasselbe wie [theta+180:+rho].