Suchen

Vom Bildanzeiger bis zur Gesichtserkennung – Grafikverarbeitung mit OpenCV

Autor / Redakteur: Mirco Lang / Stephan Augsten

Viele Bibliotheken vereinfachen dem Entwickler die Arbeit ungemein, dies gilt auch für die Open Cource Computer Vision Library. OpenCV bietet über 2.500 Algorithmen rund um die Verarbeitung und Analyse von Bildmaterial.

Als offene Bibliothek für die Bildverarbeitung bietet OpenCV diverse Zusatzmodule, beispielsweise für die Gesichtserkennung.
Als offene Bibliothek für die Bildverarbeitung bietet OpenCV diverse Zusatzmodule, beispielsweise für die Gesichtserkennung.
(Bild: teguhjatipras - Pixabay.com / CC0 )

OpenCV gibt es bereits seit 1999, initiiert von Intel in Russland. Von 2008 an hat dann Willow Garage das Projekt betrieben, dann hat Itseez übernommen – bis Intel im Jahr 2016 wiederum Itseez übernommen und damit auch OpenCV wieder zurück ins eigene Haus geholt hat.

Die Bibliothek wird als Open-Source-Projekt gepflegt und hat eine sehr aktive Community; beispielsweise wurden beim letztjährigen Google Summer of Code gleich mehrere Projekte durchgeführt. Die letzten Releases 3.3 und 3.4 stammen aus August und Dezember 2017. Und erfreulicherweise ist OpenCV zudem noch sehr gut dokumentiert – oder sagen wir: sehr umfangreich.

Die API hat gleich mehrere (automatisierte) Dokumentationen in unterschiedlichen Versionsständen und mit unterschiedlichen Informationen. Beispielsweise finden sich teils nur die C++-Notationen, in anderen Versionen gibt es auch die für viele wichtige Python-Syntax, etwa in der aktuellen Doxygen-HTML-Version. Hinzu gesellen sich etliche offizielle sowie inoffizielle Artikel und Code-Beispiele zu einzelnen Anwendungsszenarien, die qualitativ und bezüglich des benötigten Vorwissens natürlich stark variieren.

Die enorme Menge an Funktionen und die entsprechend umfangreiche und verzweigte Dokumentation verlangen nach einer gründlichen Einarbeitung – aber die lohnt sich! Eine deutliche Erleichterung bieten die vielen Zugriffsmöglichkeiten. OpenCV basierte anfangs auf C, mittlerweile auf C++.

Es gibt Schnittstellen für C++, C, Python, Java und MATLAB, hinzu gesellen sich Wrapper für C#, Ch, Perl, Haskell und Ruby. Und das Ganze gibt es für Windows, Linux, macOS, Android, iOS, BlackBerry und diverse BSD-Varianten. Insofern sollte fast jeder Entwickler einen Zugang zu OpenCV bekommen, ohne gleich ganz neue Grundlagen abseits der eigentlichen Bibliotheksfunktionen erlernen zu müssen.

OpenCV hat einen Fokus auf Echtzeitverarbeitung und unterstützt sowohl CUDA als auch OpenCL und ist damit auch für zeitkritische Anwendungen bestens geeignet – im Allgmeinen gilt OpenCV als ausgesprochen schnell.

Was kann OpenCV ganz konkret?

Die Bibliothek ist modular aufgebaut und bereits die Lektüre der ersten Seiten der Dokumentation zeigt die Vielfältigkeit der Funktionen. Zu den Hauptmodulen gehören etwa die Bereiche Image Processing, Video I/O, High-level GUI, Object Detection, Image Stitching, Video Encoding/Decoding sowie Video Stabilization – und auch eines der heute angesagtesten Tech-Themen hat sein eigenes Modul: Machine Learning ist ein wichtiger Bestandteil von OpenCV.

Hinter diesen Modulen stecken oft erstaunlich einfache wie praktische Funkionen (oder auch weitere Listen mit Modulen). Im Bereich Image Processing tummeln sich zum Beispiel allerlei Untermodule wie Image Filtering. Und darin finden sich nun selbst Endanwendern von Grafikprogrammen bekannte Tools wie Gauß-Filter oder Morphing.

Noch grundlegender wird es im Bereich Drawing. Hier finden sich Aufrufe zum Zeichnen von Linien, Punkten, Ellipsen und Rechtecken oder auch zum Platzieren von Text. OpenCV beginnt also mit absoluten Grafik-Basics. Aber natürlich wird die 2D-Bildverarbeitung noch deutlich weiter getrieben. Zum Beispiel befinden sich im Bereich „Computational Photography“ alle Funktionen zur Erstellung von High-Dynamic-Range-, also HDR-Bildern – inklusive der üblichen Tonemapping-Algorithmen wie Mantiuk, Durand oder Drago.

Bildergalerie

Ein schönes Beispiel dafür, wie OpenCV alltägliche Aufgaben vereinfachen kann, ist der Bereich Video I/O: Über die Klasse „VideoCapture“ lässt sich der Stream einer Webcam abgreifen und als Live-Bild in einem Fenster darstellen – mit Python sind dafür gerade einmal sieben sehr kurze Zeilen Code notwendig. Auch dank der High-level GUI.

Das High-level-GUI-Modul kann Fenster erstellen, die Ergebnisse der OpenCV-Verarbeitung umgehend darstellen können. Wenn Sie etwa komplexe HDR-Berechnungen durchführen und Tonemapping anwenden, dürfen Sie die gerenderten Ergebnisse direkt im Desktop-Fenster betrachten, ohne extra Fenster und Fensterlelemente anlegen zu müssen.

