Webcam unter Java mit OpenCV nutzen

An die Bilder einer Webcam zu kommen ist gar nicht so einfach. Ein wirklich gute Standardisierte API gibt es dafür leider nicht. Deswegen bleibt nur der Weg über eine Bibliothek. Nach einem Test der Processing API habe ich mich nun für OpenCV entschieden. OpenCV ist eine sehr weit verbreitete Bildverarbeitungsbibliothek aus dem C++ Umfeld. Mittlerweile gibt es auch ein offizielles Build für Android und Java SE. OpenCV ermöglicht ein zuverlässiges und schnelles auslesen der Webcam. Das folgende Listing zeigt wie man ein Bild von der Webcam ausliest und in einer Datei speichert:

View the code on Gist.

Um OpenCV nutzen zu können muss noch eine DLL für die entsprechende CPU Architektur (32- oder 64 Bit) geladen werden.

OpenCV auf dem Raspberry Pi kompilieren

OpenCV ist eine sehr leistungsfähige freie Bildverarbeitungsbibliothek. In diesem kleinen Tutorial möchte ich zeigen wie man OpenCV auf dem Raspberry Pi einrichtet. Und C++-Programme mit OpenCV erstellt. Da Bildverbeitung ein rechenintensiver Vorgang  und der RPi nicht grade über viel Rechenleistung Verfügt ist C++ die Sprache der Wahl.
Um OpenCV auf dem Raspi nutzen zu können benötigt man eine kompilierte Variante, da es bisher kein fertiges Build für den Raspberry Pi gibt. Beim kompilieren gibt es 2 Möglichkeiten:
  • Man kompiliert auf einen anderen Rechner für den Pi
    • Schnell, aber man braucht einen Rechner mit Cross-Compiler
  • Man kompiliert auf dem Raspberry selbst
    • Dauert etwas mehr als 7 Stunden.
Ich habe mich dafür Entschieden auf dem Raspberry Pi zu kompilieren. Für das Kompilieren auf einem Linux-System gibt es auf der OpenCV-Seite ein Tutorial (http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html). Ich habe auf dem Raspberry Pi Raspian laufen. Damit das kompilieren ohne Fehler laufen kann, müssen die nötigen Pakete installiert werden. Das geht mit:

View the code on Gist.

An der Abhängigkeit libgtk2.0-dev sieht man, dass es ohne X-Server zu Problemen kommen könnte.
Das kompilieren von OpenCV kann mit folgenden Script ausgeführt werden (Achtung das Script benötigt etwas mehr als 7 Stunden um OpenCV zu kompilieren):

View the code on Gist.

Danach ist OpenCV hoffentlich richtig installiert und man kann mit dem Entwickeln anfangen. Auch dafür gibt es ein offizielles OpenCV Tutorial für Linux:
Da ich meinen Raspberry Pi als Server ohne Monitor nutze habe ich das Program so umgeschireben, dass man ein Ergebnis auch ohne am Raspberry Pi angeschlossen en Monitor sehen kann. Folgendes Programm lädt ein Bild und passt Kontrast und Helligkeit an. Das Programm dient nur dazu um festzustellen ob OpenCV funktionsfähig ist, schönere Bilder darf man sich davon nicht erhoffen 😉

View the code on Gist.

Der Quelltext muss in der Datei DisplayImage.cpp gespeichert werden. Danach geht es ans kompilieren unseres Programms. OpenCV nutzt cmake als Helfer für den Build. Bei eigenen Projekten sollte man deshalb auch cmake benutzen. Um cmake nutzen zu können benötigen wir eine CMakeLists.txt mit folgenden Inhalt:

View the code on Gist.

Wie man der Datei entnehmen kann ist es wichtig das unsere Quellcode-Datei den Namen DisplayImage.cpp trägt. Durch aufruf von cmake . erzeugt cmake die eigentlich Builddatei im gewohnten make Format, also den Makefile. Nun kann man das Programm mit dem Befehl make kompilieren.
Danach kann man endlich das fertige Programm ausführen. Dazu benötigt man natürlich eine Bilddatei. Das Ergebnis kann man sich das per SCP oder ähnlichen Programmen auf den Rechner hohlen und angucken.

View the code on Gist.

[Linux]Paketquellen

Eine sehr schön Sache an Linux ist das Software installieren. Einfach apt-get install xy eingeben und schon wird das entsprechende Programm installiert. Leider wird manchmal eine veraltete Version des Programms installiert. Da stellte sich mir die Frage, wie kommt die Software in das OnlineRepository und wer aktualisiert es. Auch vom Standpunkt des Sicherheitsmanagement ist die Frage sehr interessant. Schließlich könnte über den Kanal wunderbar kompromittierte Software übertragen werden.

Ubuntu setzt bei Paketen auf das DebianRepository. Um ein Paket ins DebianRepository einzustellen muss man ein ein Ticket mit dem Status wishlist erstellen (Dies kann per Mail oder mit dem Tool reportbug geschehen). Das Paket selbst wird auf einen FTP-Server hochgeladen (ftp.upload.debian.org/pub/UploadQueue/ ). Erstaunlicherweise benötigt man für diesen FTP-Server keine Zugangsdaten, sondern man kann das Paket als anonymous hochladen. Danach muss sich eine berechtige Person dem Paket annehmen.

Der gesamt Vorgang wirkt auf mich recht komplex. Es gibt leider kein schönes Webinterface über das man alles machen kann. Dies mag auch dran liegen das Linux aus der Zeit vor dem WWW kommt und der Prozess immer noch weitgehend der selbe zu sein scheint. Darüber hinaus muss man auch erstmal ein Package erstellen, das ist nochmal eine Menge Aufwand. Das erstellen von Package Dateien (*.deb) ist mit dem Tool dpkg möglich. Aber mit dem Tool muss ich mich noch einmal genauer auseinander setzen.

Dies ist wahrscheinlich auch der Grund warum einige Paket nur sehr selten aktualisiert werden.

Links:

Links #6

Betriebssysteme

Stand 2013/4

Mobil:

  • Android
  • iOS
  • Windows Phone
  • Blackberry
  • Firefox OS
  • Ubuntu
  • Sailfish
  • Tizen

Desktop:

  • Windows
  • Mac OSX
  • Linux (Ubuntu)
  • Chrome OS

Und jetzt eine App für jede Plattform?

Nachtrag: Sailfish soll Android Apps nutzen können.

Links #5