Objekterkennung für Augmented Reality – Teil II

Im ersten Teil des Beitrags bin ich auf einige Möglichkeiten zur Objekterkennung mittels Kantendetektion eingegangen. Dieser zweite Teil beschäftigt sich mit den erweiterten Möglichkeiten der Bildverarbartung wie z.B. dem SIFT-Verfahren. Es ist eine Methode, um lokale Merkmalspunkte in Bildern zu beschreiben und wiederzufinden. Diese Merkmale sind skalierungs-, positions- und rotationsinvariant und teilweise invariant gegenüber Änderungen der Beleuchtungsverhältnisse und des Blickwinkels der Kamera. Damit ist es möglich viel komplexere Objekte in einem Bild zu erkennen.

In den nächsten beiden Bildern ist die Anwendung von SIFT zu sehen:

SIFT_Testbild

Anwendung des SIFT-Verfahrens mit drei fehlerhaften Zuordnungen

SIFT_Verfahren 2

Anwendung des SIFT-Verfahrens mit einer fehlerhaften Zuordnung


Bei den beiden Bildern kann beobachtet werden, dass unter anderem auch falsche Zuordnungen der Merkmalspunkte erkannt werden. Durch verschiedene anschließende Verfahren ist es möglich die falschen Zuordnungen zu minimieren. Oft wird dafür der RANSAC-Algorithmus verwendet. Ich habe bei meiner Diplomarbeit den gleichen Ansatz genommen und weiterentwickelt. Nachdem die falschen Zuordnungen minimiert oder gar komplett aussortiert sind, kann das gesuchte Objekt im Bild lokalisiert werden.

Lokalisierung des Objekts

Lokalisierung des Objekts

 

Objekterkennung für Augmented Reality – Teil I

In dieser Beitragsreihe möchte ich einige Ausschnitte meiner Diplomarbeit zum Thema “Objekterkennungs- und Trackingverfahren für Augmented Reality Anwendungen” vorstellen, welche ich im Jahr 2008 geschrieben habe. Obwohl die Arbeit schon einige Jahre zurückliegt und zur Zeit (Anfang 2015) bereits viele Anwendungen von “Augmented Reality” z.B. im Umfeld des vor kurzem eingestellten Projektes Google Glass existieren, enthält sie Aspekte welche auch jetzt durchaus aktuell sind. Die Zielsetzung der Arbeit war es Objekte mittels Bildverarbeitung in einem Bild zu erkennen, genau zu lokalisieren und im nächsten Schritt in einer Video-Sequenz zu tracken.

Die Komplexität der Aufgabe “Objekte automatisch in einem Bild zu erkennen”, hängt größtenteils vom Bildmaterial und Objekteigenschaften ab. So ist es zum Beispiel vergleichsweise einfach klar abgegrenzte, einfach konturierte Objekte vor einem weißen Hintergrund im folgenden Testbild automatisch zu erkennen.

Testbild

Testbild

Dies kann mit Hilfe der Hough-Transformation in mehreren Schritten mit relativ wenig Rechenzeit umgesetzt werden. Vor der Anwendung der Hough-Transformation muss das Testbild zu einem Binärbild vorverarbeitet werden. Der wichtigste
Schritt dieser Vorverarbeitung ist die Kantendetektion. Am weitesten verbreitet dafür ist die Kantendetektion mit dem Canny-Algorithmus.

Canny Kantendetektor

Anwendung des Canny-Kantendetektors

Nachdem für die Hough-Transformation einige Parameter zur Erkennung von Kreisen und Linien optimiert werden, führt es zum folgenden Ergebnis.

Hough-Transformation

Anwendung der Hough-Transformation

Wenn man die erkannten Formen erneut im Testbild einblendet, werden die Objekte lokalisiert.

Testbild bearbeitet

Einblendung im Testbild