Bereits diese Hauptmodule bieten auch komplexe Operationen wie die Erkennung von Objekten, Vergleiche von Bildern oder Bewegungsanalyse in Video-Streams. Aber es gibt noch eine ganze Reihe an speziellen Funktionen, die sich über Zusatzmodule integrieren lassen.

Zusatzmodule für OpenCV

Auch die Zusatzmodule böten genug Stoff für eine Buchreihe in Brockhaus-Ausmaßen. Als Beispiel soll hier das Modul „face“ dienen: Die Gesichtserkennung ist wohl eines der spannendsten Felder, das sich mit OpenCV bearbeiten lässt. Was sich mit ein paar Dutzend Zeilen Python-Code erreichen lässt, ist schon erstaunlich: Sie könnten etwa eine Webcam als Zugangskontrolle zu Rechnern nutzen und identifizierten Mitarbeitern direkt ihre persönlichen Arbeitsplatzkonfigurationen freischalten.

Auch wenn Gesichtserkennung im Detail ein extrem komplexer Prozess ist, ist der Workflow in OpenCV relativ einfach und besteht aus drei Schritten: Zunächst wird eine Gesichts-„Datenbank“ erstellt/antrainiert. Das sind schlicht normierte Bilder bekannter Gesichter plus eine simple Textdatei, die diesen Dateien IDs zuordnet.

Im zweiten Schritt werden Gesichter beispielsweise in einem Webcam-Stream detektiert, also Objekte als Gesichter erkannt. Diese erkannten Gesichter werden nun ebenfalls normiert und im letzten Schritt mit den antrainierten, bekannten Gesichtern abgeglichen – wird dabei ein im Stream detektiertes Gesicht als eines der Antrainierten wieder-erkannt, kann eine beliebige Aktion ausgelöst werden.

Eigentlich möchte man meinen, das alles sei ein riesiger Aufwand – aber Irrtum! Für die Gesichtsdatenbank und die Normierung liefert OpenCV direkt brauchbare Beispielskripte mit. Die eigentliche Gesichtserkennung via Webcam lässt sich mit unter 100 Zeilen Python-Code bewerkstelligen. Und damit ließe sich tatsächlich eine komplette Zugangskontrolle realisieren.

Was OpenCV einem nicht abnehmen kann: Das Erstellen ordentlicher Trainingsdaten ist mit viel Fleißarbeit verbunden und das Finden der richtigen Parameter für die unterschiedlichen Algorithmen und Licht-/Kamera-Verhältnisse benötigt viel Zeit für Tests.

Zugriff auf OpenCV

Die Installation ist unter Windows ganz trivial: Auf SourceForge gibt es das entsprechende OpenCV-Binärpaket. Für Linux ist eine manuelle Installation vorgesehen, die einen ganze Reihe an Abhängigkeiten verlangt. Alle Build-, Download- und Installationsanweisungen sowie -quellen beschreibt ein offizielles OpenCV-Tutorial.

Für Windows gibt es zudem den OpenCV demonstrator, der die mitgelieferten Beispiele von OpenCV über eine einfache GUI anbietet, unter anderem auch Gesichts- und Augendetektion per Webcam. Das Programm basiert zwar auf OpenCV 3.0 und ist somit nicht mehr aktuell, bietet aber immer noch den einfachsten Überblick. Unter Linux finden Sie die Python-Beispielskripte unter „/samples/python“. Das Skript „facedetect.py“ öffnet ein Fenster, grabbt eine angeschlossene Webcam und umrahmt detektierte Gesichter mit einem grünen Rahmen. Tipp: Geöffnete Fenster werden mit ESC geschlossen.

Interessanter ist aber das Testen von selbst geschriebenem Code und das geht, natürlich unter Linux, am einfachsten über die interaktive Python-Shell IPython. Hier zeigt sich, wie einfach die Bibliothek angebunden wird: Ein kurzes „import cv2“ genügt, um auf alle Module zugreifen zu können. Oben wurde ein Fenster mit Live-Webcam-Bild in sieben Zeilen versprochen – hier ist es:

cap = cv2.VideoCapture(0)while True:   ret, img = cap.read(0)
   cv2.imshow('test', img)
   if 0xFF & cv2.waitKey(5) == 27:
      break
   cv2.destroyAllWindows()

Über „cap.read“ wird zunächst der aktuelle Frame als Matrix in „img“ zurückgegeben und via „imshow“ in einem Fenster angezeigt. Die restlichen drei Zeilen sorgen lediglich dafür, dass Schleife und Fenster per Klick auf ESC (ASCII-Code 27) beendet werden.

Und wenn Sie noch Ideen benötigen: Ein wirklich schönes, wenn auch schon etwas älteres Projekt, ist das Cassapa Augmented Reality Pool Game. Über eine Kamera wird der Billard-Tisch von oben aufgenommen, OpenCV analysiert Kugeln und Queue und ein Projektor wirft die Laufbahn der Kugel bei aktueller Queue-Haltung zurück auf den Tisch. Man bekommt also eine Zielhilfe, wie man sie sonst nur aus Billard-Computerspielen kennt.

Weitere Anregungen finden Sie zum Beispiel bei Hackster.io. Interessante Projekte sind dabei unter anderem ein smarter Spiegel, automatisierte Nerf Guns, diverse automatische Fahrzeuge, Sicherheitskameras und diverse Projekte rund um die Gesichtserkennung.

(ID:45308182)

Über den Autor

 Mirco Lang

Mirco Lang

Freier Journalist & BSIler