LBotics.at

Für die in der Folge angeführten Codebeispiele werden grundlegende Python-Kenntnisse vorausgesetzt, diese sind nicht Bestandteil dieses Tutorials!

Dieses erste Beispiel zeigt die grundsätzliche Verarbeitung und Analyse der Bilddaten einer OpenMV Cam. Dabei soll ein grüner Ball gefunden und im LIVE-Bild ein umrandendes Rechteck dieses Farbbereichts gezeichnet werden.

Nach dem Import der benötigten Module erfolgt die Konfiguration des Sensor-Objekts (# setup camera). Darin werden z. B. die Auflösung der Kamerabilder und der Farbmodus festgelegt, mit dem die Bilder aufgenommen werden sollen.

Im Anschluss daran (# find blobs) werden innerhalb einer while-Schleife laufend Farbbereiche - sogenannte blobs - nach den jeweiligen, gewünschten Kriterien gesucht und deren Koordinaten weiterverarbeitet.

Ablauf des Skripts im Details

In diesem Skript wir der RGB565 Farbraum gewählt (16 bit für den rot, blau und grün-Anteil der Farbe eines Pixels) und die Auflösung auf QQVGA (160x120 Pixel) festgelegt. Beim Suchen von blobs wird zunächst mit der Funktion sensor.snapshot() das aktuelle Bild im Objekt img abgelegt. Nun kann mit der Funktion img.find_blobs([threshold]) dieses Bild nach blobs durchsucht werden, deren Pixel in den Farbbereich der vorgegebenen threshold-Werte fallen.

Mit der Funktion img.draw_rectangle() wird in der LIVE-Ansicht des Videostrams ein Rechteck mit den Koordinaten des gefundenen blobs bzw. Farbbereichs gezeichnet. Abschließend werden die Koordinatenangaben des blobs noch im Serial Terminal ausgegeben. Zur Anzeige des Serial Terminal klickt man in der OpenMV IDE einmal auf Serial Terminal.

Ansicht des laufenden Skripts in der OpenMV IDE

Das Python-Skript zum Finden eines grünen Balls
import sensor, image, time

# setup camera
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(10)
threshold = (10, 90, -80, -30, 20, 50)

# find blobs
while(True):
img = sensor.snapshot()
blobs = img.find_blobs([threshold])
for b in blobs:
img.draw_rectangle(b[0:4])
print("x:%d y:%d w:%d h:%d" % (b[0],b[1],b[2],b[3]))
Erklärungen zu diesem Programmbeispiel

Zeile 4: sensor.reset()

Mit dieser Funktion wird der Kamerasensor initialisiert.

Zeile 5: sensor.set_pixformat(sensor.RGB565)

Hiermit wird festgelegt, dass die Farbwerte eines Kamerabbildes im RGB565 Format aufgenommen werden. RGB565 ist ein Farbformat, bei dem 16 Bits pro Pixel verwendet werden, wobei 5 Bits für Rot, 6 Bits für Grün und 5 Bits für Blau stehen. Es bietet eine ausreichende Farbauflösung für viele Anwendungen und ist besonders effizient in Bezug auf Speicherplatz und weitere Verarbeitung der Bildinformationen bei rechenintensiven Auswertungen.

Zeile 6: sensor.set_framesize(sensor.QQVGA)

In dieser Zeile wird die Größe eines aufgenommenen Bildes auf 160x120 Pixel festgelegt.

Zeile 7: sensor.skip_frames(10)

Die Funktion sensor.skip_frames(10) sollte immer aufgerufen werden, um das Kamerabild nach Änderung der Kameraeinstellungen (z. B. Farbformat oder Bildgröße) zu stabilisieren. In diesem Fall werden 10 Bilder übersprungen bis mit der Auswertung der Bilddaten begonnen wird.

Zeile 8: threshold = (10, 90, -80, -30, 20, 50)

Hier wird eine Liste von Werten im LAB-Farbmodell angegeben, das die gewünschte Farbe (hier das grün des Balls) beschreibt. Das LAB-Farbmodell ist ein Farbmodell, das aus drei Komponenten besteht: L (Lichtstärke), a (Grün-Rot-Achse) und b (Blau-Gelb-Achse). Die Bestimmung dieser Werte für blobs, die erkannt werden sollen kann mit einem Tool der OpenMV IDE erfolgen. Dies wird weiter unten erklärt.

Zeile 12: img = sensor.snapshot()

In dieser Zeile wird ein Bild des Kamerasensors aufgenommen und im Objekt img abgeleget.

Zeile 13: blobs = img.find_blobs([threshold])

Mit der Funktion img.find_blobs([threshold]) werden im aufgenommenen Bild alle Farbbereiche gesucht, welche den LAB-Werten in der threshold-Liste entsprechen und im Array blobs abgelegt.

Zeile 14: for b in blobs:

Mit dieser Schleife wird ein Farbbereich nach dem anderen aus dem Array blobs ausgewählt und im Array blob abgelegt. Dort befinden sich die Koordinaten-Angaben des umrahmenden Rechtecks eines gefundenen Farbbereichs.

  • b[0]: x-Koordinate des linken oberen Eckpunkts des Rechtecks
  • b[1]: y-Koordinate des linken oberen Eckpunkts des Rechtecks
  • b[2]: Breite des Rechtecks
  • b[3]: Höhe des Rechtecks

Zeile 15: img.draw_rectangle(b[0:4])

Mit der Funktion img.draw_rectangle(b[0:4]) wird in der LIVE-Ansicht der OpenMV IDE ein Rechteck mit den Koorinaten-Angaben des gefundenen Farbbereichs gezeichnet.

Zeile 16: print("x:%d y:%d w:%d h:%d" % (b[0],b[1],b[2],b[3]))

Die Funktion print() dient zur Ausgabe von Text im Serial Terminal. Hier wird ein String zusammengestellt, in den die Werte von b[0], b[1], b[2] und b[3] eingesetzt werden.

Ermitteln der LAB-Werte für ein Objekt

Zum Finden von Objekten in Bildern müssen Farbdefinitionen im LAB-Farbraum angegeben werden. Eine solche setzt sich aus drei Werten zusammen: L (Lichtstärke), A (Grün-Rot-Achse) und B (Blau-Gelb-Achse). Der entsprechende LAB-Wert für reines Rot beträgt ungefähr (53,80,67). Ein etwas helleres Rot könnte (55,73,50) sein.

Bei unterschiedlichen Lichtverhältnissen wird ein Kamerasensor für ein und dieselbe Farbe unterschiedliche LAB-Werte liefern. Deshalb verwendet man bei der Auswertung von Bilddaten, in denen spezielle Farbbereiche gefunden werden sollen, nicht exakte LAB-Werte, sondern Bereichsangaben, in denen die drei Werte liegen sollen, z. B. zum Finden eines roten Farbbereichs L: 53-55 A: 73-80 B: 50-67.

Bei einer OpenMV Cam wird der Funktion img.find_blobs([threshold]) wird ein solcher Schwellenwertbereich für den L, A und B - Wert übergeben.

Der Schwellenwert-Editor

Wie werden nun sochle threshold-Angaben ermittelt? Dazu stellt die OpenMV IDE ein Tool zur Verfügung, mit dem es sehr einfach ist, die sechs Werte für ein gewünschtes Objekt zu finden.

Eine OpenMV Cam wird mit der OpenMV IDE verbunden, der LIVE-Stream gestartet und das gewünschte Objekt wird in Bildmitte platziert. Das Tool zum Finden der Schwellenwerte wird aus dem Hauptmenü mit Extras > Machine Vision > Schwellenwert-Editor gestartet. Bei der Frage nach der Quellposition wählt man Bildspeicher, Framebuffer.

Nun können mit den Schiebereglern die optimalen Wertebereiche für L, A und B gesucht werden:

Die besten Werte wurden gefunden, wenn das gewünschte Objekt in der rechten Ansicht weiß dargestellt wird und der gesamte Rest des Bildes schwarz ist. Am unteren Rand werden die 6 threshold-Werte angezeigt, die nun für das Findes dieses Objekts in einem Bild in den Python-Code aufgenommen werden können. Hier die Werte (10, 90, -80, -30, 20, 50) die bereits im vorigen Code-Beispiel zum Finden eines grünen Balls verwendet wurden.

Verwenden des Histogramms

Um eine grobe Vorstellung vom LAB-Farbbereich des Zielobjekts zu bekommen, kann man die Histogrammansicht auf der rechten Seite in OpenMV IDE verwenden. Zunächst muss diese auf dem LAB-Farbmodus eingestellt werden. Mit dem Mauszeiger zeichnet man ein Rechteck direkt über dem Zielobjekt in der LIVE-Ansicht. Nun kann man im Histogramm sehen, welche Farbwerte am häufigsten vorkommen. Diese Min- und Max-Werte können als Ausgangspunkt für die Bestimmung der optimalen Wertebereiche mit dem Schwellenwert-Editor verwendet werden.