Diese Methode kann jedoch für die Objekterkennung in einem Augmented Reality Umfeld nur bedingt eingesetzt werden. Ein Vorteil ist, dass man für die Erkennung der einfachen Formen kein Referenzbild braucht. Die erkannten Formen sollten allerdings einem Objektkontext zugeordnet werden, was im Anwendungsfall häufig nicht gegeben ist. Es können nur einfache Objekte mit geometrischen, parametrierbaren Formen erkannt werden, die diese einfache Struktur bereits aufweisen oder durch Vorverarbeitungsalgorithmen wie Segmentierung auf diese Form gebracht wurden. Außerdem dürfen mögliche Anwendungen nur minimale Änderungen der Umgebungseinflüsse wie z.B. Belichtungsverhältnisse vorweisen.

Tutorial: CakePHP mit XAMPP installieren

Dieses Tutorial beschreibt wie CakePHP mit XAMPP auf einem Windows-Betriebssystem installiert werden kann. Es richtet sich größtenteils an Anfänger. Die beschriebene Installation kann anschließend z.B. als eine lokale Entwicklungsumgebung genutzt werden.

Verwendete Versionen:
- Windows 7
– XAMPP 3.2.1
– CakePHP 2.5.5

1. XAMPP installieren. XAMPP kann hier heruntergeladen werden: https://www.apachefriends.org/de/download.html.

Während der Installation muss ein frei wählbarer Installationspfad angegeben werden. Für die nächsten Schritte des Tutorials wird davon ausgegangen, dass folgender Pfad angegeben wurde:

C:\xampp

2. CakePHP herunterladen. CakePHP kann hier heruntergeladen werden:  https://github.com/cakephp/cakephp/tags.

Falls keine weiteren Abhängigkeiten existieren, würde ich empfehlen die letzte Nicht-Beta-Version zu nehmen. Die heruntergeladene ZIP-Datei sollte unter dem folgenden Pfad kopiert und anschließend extrahiert werden:

C:\xampp\htdocs

Nach dem Extrahieren empfiehlt es sich den Hauptordner so umzubenennen, dass es dem Projektnamen entspricht. In diesem Tutorial nennen wir das Projekt “homepage”. Falls durch das Extrahieren eine weitere Ordnerebene dazugekommen ist, so ist diese zu entfernen. Der resultierende Pfad für den Ordner “app” (der Ordner befindet innerhalb von CakePHP) sollte wie folgt aussehen:

C:\xampp\htdocs\homepage\app

3. Eintrag in der hosts-Datei. Damit der Windows-Rechner die neue URL, unter welcher das neue System im Browser aufrufbar sein soll, erkennt, muss es in der hosts-Datei eingetragen werden. Diese Datei hat keine Dateiendung und heißt einfach “hosts”. Sie ist unter folgendem Pfad zu finden:

 C:\windows\system32\drivers\etc

Achtung: damit die Datei editiert werden kann, muss im Texteditor mit Administrator-Rechten gearbeitet werden. Der Text-Editor Notepad++ bietet dazu beispielsweise die Möglichkeit sich selbst mit Administratorrechten auszuführen (das Programm mit der rechten Maustaste anklicken).

Wir nehmen an, dass die neue Installation später unter “homepage.localhost” im Browser aufrufbar sein soll. Als letzte Zeile sollte in der hosts-Datei folgendes hinzugefügt werden:

127.0.0.1       homepage.localhost

4. Eintrag in httpd-vhosts.conf

In httpd-vhosts.conf werden sogenannte vhosts für den Apache-Server verwaltet. Durch diesen Eintrag weiß der Server u.a. wo im Dateisystem sich für eine bestimmte URL der Inhalt befindet. Diese Datei ist im folgenden Ordner zu finden:

C:\xampp\apache\conf\extra

Am Dateiende sollte in unserem Fall folgender Inhalt hinzugefügt werden:

<VirtualHost *:80>
 ServerName homepage.localhost
 DocumentRoot "C:/xampp/htdocs/homepage"
</VirtualHost>

