ArUco Marker mit Matlab/Simulink erkennen - Einbindung von OpenCV über S-Function

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autor: Torben Müller
Betreuer: Prof. Schneider

Motivation

ArUco Marker ermöglichen eine low-cost Lokalisierung.

Ziel

Die Verarbeitung von ArUco Marken mit Matlab ermöglicht die Lokalisierung der Marker in einer realen Umgebung. So lässt sich mir einfachen Mitteln eine Lokalisierung (Ground Truth) realisieren. Position und Lage der Marker sollen in Echtzeit in Weltkoordinaten bestimmt werden.

Anforderungen

  1. Recherchieren Sie was ArUco Marker sind und wie sich diese in Position und Lage detektieren lassen.
  2. Erstellen Sie ArUko Marken mittels ArUko Generator.
  3. Nutzen Sie eine Webcam für die Detektion der Marker.
  4. Kalibrieren Sie diese Kameras.
  5. Setzen Sie ein Verfahren zur Bestimmung der Pose eines ArUko Markers durch die Einbindung von OpenCV über eine S-Funktion um.
  6. Transformieren Sie ein Objekt aus der Kameraperspektive in Weltkoordinaten.
  7. Stellen Sie die Objekte im Sichtfeld in der Draufsich metrisch dar.
  8. Schätzen Sie die Genauigkeit Ihres 3D-Sensors ab.
  9. Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
  10. Softwareentwicklung nach SDE Standard in SVN
  11. Funktionsnachweis als YouTube-Video (vgl. Veranstaltungsregeln)

Lösungen

Planung

Diese Lösung beschäftigt sich mit der Erkennung von ArUco Markern in dem Webcambild. Zuerst muss dazu ein Kamerabild eingelesen werden. Dieses wird im nächsten Schritt über eine Matlab Mex Funktion in die OpenCV Umgebung gebracht. Dort müssen verschiedene Bildverarbeitungsmethoden angewendet werden, um den ArUco Maker zu erkennen und anzuzeigen.

Matlab

In Matlab müssen folgende Schritte abgearbeitet werden:

  1. Die Kamera kalibrieren
  2. Ein Webcambild aufnehmen
  3. Die Kalibrierung auf das Bild anwenden
  4. Das neue Bild an die Mex Funktion übergeben

Schritt 1:

Für die Kamerakalibrierung bietet sich die Matlab App Camera Calibrator an. Dieses vorgefertigte Tool erleichert das Erstellen einer Kameramatrix für spätere benutzung. Dazu muss ein Schachbrettmuster ausgedruckt werden und damit eine Reihe von Kalibrierungsbildern erstellt werden. Dabei empfielt es sich, dass Muster vor allem in den Ecken des Bildes in vielen verschiedenen Winkeln festzuhalten, denn dort ist die Verzerrung oft am größten.

Beispiel der Positionierung der Schachbrettmuster in einer Beispielkalibrierung

Die App erstellt dann aus den erzeugten Bildern und Angaben zum Schachbrett ein Cell Array mit verschiedenen Informationen über die Kamera, unter anderem extrinsische und intrinsische Kameramatrizen. Dieser lässt sich abspeichern und später wieder in das Programm einladen.

Schritt 2:

Die wichtigste Funktion des Matlabprogrammes ist es, ein Bild der Webcam aufzunehmen. Dazu sind nur folgede zwei Zeilen zusammen mit der Image Acquisition Toolbox nötig:

cam = webcam;

frame = snapshot(cam);

Schritt 3:

Um die Kalibrierungsinformationen auf das eben aufgenommene Bild anzuwenden kann man die Funktion undistortImage verwenden. Diese benötigt ein Bild und das Cell Array der Kalibrierungsapp und gibt ein umgerechnetes Bild zurück.

Schritt 4:

Durch die Einbindung des C++ Codes durch eine Mex Funktion lässt sich dieser einfach über eine Funktion mit dem gleichen Namen wie die Datei starten.

mexOpenCV arucoDetect.cpp

... = arucoDetect( ... );


Open CV

Um in C++ mit Hilfe von OpenCV einen ArUco Marker zu erkennen, muss zuerst ein Frame eingelesen werden. Dieser muss vor verarbeitet werden um dann eine Erkennung eines Markers zu ermöglichen.

Für das Einlesen stellt das OpenCV Interface für Matlab Funktionen bereit, um Matlab Matrizen in OpenCV Mat Objekte umzuwandeln. Im nächsten Schritt wird eine Vorverarbeitung angewendet. Der Frame wird in Graustufen umgewandelt und danach mit einem Schwellwert bearbeitet. Hier wurde eine binärer Schwellwertfilter gewählt der bei Werten größer als 127 das Pixel auf Maximalwert setzt und sonst auf 0. Dazu eignet sich die Funktion threshhold mit dem Modus 0 für THRESH_BINARY.

Vergleichsmodell für ArUco Marker

Im nächsten Schritt werden aus dem Binärbild Konturen extrahiert. Dazu lässt sich der Befehl findContours verwenden. Diese Konturen stellen die Kanten des Binärbildes da und werden für die Erkennung eines ArUco Markers benötigt.

Für diese Erkennung wird die Funktion matchShapes verwendet. Diese vergleicht zwei Konturen mit einander und beurteilt, wie sehr beide sich ähneln mit einem Wert nahe 0. Je kleiner der Wert also ist, desto mehr ähneln sich die beiden Konturen. Um nun einen ArUco Marker zu erkennen, bietet sich eine Vergleichskontur an, die dem Marker möglichst ähnlich ist. Dazu wurde ein Quadrat erstellt, welches als Vergleichbild agiert um Konturen aus dem Frame zu prüfen

Dieses Quadrat wird ebenso mit findContours in eine Kontur umgewandelt und dann zusammen mit dem Frame der Funktion matchShapes übergeben. Vorher lohnt es sich, zu kleine Konturen zu ignorieren, indem die Fläche jeder Kontur ermittelt wird und zu kleine Konturen rausgefiltert werden. Hat die matchShapes Operation nun einen Wert kleiner 0,01 ermittelt und die Fläche der bearbeiteten Kontur ist größer als 2000, dann ist diese Kontur als ArUco Marker identifiziert. Als nächstes wird die Kontur auf dem unbearbeiteten übergebenen Frame eingezeichnet und beides dann zusammen als neuer Frame ausgegeben.






Video

In dem folgendem Video sieht man, wie die Erkennung eines ArUco Markers mit einem roten Rechteck im Frame verdeutlicht wird. Youtube-Video

Weblinks

BSD-Lizenzbedingung BSD-Lizenz

Copyright (c) 2014, Hochschule Hamm-Lippstadt, Dep. Lip. 1, Prof. Schneider
Hochschule Hamm-Lippstadt. Alle Rechte vorbehalten.



→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2018