find_lines.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: Linien finden
#
# Dieses Beispiel zeigt, wie man Linien im Bild findet. Für jedes gefundene Linienobjekt
# im Bild wird ein Linienobjekt zurückgegeben, das die Rotation der Linie enthält.
# Hinweis: Die Linienerkennung erfolgt mittels der Hough-Transformation:
# http://en.wikipedia.org/wiki/Hough_transform
# Bitte lesen Sie den obigen Link für weitere Informationen darüber, was `theta` und `rho` sind.
# find_lines() findet Linien unendlicher Länge. Verwenden Sie find_line_segments(), um nicht-unendliche Linien zu finden.
import csi
import time
ENABLE_LENS_CORR = False # aktivieren für geradere Linien ...
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565) # Graustufen ist schneller
csi0.framesize(csi.QQVGA)
csi0.snapshot(time=2000)
clock = time.clock()
# Alle Linienobjekte besitzen ein Attribut `theta`, um ihren Rotationswinkel in Grad zu erhalten.
# Sie können Linien anhand ihres Rotationswinkels filtern.
min_degree = 0
max_degree = 179
# Alle Linien besitzen außerdem die Attribute `x1`, `y1`, `x2` und `y2`, um ihre Endpunkte zu erhalten.
# Linienobjekte können direkt an `draw_line()` übergeben werden.
while True:
clock.tick()
img = csi0.snapshot()
if ENABLE_LENS_CORR:
img.lens_corr(1.8) # für ein 2,8-mm-Objektiv ...
# `threshold` steuert, wie viele Linien im Bild gefunden werden. Nur Linien mit
# einer Summe der Kantendifferenz-Beträge größer als `threshold` werden erkannt ...
# Mehr zu `threshold` - jedes Pixel im Bild trägt einen Betragswert bei
# zu einer Linie. Die Summe aller Beiträge ist der Betrag (Magnitude) dieser Linie. Wenn
# Linien zusammengeführt werden, werden ihre Beträge addiert. Beachten Sie, dass `threshold`
# Linien mit niedrigem Betrag vor dem Zusammenführen herausfiltert. Um den Betrag von
# nicht zusammengeführten Linien zu sehen, setzen Sie `theta_margin` und `rho_margin` auf 0 ...
# `theta_margin` und `rho_margin` steuern das Zusammenführen ähnlicher Linien. Wenn sich die
# Differenzen der theta- und rho-Werte zweier Linien innerhalb der Margen befinden, werden sie zusammengeführt.
for l in img.find_lines(threshold=1000, theta_margin=25, rho_margin=25):
if (min_degree <= l.theta) and (l.theta <= max_degree):
img.draw_line(l, color=(255, 0, 0))
# print(l)
print("FPS %f" % clock.fps())
# Zu negativen rho-Werten:
#
# Ein [theta+0:-rho]-Tupel ist dasselbe wie [theta+180:+rho].