Hinweis: diese Installation geht davon aus, dass ausschließlich der Port 80 (http) verwendet wird. Ist die Verwendung eines anderen Ports wie etwa 443 für den SSL-Protokoll notwendig, so ist dies ebenfalls entsprechend in httpd-vhosts.conf einzutragen.

5. Apache- und MySQL-Server starten

start_xampp

Falls der Apache-Server nicht startet:

  • Ein häufiges Problem warum der XAMPP-Apache-Server nicht gestartet wird, ist das Blockieren des Ports 80. Dieser wird z.B. standardmäßig von Skype oder auch anderer Software verwendet. Um das Problem zu umgehen, hilft es das betroffene Programm zu Beenden und erst danach den Apache-Server zu starten.
  • Wenn man das betroffene Programm weiterhin parallel zum Apache-Server verwenden möchte, so kann man versuchen das Programm bei laufendem Apache neu zu starten. Viele Programme suchen sich dann einen neuen Port aus und funktionieren trotzdem (Skype verhält sich z.B. entsprechend).

Falls der XAMPP-Apache-Server bereits gestartet war, sollte nach dem Ausführen des Schrittes 4 ein Neustart ausgeführt werden.

6. Erster Aufruf im Browser
Beim ersten Aufruf der konfigurierten URL homepage.localhost im Browser sollte nun CakePHP eine Tafel mit der Information anzeigen, was noch getan werden muss damit das System einsatzbereit ist:

Ausgabe von CakePHP nach Schritt 5

Ausgabe von CakePHP nach Schritt 6

7. Änderung der Variablen Security.salt und Security.cipheerSeed.
Standardmäßig wird ein sogenannter salt und cipherSeed bei jeder Installation mit angegeben. Diese Standardwerte sind in der folgenden Datei zu ändern:

C:\xampp\htdocs\homepage\app\Config\core.php

In der Installation mit dieser Anleitung sind das die Zeilen 225 und 230:

Version vor der Editierung des Salts

Version vor der Änderung des Salts

Ich empfehle die Variablen jeweils mindestens an drei zufälligen Stellen zu ändern.

8. Einrichtung der Datenbank (optional)
Grundsätzlich ist die Verknüpfung mit einer Datenbank für den Betrieb von CakePHP nicht notwendig. In den meisten Fällen ist es jedoch sinnvoll bei einem CakePHP-Projekt mit einer Datenbank zu arbeiten.

Bei XAMPP besteht die Möglichkeit die Datenbank mittels des Programms phpmyadmin zu verwalten. phpmydmin erreicht lokal man unter:

http://localhost/phpmyadmin/

Als erstes muss eine neue Datenbank angelegt werden. Wir nennen sie “homepage”:

db_homepageAnschließend ist die Datenbank in der DB-Konfigurationsdatei von CakePHP einzutragen. Die Vorlage für diese Datei befindet sich im folgenden Ordner:

 C:\xampp\htdocs\homepage\app\Config\database.php.default

Diese Datei muss zunächst in database.php umbenannt werden. Danach müssen die Zeilen 71-80 der Datei in unserem Fall wie folgt geändert werden:

 public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => true,
        'host' => 'localhost',
        'login' => 'root',
        'password' => '',
        'database' => 'homepage',
        'prefix' => ''
        //'encoding' => 'utf8',
    );

Hinweis: als DB-User wurde in diesem Beispiel der Root-User der lokalen XAMPP-Datenbank verwendet. Dies ist für eine lokale Umgebung akzeptabel. Auf einer Test- bzw. Produktionsumgebung sollte ein anderer DB-User bzw. Passwort verwendet werden.

9. Zweiter Aufruf im Browser

Nun sollte nach einem erneuten Aufruf der konfigurierten URL homepage.localhost im Browser folgendes zu sehen sein:

cakephp_2Das System ist jetzt einsatzbereit:

  • Die einzige “nicht grüne” Meldung, ist die Meldung über das Fehlen des CakePHP-DebugKits. Dies ist kein notwendiges Tool. Es kann aber für die Entwicklung und Debugging sehr hilfreich sein, indem es z.B. die aktuellen Session- und Request-Variablen direkt im Browser anzeigt.

Viel Spaß mit der neuen Installation!

Clean Code

Im Programmieralltag ist es oft nicht einfach “sauberen” Code zu produzieren. Ursachen dafür ist neben dem Zeit- und Kostendruck oft auch die mangelnde Kenntnis was diese “Sauberkeit” bedeuten soll.

Je nach verwendeter Technologie, Projekt-Philosophie und der Auffassung einzelner Projektbeteiligter kann dieser Begriff sehr unterschiedlich definiert werden. Die nachfolgende Liste beinhaltet einige der Punkte, welche ich als Schnittmenge der “Sauberkeit” in verschiedenen Projekten für mich herausgearbeitet habe. Diese Liste spiegelt ausschließlich meine persönlichen Erfahrungen wieder und hat keinen Anspruch auf Vollständigkeit.

Stark beeinflusst hat mich dabei das “Clean Code”-Buch von Robert C. Martin auch als “Uncle Bob” bekannt, welches ich an dieser Stelle bei Interesse an diesem Thema als weiterführende Literatur empfehlen möchte. Link zu Amazon: http://www.amazon.de/Clean-Code-Refactoring-Patterns-Techniken/

  •  Code ohne Kommentare. Ich vertrete die Meinung, dass der Code durch die richtige Benennung der Variablen und richtige Programmierweise ohne Kommentare auskommen soll. Vielmehr sollte der Code so geschrieben werden, dass er selbsterklärend ist. Es gibt jedoch Ausnahmen. Dazu zählen für mich:
    • Dokumentation einer externen Schnittstelle (API). Dies kann auch in einem zusätzlichem Dokument erfolgen
    • Eine Code-Ausnahme, welche nur durch eine Besonderheit in der Fachlichkeit zu erklären ist.
      // Ausnahme, da es zwei Kategorien mit dem gleichen
      // Namen 'Taschen' geben kann.
      if(categoryName == 'Taschen') {
         ...
      }
  • Vielsagende Benennung der Code-Elemente. Dieser Punkt schließt unmittelbar an dem vorherigen Punkt an. Damit der Code leichter zu verstehen ist die effektivste Methode sich etwas mehr Gedanken über die Namen der Elemente zu machen aus denen der Code besteht. Dies sind solche Elemente wie z.B. Variablen, Funktionen oder Klassen. Dabei ist im Zweifel ein etwas längerer und damit mehr erklärender Name klar im Vorteil. Demgegenüber steht die Meinung das kürzere und damit auch “schickere” Benennung leichter zu lesen sind. Diese Meinung teile ich jedoch nicht.
  • Kein Auskommentieren. Jede Entwickler ist bestimmt schon einmal über den auskommentierten Code eines anderen Entwicklers gestolpert und hat sich dabei oft gefragt, wozu dieser Code da ist. Meistens denkt man, dass es ziemlich wichtig sein muss: denn es wurde ja nicht gelöscht, sondern nur “auskommentiert”. Somit traut man sich nicht diesen Code entfernen, was dazu führt dass so ein Code-Schnipsel unnötig mehrere Code-Refactorings “überlebt”. Um diese Probleme zu vermeiden und aufgrund weiterer Vorteile empfiehlt es sich Versionsverwaltungssysteme wie z.B. GIT oder SVN zu verwenden. Falls dieser Code später verwendet werden soll, so kann die in der Versionsverwaltung gespeicherte Commit-Message dazu benutzt werden ihn ausfindig zu machen.
  • DRY-Prinzip. “Do Not Repeat Yourself” ist eines der bekanntesten Prinzipien in der Programmierung. Folgende Anwendungsfälle kamen am häufigsten in meinen Projekten vor:
    • Kapselung sich wiederholender Code-Teile in eine Funktion
    • Bei OOP-Systemen die Auslagerung von Funktionen in eine übergeordnete Klasse