Kapitel 1. Überblick
Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com
Was ist OpenCV?
OpenCV[OpenCV] ist eine quelloffene (siehe http://opensource.org) Bildverarbeitungsbibliothek, die unter http://opencv.org verfügbar ist . 1999 rief Gary Bradski[Bradski], , der bei der Intel Corporation arbeitet, OpenCV ins Leben, in der Hoffnung, Computer Vision und künstliche Intelligenz zu beschleunigen, indem er eine solide Infrastruktur für alle, die auf diesem Gebiet arbeiten, bereitstellt. Die Bibliothek ist in C und C++ geschrieben und läuft unter Linux, Windows und Mac OS X. Es wird aktiv an Schnittstellen für Python, Java, MATLAB und andere Sprachen gearbeitet, einschließlich der Portierung der Bibliothek auf Android und iOS für mobile Anwendungen. OpenCV hat im Laufe der Jahre viel Unterstützung von Intel und Google erhalten, vor allem aber von Itseez[Itseez] (kürzlich von Intel übernommen), das den Großteil der frühen Entwicklungsarbeit geleistet hat. Und schließlich hat sich Arraiy[Arraiy] daran beteiligt, das stets offene und kostenlose OpenCV.org[OpenCV] zu pflegen.
OpenCV wurde mit Blick auf Recheneffizienz und mit einem starken Fokus auf Echtzeitanwendungen entwickelt. Es ist in optimiertem C++ geschrieben und kann die Vorteile von Multicore-Prozessoren nutzen. Wenn du weitere automatische Optimierungen auf Intel-Architekturen[Intel] wünschst, kannst du Intels Integrated Performance Primitives (IPP) -Bibliotheken[IPP] kaufen, die aus optimierten Low-Level-Routinen in vielen verschiedenen algorithmischen Bereichen bestehen. OpenCV verwendet zur Laufzeit automatisch die entsprechende IPP-Bibliothek, wenn diese installiert ist. Ab OpenCV 3.0 hat Intel dem OpenCV-Team und der OpenCV-Gemeinschaft eine kostenlose Teilmenge von IPP (genannt IPPICV) zur Verfügung gestellt, die standardmäßig in OpenCV integriert ist und dieses beschleunigt.
Eines der Ziele von OpenCV ist es, eine einfach zu bedienende Bildverarbeitungsinfrastruktur zur Verfügung zu stellen, mit der sich schnell anspruchsvolle Bildverarbeitungsanwendungen erstellen lassen. Die OpenCV-Bibliothek enthält mehr als 500 Funktionen, die viele Bereiche der Bildverarbeitung abdecken, z. B. Produktinspektion in der Fabrik, medizinische Bildgebung, Sicherheit, Benutzeroberfläche, Kamerakalibrierung, Stereosehen und Robotik. Da Bildverarbeitung und maschinelles Lernen oft Hand in Hand gehen, enthält OpenCV auch eine umfassende, universell einsetzbare Bibliothek für maschinelles Lernen (ML-Modul). Diese Unterbibliothek konzentriert sich auf die statistische Mustererkennung und das Clustering. Das ML-Modul ist sehr nützlich für die Bildverarbeitungsaufgaben, die im Mittelpunkt der Aufgabe von OpenCV stehen, aber es ist allgemein genug, um für jedes Problem des maschinellen Lernens verwendet zu werden.
Wer nutzt OpenCV?
Die meisten Informatiker/innen und Programmierer/innen kennen einige Facetten der Computer Vision, aber nur wenige wissen, wie Computer Vision eingesetzt wird. Die meisten Menschen wissen zum Beispiel, dass es bei der Überwachung eingesetzt wird, und viele wissen auch, dass es zunehmend für Bilder und Videos im Internet verwendet wird. Einige wenige haben schon gesehen, wie Computer Vision in Spieloberflächen eingesetzt wird. Noch weniger Menschen wissen, dass bei den meisten Luft- und Straßenkartenbildern (z. B. in Googles Street View) die Kamerakalibrierung und das Zusammenfügen von Bildern eine wichtige Rolle spielen. Einige kennen Nischenanwendungen für die Sicherheitsüberwachung, unbemannte fliegende Fahrzeuge oder die biomedizinische Analyse. Aber nur wenige wissen, wie weit verbreitet die maschinelle Bildverarbeitung in der Produktion ist: Praktisch alles, was in der Massenproduktion hergestellt wird, wurde schon einmal mit Hilfe von Computer Vision automatisch geprüft.
Die Open-Source-Lizenz für OpenCV ist so strukturiert, dass du ein kommerzielles Produkt entwickeln kannst, das OpenCV ganz oder teilweise nutzt. Du bist nicht verpflichtet, dein Produkt als Open Source zu veröffentlichen oder Verbesserungen der Öffentlichkeit zugänglich zu machen, obwohl wir hoffen, dass du das tust. Diese liberalen Lizenzbedingungen haben dazu geführt, dass es eine große Nutzergemeinschaft gibt, zu der Menschen aus großen Unternehmen (IBM, Microsoft, Intel, SONY, Siemens und Google, um nur einige zu nennen) und Forschungszentren (wie Stanford, MIT, CMU, Cambridge und INRIA) gehören. Es gibt ein Yahoo-Groups-Forum, in dem Nutzer Fragen stellen und diskutieren können; es hat fast 50.000 Mitglieder. OpenCV ist auf der ganzen Welt beliebt, mit großen Nutzergemeinschaften in China, Japan, Russland, Europa und Israel.
Seit seiner Alpha-Veröffentlichung im Januar 1999 wurde OpenCV in vielen Anwendungen, Produkten und Forschungsprojekten eingesetzt. Zu diesen Anwendungen gehören das Zusammenfügen von Bildern in Satelliten- und Webkarten, die Ausrichtung von Bildscans, die Rauschunterdrückung in medizinischen Bildern, die Objektanalyse, Sicherheits- und Eindringlingserkennungssysteme, automatische Überwachungs- und Sicherheitssysteme, Inspektionssysteme in der Fertigung, Kamerakalibrierung, militärische Anwendungen und unbemannte Luft-, Boden- und Unterwasserfahrzeuge. Es wurde sogar in der Ton- und Musikerkennung eingesetzt, wo Techniken der Bilderkennung auf Tonspektrogrammbilder angewendet werden. OpenCV war ein wichtiger Bestandteil des Bildverarbeitungssystems des Stanford-Roboters "Stanley", der den mit 2 Millionen Dollar dotierten DARPA Grand Challenge-Wüstenroboterwettbewerb gewann[Thrun06].
Was ist Computer Vision?
Computer Vision1 ist die Umwandlung von Daten aus einer Foto- oder Videokamera in eine Entscheidung oder eine neue Darstellung. Alle diese Umwandlungen werden durchgeführt, um ein bestimmtes Ziel zu erreichen. Die Eingabedaten können Kontextinformationen enthalten, z. B. "Die Kamera ist in einem Auto montiert" oder "Der Laser-Entfernungsmesser zeigt an, dass ein Objekt 1 Meter entfernt ist". Die Entscheidung könnte lauten: "In dieser Szene befindet sich eine Person" oder "Auf diesem Objektträger befinden sich 14 Tumorzellen". Eine neue Darstellung kann bedeuten, ein Farbbild in ein Graustufenbild umzuwandeln oder Kamerabewegungen aus einer Bildsequenz zu entfernen.
Weil wir so visuell veranlagt sind, lässt man sich leicht vorgaukeln, dass Computer Vision Aufgaben einfach sind. Wie schwer kann es sein, z. B. ein Auto zu finden, wenn du es auf einem Bild anstarrst? Deine anfängliche Intuition kann ziemlich irreführend sein. Das menschliche Gehirn teilt das Sehsignal in viele Kanäle auf, die unterschiedliche Informationen in dein Gehirn leiten. Dein Gehirn verfügt über ein Aufmerksamkeitssystem, das aufgabenabhängig wichtige Teile eines Bildes identifiziert, die es zu untersuchen gilt, während es die Untersuchung anderer Bereiche unterdrückt. Im visuellen Strom gibt es massive Rückkopplungen, die bisher noch wenig verstanden werden. Es gibt weit verbreitete assoziative Inputs von Muskelkontrollsensoren und allen anderen Sinnen, die es dem Gehirn ermöglichen, auf Querassoziationen zurückzugreifen, die es sich im Laufe der Jahre in der Welt angeeignet hat. Die Rückkopplungsschleifen im Gehirn gehen auf alle Verarbeitungsstufen zurück, auch auf die Hardware-Sensoren selbst (die Augen), die die Beleuchtung über die Iris mechanisch steuern und den Empfang auf der Oberfläche der Netzhaut abstimmen.
Bei einem Bildverarbeitungssystem hingegen erhält der Computer ein Zahlenraster von der Kamera oder von der Festplatte, und das war's. In den meisten Fällen gibt es keine eingebaute Mustererkennung, keine automatische Steuerung von Fokus und Blende, keine Querverbindungen mit jahrelanger Erfahrung. Im Großen und Ganzen sind Bildverarbeitungssysteme noch ziemlich naiv. Abbildung 1-1 zeigt ein Bild von einem Auto. Auf diesem Bild sehen wir einen Seitenspiegel auf der Fahrerseite des Autos. Was der Computer "sieht", ist nur ein Raster aus Zahlen. Jede einzelne Zahl in diesem Raster hat einen ziemlich großen Rauschanteil und gibt uns daher nur wenig Informationen, aber dieses Zahlenraster ist alles, was der Computer "sieht". Unsere Aufgabe ist es also, dieses verrauschte Zahlengitter in den "Seitenspiegel" der Wahrnehmung zu verwandeln. Abbildung 1-2 zeigt, warum Computer Vision so schwierig ist.
In der Tat ist das Problem, wie wir es bisher gestellt haben, schlimmer als schwer: Es ist formal unmöglich zu lösen. Bei einer zweidimensionalen (2D) Ansicht einer 3D-Welt gibt es keine eindeutige Möglichkeit, das 3D-Signal zu rekonstruieren. Formal gesehen hat ein solches Problem keine eindeutige oder endgültige Lösung. Ein und dasselbe 2D-Bild könnte eine unendliche Kombination von 3D-Szenen darstellen, selbst wenn die Daten perfekt wären. Wie bereits erwähnt, werden die Daten jedoch durch Rauschen und Verzerrungen verfälscht. Diese Verzerrungen entstehen durch Veränderungen in der Umgebung (Wetter, Beleuchtung, Reflexionen, Bewegungen), Unzulänglichkeiten des Objektivs und des mechanischen Aufbaus, endliche Integrationszeit auf dem Sensor (Bewegungsunschärfe), elektrisches Rauschen im Sensor oder anderer Elektronik und Kompressionsartefakte nach der Bildaufnahme. Wie können wir angesichts dieser gewaltigen Herausforderungen Fortschritte machen?
Bei der Entwicklung eines praktischen Systems kann zusätzliches Kontextwissen oft genutzt werden, um die Einschränkungen zu umgehen, die uns die visuellen Sensoren auferlegen. Nehmen wir das Beispiel eines mobilen Roboters ( ), der in einem Gebäude Heftklammern finden und aufsammeln muss. Der Roboter könnte die Tatsache nutzen, dass ein Schreibtisch ein Objekt ist, das in Büros zu finden ist, und dass sich Heftklammern meistens auf Schreibtischen befinden. Dies gibt einen impliziten Größenbezug: Hefter müssen auf Schreibtische passen. Das hilft auch dabei, Hefter an unmöglichen Orten zu "erkennen" (z. B. an der Decke oder am Fenster). Der Roboter kann ein 200 Fuß hohes Werbe-Luftschiff, das wie ein Hefter geformt ist, getrost ignorieren, da dem Luftschiff der erforderliche holzähnliche Hintergrund eines Schreibtisches fehlt. Im Gegensatz dazu können bei Aufgaben wie der Bildsuche alle Bilder von Heftklammern in einer Datenbank echte Heftklammern zeigen, so dass große Größen und andere ungewöhnliche Konfigurationen durch die Annahmen der Fotografen implizit ausgeschlossen wurden; das heißt, der Fotograf hat vielleicht nur echte Heftklammern in normaler Größe fotografiert. Menschen neigen auch dazu, Objekte beim Fotografieren in die Mitte zu stellen und sie in charakteristische Ausrichtungen zu bringen. Daher enthalten Fotos, die von Menschen aufgenommen wurden, oft eine ganze Menge ungewollter impliziter Informationen.
Kontextbezogene Informationen können auch explizit mit Techniken des maschinellen Lernens modelliert werden. Versteckte Variablen wie Größe, Orientierung an der Schwerkraft usw. können dann mit ihren Werten in einem markierten Trainingssatz korreliert werden. Alternativ kann man versuchen, versteckte Bias-Variablen mit Hilfe zusätzlicher Sensoren zu messen. Der Einsatz eines Laserentfernungsmessers zur Tiefenmessung ermöglicht es uns, die Größe eines Objekts genau zu messen.
Das nächste Problem, mit dem Computer Vision konfrontiert ist, ist das Rauschen. Normalerweise gehen wir mit statistischen Methoden gegen Rauschen vor. Es kann zum Beispiel unmöglich sein, eine Kante in einem Bild zu erkennen, indem man einen Punkt mit seinen unmittelbaren Nachbarn vergleicht. Wenn wir uns aber die Statistiken über eine lokale Region ansehen, wird die Erkennung von Kanten viel einfacher. Eine echte Kante sollte als eine Reihe solcher unmittelbaren Nachbarreaktionen über eine lokale Region erscheinen, deren Ausrichtung jeweils mit ihren Nachbarn übereinstimmt. Es ist auch möglich, Rauschen zu kompensieren, indem man Statistiken über die Zeit erstellt. Wieder andere Verfahren berücksichtigen Rauschen oder Verzerrungen, indem sie explizite Modelle erstellen, die direkt aus den verfügbaren Daten gelernt werden. Da zum Beispiel Linsenverzerrungen gut bekannt sind, muss man nur die Parameter für ein einfaches Polynommodell lernen, um solche Verzerrungen zu beschreiben und damit fast vollständig zu korrigieren.
Die Aktionen oder Entscheidungen, die Computer Vision auf der Grundlage von Kameradaten zu treffen versucht, werden im Zusammenhang mit einem bestimmten Zweck oder einer bestimmten Aufgabe durchgeführt. Vielleicht wollen wir Rauschen oder Schäden aus einem Bild entfernen, damit unser Sicherheitssystem einen Alarm auslöst, wenn jemand versucht, über einen Zaun zu klettern, oder weil wir ein Überwachungssystem brauchen, das zählt, wie viele Menschen einen Bereich in einem Vergnügungspark durchqueren. Eine Bildverarbeitungssoftware für Roboter, die durch Bürogebäude wandern, wird andere Strategien anwenden als eine Bildverarbeitungssoftware für stationäre Überwachungskameras, weil die beiden Systeme ganz unterschiedliche Kontexte und Ziele haben. Generell gilt: Je eingeschränkter ein Bildverarbeitungskontext ist, desto mehr können wir uns auf diese Einschränkungen verlassen, um das Problem zu vereinfachen, und desto zuverlässiger wird unsere endgültige Lösung sein.
OpenCV soll die grundlegenden Werkzeuge bereitstellen, die zur Lösung von Bildverarbeitungsproblemen benötigt werden. In manchen Fällen reichen die High-Level-Funktionen der Bibliothek aus, um komplexere Probleme in der Computer Vision zu lösen. Selbst wenn dies nicht der Fall ist, sind die grundlegenden Komponenten der Bibliothek vollständig genug, um eine eigene Lösung für fast jedes Computer-Vision-Problem zu erstellen. Im letzteren Fall gibt es mehrere bewährte Methoden, die Bibliothek zu nutzen; alle beginnen damit, dass du das Problem mit so vielen verfügbaren Bibliothekskomponenten wie möglich löst. Nachdem du diesen ersten Lösungsentwurf entwickelt hast, kannst du in der Regel sehen, wo die Lösung Schwächen hat, und diese Schwächen mit deinem eigenen Code und deiner Cleverness beheben (besser bekannt als "das Problem lösen, das du tatsächlich hast, nicht das, das du dir vorstellst"). Anschließend kannst du deinen Lösungsentwurf als Benchmark verwenden, um die Verbesserungen zu bewerten, die du vorgenommen hast. Danach kannst du die verbleibenden Schwachstellen angehen, indem du den Kontext des größeren Systems, in das deine Lösung eingebettet ist, ausnutzt.
Der Ursprung von OpenCV
OpenCV ist aus einer Forschungsinitiative von Intel hervorgegangen, die CPU-intensive Anwendungen vorantreiben sollte. Zu diesem Zweck startete Intel viele Projekte, darunter Echtzeit-Raytracing und 3D-Displaywalls. Einer der Autoren, Gary Bradski[Bradski], der damals für Intel arbeitete, besuchte Universitäten und bemerkte, dass einige Spitzenuniversitäten wie das MIT Media Lab über eine gut entwickelte und intern offene Infrastruktur für Computer Vision verfügten - einen Code, der von Student zu Student weitergegeben wurde und der jedem neuen Studenten einen wertvollen Vorsprung bei der Entwicklung seiner eigenen Vision-Anwendung verschaffte. Anstatt die grundlegenden Funktionen von Grund auf neu zu erfinden, konnte ein neuer Schüler oder eine neue Schülerin zunächst auf dem aufbauen, was bereits vorhanden war.
So wurde OpenCV als eine Möglichkeit konzipiert, die Infrastruktur für Computer Vision allgemein verfügbar zu machen. Mit der Hilfe von Intels Performance Library Team,2 OpenCV begann mit einem Kern von implementiertem Code und algorithmischen Spezifikationen, die an Mitglieder von Intels russischem Bibliotheksteam geschickt wurden. Das ist das "Wo" von OpenCV: Es begann im Intel-Forschungslabor in Zusammenarbeit mit der Software Performance Libraries Group und der Implementierungs- und Optimierungsexpertise in Russland.
Zu den russischen Teammitgliedern gehörte vor allem Vadim Pisarevsky, der verwaltete, kodierte und einen Großteil von OpenCV optimierte und der auch heute noch im Zentrum der OpenCV-Bemühungen steht. Zusammen mit ihm half Victor Eruhimov bei der Entwicklung der frühen Infrastruktur, und Valery Kuriakin leitete das russische Labor und unterstützte die Arbeit maßgeblich. Zu Beginn gab es mehrere Ziele für OpenCV:
-
Bring die Bildverarbeitungsforschung voran, indem du nicht nur offenen, sondern auch optimierten Code für die grundlegende Bildverarbeitungsinfrastruktur bereitstellst. Wir müssen das Rad nicht mehr neu erfinden.
-
Verbreitung des Visionswissens durch die Bereitstellung einer gemeinsamen Infrastruktur, auf der Entwickler aufbauen können, damit der Code leichter lesbar und übertragbar ist.
-
Kommerzielle Bildverarbeitungsanwendungen zu fördern, indem wir portablen, leistungsoptimierten Code kostenlos zur Verfügung stellen - mit einer Lizenz, die nicht voraussetzt, dass kommerzielle Anwendungen selbst offen oder frei sind.
Diese Ziele sind das "Warum" von OpenCV. Die Ermöglichung von Computer-Vision-Anwendungen würde den Bedarf an schnellen Prozessoren erhöhen. Die Förderung von Upgrades auf schnellere Prozessoren würde Intel mehr Geld einbringen als der Verkauf zusätzlicher Software. Vielleicht ist das der Grund, warum dieser offene und kostenlose Code von einem Hardwarehersteller und nicht von einem Softwareunternehmen entwickelt wurde. Manchmal gibt es in einem Hardwareunternehmen mehr Raum für innovative Software.
Bei jedem Open-Source-Projekt ist es wichtig, eine kritische Masse zu erreichen, bei der sich das Projekt selbst trägt. OpenCV wurde bisher etwa 11 Millionen Mal heruntergeladen, und diese Zahl wächst um durchschnittlich 160.000 Downloads pro Monat. OpenCV erhält viele Beiträge von Nutzern, und die zentrale Entwicklung hat sich weitgehend außerhalb von Intel verlagert.3 Die Zeitachse von OpenCV ist in Abbildung 1-3 dargestellt. Auf dem Weg dorthin wurde OpenCV vom Dot-Com-Boom und der Dot-Com-Pleite sowie von zahlreichen Wechseln im Management und in der Leitung beeinflusst. Während dieser Schwankungen gab es Zeiten, in denen bei Intel niemand an OpenCV arbeitete. Mit dem Aufkommen von Multicore-Prozessoren und den vielen neuen Anwendungsmöglichkeiten von Computer Vision begann der Wert von OpenCV jedoch zu steigen. Auch das schnelle Wachstum im Bereich der Robotik hat dazu geführt, dass die Bibliothek häufig genutzt und weiterentwickelt wurde. Nachdem OpenCV eine Open-Source-Bibliothek wurde, wurde sie mehrere Jahre lang von Willow Garage aktiv weiterentwickelt und wird jetzt von der OpenCV Foundation unterstützt. Heute wird OpenCV sowohl von der Stiftung als auch von mehreren öffentlichen und privaten Einrichtungen aktiv weiterentwickelt. Weitere Informationen über die Zukunft von OpenCV findest du in Kapitel 23.
OpenCV-Blockdiagramm
OpenCV ist in Schichten aufgebaut. An der Spitze steht das Betriebssystem, unter dem OpenCV läuft. Dann folgen die Sprachbindungen und Beispielanwendungen. Darunter befindet sich der beigesteuerte Code in opencv_contrib, der hauptsächlich Funktionen auf höherer Ebene enthält. Danach folgt der Kern von OpenCV, und ganz unten auf befinden sich die verschiedenen Hardware-Optimierungen in der Hardware-Beschleunigungsschicht (HAL). Abbildung 1-4 zeigt diese Organisation.
OpenCV mit IPP beschleunigen
Falls auf Intel-Prozessoren verfügbar, nutzt OpenCV eine lizenzfreie Untermenge von Intels Integrated Performance Primitives (IPP)-Bibliothek, IPP 8.x (IPPICV). IPPICV kann beim Kompilieren in OpenCV eingebunden werden und ersetzt dann den entsprechenden optimierten C-Code auf niedriger Ebene (in cmake WITH_IPP=ON/OFF
, ON
standardmäßig). Der Geschwindigkeitszuwachs durch die Verwendung von IPP kann erheblich sein. Abbildung 1-5 zeigt den relativen Geschwindigkeitszuwachs, wenn IPP verwendet wird.
Wer ist Eigentümer von OpenCV?
Obwohl Gary Bradski OpenCV bei Intel ins Leben gerufen hat, ist und war die Bibliothek immer für die kommerzielle Nutzung und die Forschung gedacht; das ist ihre Aufgabe. Sie ist daher offen und frei, und der Code selbst kann (ganz oder teilweise) in anderen Anwendungen verwendet oder eingebettet werden, egal ob kommerziell oder für die Forschung. Sie zwingt deinen Anwendungscode nicht, offen oder frei zu sein. Es wird nicht verlangt, dass du Verbesserungen an die Bibliothek zurückgibst - aber wir hoffen, dass du es tust.
Herunterladen und Installieren von OpenCV
Auf der OpenCV-Hauptseite kannst du den kompletten Quellcode für die neueste Version sowie für viele frühere Versionen herunterladen. Die Downloads selbst findest du auf der Download-Seite. Die aktuellste Version findest du jedoch immer auf GitHub, wo der aktive Entwicklungszweig gespeichert ist. Für neuere, höherwertige Funktionen kannst du auch opencv_contrib[opencv_contrib] herunterladen und bauen(https://github.com/opencv/opencv_contrib).
Installation
Heutzutage verwendet OpenCV Git als Versionskontrolle für die Entwicklung und CMake für die Erstellung.4 In vielen Fällen musst du dich auf nicht um die Kompilierung kümmern, da kompilierte Bibliotheken für viele Umgebungen existieren. Wenn du jedoch zu einem fortgeschrittenen Benutzer wirst, wirst du unweigerlich in der Lage sein wollen, die Bibliotheken mit spezifischen, auf deine Anwendung zugeschnittenen Optionen neu zu kompilieren.
Windows
Unter http://opencv.org/downloads.html findest du einen Link zum Herunterladen der neuesten Version von OpenCV für Windows. Über diesen Link wird eine ausführbare Datei heruntergeladen, die ein selbstextrahierendes Archiv mit vorgefertigten OpenCV-Binärdateien für verschiedene Versionen von Visual Studio ist. Du bist jetzt fast bereit, OpenCV zu benutzen.5
Ein zusätzliches Detail ist, dass du eine OPENCV_DIR
Umgebungsvariable hinzufügen solltest, um deinem Compiler mitzuteilen, wo er die OpenCV-Binärdateien finden kann. Du kannst sie setzen, indem du eine Eingabeaufforderung aufrufst und eintippst:6
setx -m OPENCV_DIR D:\OpenCV\Build\x64\vc10
Wenn du OpenCV statisch linken willst, ist das alles, was du brauchst. Wenn du OpenCV dynamisch verlinkte Bibliotheken (DLLs) verwenden willst, musst du deinem System auch mitteilen, wo die Binärbibliothek zu finden ist. Dazu fügst du einfach %OPENCV_DIR%\bin
zu deinem Bibliothekspfad hinzu. (Unter Windows 10 klickst du zum Beispiel mit der rechten Maustaste auf dein Computersymbol, wählst Eigenschaften und klickst dann auf Erweiterte Systemeinstellungen. Wähle schließlich Umgebungsvariablen und füge den OpenCV-Binärpfad zur Pfadvariable hinzu).
OpenCV 3 ist mit IPP verknüpft, sodass du den Leistungsvorteil von mehr oder weniger modernen x86- und x64-CPUs nutzen kannst.
Du kannst OpenCV auch wie folgt aus einem Quell-Tarball bauen:
-
Führe die CMake-GUI aus.
-
Gib die Pfade zum OpenCV-Quellbaum und zum Build-Verzeichnis an (sie müssen unterschiedlich sein!).
-
Drücke zweimal auf Konfigurieren (wähle den entsprechenden Visual Studio-Generator oder die MinGW-Makefiles, wenn du MinGW verwendest) und drücke dann auf Generieren.
-
Öffne die generierte Lösung in Visual Studio und erstelle sie. Im Falle von MinGW verwende die folgenden Anweisungen für Linux.
Linux
Vorgefertigte Binärdateien für Linux sind in der Linux-Version von OpenCV nicht enthalten. Das liegt an der großen Vielfalt an GCC- und GLIBC-Versionen in den verschiedenen Distributionen (SuSE, Debian, Ubuntu, etc.). In vielen Fällen wird deine Distribution jedoch OpenCV enthalten. Wenn deine Distribution OpenCV nicht anbietet, musst du es aus den Quellen bauen. Wie bei der Windows-Installation kannst du unter http://opencv.org/downloads.html beginnen , aber in diesem Fall führt dich der Link zu SourceForge, wo du den Tarball für das aktuelle OpenCV-Quellcodepaket auswählen kannst.
Um die Bibliotheken und Demos zu erstellen, brauchst du GTK+ 2.x oder höher, einschließlich Header. Außerdem brauchst du gcc und die wesentlichen Entwicklungspakete, cmake und libtbb (Intel Thread Building Blocks) sowie optional zlib, libpng, libjpeg, libtiff und libjasper mit Entwicklungsdateien (d.h. die Versionen mit -dev am Ende des Paketnamens). Du brauchst Python 2.6 oder höher mit installierten Headern (Entwicklerpaket) sowie NumPy, damit die Python-Bindungen funktionieren. Außerdem brauchst du libavcodec und die anderen libav*-Bibliotheken (einschließlich Header) von ffmpeg.
Für letzteres installiere die libav/ffmpeg-Pakete, die mit deiner -Distribution geliefert werden, oder lade ffmpeg von http://www.ffmpeg.org herunter . Die ffmpeg-Bibliothek steht unter der Lesser General Public License (LGPL), aber einige ihrer Komponenten stehen unter der strengeren General Public License (GPL). Um sie mit Software zu verwenden, die nicht unter der GPL steht (z. B. OpenCV), musst du eine gemeinsame ffmpg-Bibliothek erstellen und verwenden:
$> ./configure --enable-shared $> make $> sudo make install
(Wenn du eine LGPL-Bibliothek dynamisch verlinkst, bist du nicht verpflichtet, eine GPL-Lizenz für deinen Code zu verwenden). Am Ende hast du /usr/local/lib/libavcodec.so.*, /usr/local/lib/libavformat.so.*, /usr/local/lib/libavutil.so.* und Include-Dateien unter verschiedenen /usr/local/include/libav*-Pfaden.
Um die Bibliothek tatsächlich zu bauen, musst du die .tar.gz-Datei entpacken und in das erstellte Quellverzeichnis gehen und Folgendes tun
mkdir release cd release cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. make sudo make install # optional
Der erste und zweite Befehl erstellen ein neues Unterverzeichnis und verschieben dich dorthin. Der dritte Befehl teilt CMake mit, wie es deinen Build konfigurieren soll. Die von uns angegebenen Beispieloptionen sind wahrscheinlich die richtigen für den Anfang, aber mit anderen Optionen kannst du verschiedene Optionen aktivieren, festlegen, welche Beispiele gebaut werden, Python-Unterstützung hinzufügen, CUDA-GPU-Unterstützung hinzufügen und mehr. Standardmäßig versucht das cmake-Konfigurationsskript von OpenCV, so viele Bibliotheken von Drittanbietern wie möglich zu finden und zu verwenden. Wenn es zum Beispiel das CUDA SDK findet, aktiviert es die GPU-beschleunigte OpenCV-Funktionalität. Die letzten beiden Befehle bauen die Bibliothek und installieren die Ergebnisse an den richtigen Stellen. Beachte, dass du OpenCV nicht installieren musst, um es in deinen CMake-basierten Projekten zu verwenden; du musst nur den Pfad angeben, um OpenCVConfig.cmake zu erzeugen. Im vorigen Fall wird die Datei im Release-Verzeichnis abgelegt. Wenn du dich stattdessen für sudo make install
entscheidest, wird OpenCVConfig.cmake in /usr/local/share/OpenCV abgelegt.
Genau wie bei Windows nutzt auch die Linux-Version von OpenCV automatisch die Vorteile von IPP, sobald sie installiert ist. Ab OpenCV 3.0 lädt das cmake-Konfigurationsskript von OpenCV automatisch eine kostenlose Untermenge von IPP (IPPICV) herunter und verknüpft sie. Um IPP explizit zu deaktivieren, wenn du es nicht möchtest, übergib CMake die Option -D WITH_IPP=OFF
.
Mac OS X
Die Installation unter OS X ist Linux sehr ähnlich, mit dem Unterschied, dass OS X mit seiner eigenen Entwicklungsumgebung Xcode kommt, die fast alles enthält, was du brauchst, außer CMake; du brauchst kein GTK+, TBB, libjpeg, ffmpeg und so weiter:
-
Standardmäßig wird Cocoa anstelle von GTK+ verwendet.
-
Standardmäßig wird QTKit anstelle von ffmpeg verwendet.
-
Grand Dispatch Central (GDC) wird anstelle von TBB und OpenMP verwendet.
Die Installationsschritte sind dann genau dieselben. Vielleicht möchtest du die Option -G Xcode
an CMake übergeben, um ein Xcode-Projekt für OpenCV (und für deine Anwendungen) zu erzeugen, damit du den Code bequem in Xcode bauen und debuggen kannst.
Die neueste OpenCV-Version über Git erhalten
OpenCV wird aktiv weiterentwickelt, und Fehler werden oft schnell behoben, wenn Fehlerberichte genaue Beschreibungen und Code enthalten, der den Fehler demonstriert. Offizielle OpenCV-Releases gibt es jedoch nur ein- bis zweimal im Jahr. Wenn du ernsthaft ein Projekt oder Produkt entwickelst, möchtest du wahrscheinlich Code-Fixes und Updates, sobald sie verfügbar sind. Um diese zu erhalten, musst du auf das Git-Repository von OpenCV auf GitHub zugreifen.
Dies ist nicht der richtige Ort für eine Einführung in die Verwendung von Git. Wenn du schon mit anderen Open-Source-Projekten gearbeitet hast, bist du wahrscheinlich schon damit vertraut. Falls nicht, solltest du dir Versionskontrolle mit Git von Jon Loeliger (O'Reilly) ansehen. Ein Git-Client für die Kommandozeile ist für Linux, OS X und die meisten UNIX-ähnlichen Systeme verfügbar. Für Windows-Benutzer empfehlen wir TortoiseGit; für OS X könnte die SourceTree-App für dich geeignet sein.
Wenn du unter Windows die neueste Version von OpenCV aus dem Git-Repository haben möchtest, musst du auf das Verzeichnis https://github.com/opencv/opencv.git zugreifen .
Unter Linux kannst du einfach den folgenden Befehl verwenden:
git clone https://github.com/opencv/opencv.git
Mehr OpenCV Dokumentation
Die wichtigste Dokumentation für OpenCV ist die HTML-Dokumentation , die du unter http://opencv.org findest. Darüber hinaus gibt es ausführliche Tutorials zu vielen Themen unter http://docs.opencv.org/2.4.13/doc/tutorials/tutorials.html und ein OpenCV-Wiki (derzeit unter https://github.com/opencv/opencv/wiki).
Mitgelieferte Dokumentation
Zu OpenCV 2.x gibt es ein komplettes Referenzhandbuch und eine Reihe von Tutorials, alle im PDF-Format; siehe opencv/doc. Ab OpenCV 3.x gibt es keine Offline-Dokumentation mehr.
Online-Dokumentation und das Wiki
Wie wir bereits erwähnt haben, gibt es eine umfangreiche Dokumentation sowie ein Wiki unter http://opencv.org. Die dortige Dokumentation ist in mehrere Hauptkomponenten unterteilt:
- Referenz
- In diesem Abschnitt findest du die Funktionen, ihre Argumente und einige Informationen darüber, wie du sie verwenden kannst.
- Tutorials
- Es gibt eine große Sammlung von Tutorials, in denen du erfährst, wie du verschiedene Dinge erreichen kannst. Es gibt Tutorials zu grundlegenden Themen, z. B. wie man OpenCV installiert oder OpenCV-Projekte auf verschiedenen Plattformen erstellt, und zu fortgeschritteneren Themen wie Hintergrundsubtraktion oder Objekterkennung.
- Schnellstart
- Dies ist eine streng kuratierte Untergruppe der Tutorials, die nur solche enthält, die dir helfen, auf bestimmten Plattformen loszulegen.
- Spickzettel
- Es handelt sich dabei um eine einzige .pdf-Datei, die eine wirklich ausgezeichnete komprimierte Referenz für fast die gesamte Bibliothek enthält. Bedanke dich bei Vadim Pisarevsky für diese exzellente Referenz, indem du dir diese beiden schönen Seiten an die Wand deines Arbeitsplatzes pinnst.
- Wiki
- Das Wiki enthält alles, was du dir wünschen könntest, und noch mehr. Hier findest du die Roadmap, Neuigkeiten, offene Probleme, Fehlerverfolgung und unzählige weitere Themen, wie z.B. wie du zu OpenCV beitragen kannst.
- F&A
- Dies ist ein riesiges Archiv mit buchstäblich Tausenden von Fragen, die andere gestellt und beantwortet haben. Du kannst dort Fragen an die OpenCV-Community stellen oder anderen helfen, indem du ihre Fragen beantwortest.
Du findest sie alle unter dem Button Dokumentation auf der OpenCV.org Homepage. Von all diesen großartigen Ressourcen soll hier eine etwas ausführlicher behandelt werden - die Referenz. Die Referenz ist in mehrere Abschnitte unterteilt, von denen sich jeder auf ein Modul der Bibliothek bezieht. Die genaue Modulliste hat sich im Laufe der Zeit geändert, aber die Module sind die wichtigste Organisationsstruktur der Bibliothek. Jede Funktion in der Bibliothek ist Teil eines Moduls. Hier sind die aktuellen Module:
core
- Der "Kern" ist der Teil der Bibliothek, der alle grundlegenden Objekttypen und ihre grundlegenden Operationen enthält.
imgproc
- Das Bildverarbeitungsmodul enthält grundlegende Bildtransformationen, darunter Filter und ähnliche Faltungsoperatoren.
highgui
(aufgeteilt inimgcodecs
,videoio
undhighgui
in OpenCV 3.0)- Dieses Modul enthält Funktionen für die Benutzeroberfläche, mit denen du Bilder anzeigen oder einfache Benutzereingaben entgegennehmen kannst. Man kann es sich als ein sehr leichtes UI-Toolkit für Fenster vorstellen.
video
- Die Videobibliothek enthält die Funktionen, die du zum Lesen und Schreiben von Videostreams brauchst.
calib3d
- Dieses Modul enthält Implementierungen von Algorithmen, die du für die Kalibrierung von einzelnen Kameras sowie von Stereo- oder Multikamera-Arrays benötigst.
features2d
- Dieses Modul enthält Algorithmen zum Erkennen, Beschreiben und Abgleichen von Schlüsselpunktmerkmalen.
objdetect
- Dieses Modul enthält Algorithmen zur Erkennung von bestimmten Objekten, wie Gesichtern oder Fußgängern. Du kannst die Detektoren auch für die Erkennung anderer Objekte trainieren.
ml
- Die Bibliothek für maschinelles Lernen ist eigentlich eine ganze Bibliothek für sich und enthält eine Vielzahl von Algorithmen für maschinelles Lernen, die so implementiert sind, dass sie mit den natürlichen Datenstrukturen von OpenCV funktionieren.
flann
- FLANN steht für "Fast Library for Approximate Nearest Neighbors". Diese Bibliothek enthält Methoden, die du wahrscheinlich nicht direkt nutzen wirst, die aber von anderen Funktionen in anderen Modulen für die Suche nach nächsten Nachbarn in großen Datensätzen verwendet werden.
gpu
(aufgeteilt auf mehrerecuda*
Module in OpenCV 3.0)- Die GPU-Bibliothek enthält Implementierungen der meisten anderen Bibliotheksfunktionen, die für den Betrieb auf CUDA-GPUs optimiert sind. Es gibt auch einige Funktionen, die nur für den GPU-Betrieb implementiert sind. Einige dieser Funktionen liefern hervorragende Ergebnisse, benötigen aber so viele Rechenressourcen, dass eine Implementierung auf Nicht-GPU-Hardware wenig Nutzen bringen würde.
photo
- Dies ist ein relativ neues Modul, das nützliche Werkzeuge für die rechnergestützte Fotografie enthält.
stitching
- Das gesamte Modul implementiert eine ausgeklügelte Pipeline für das Zusammenfügen von Bildern. Dies ist eine neue Funktion in der Bibliothek, aber wie das Fotomodul ist dies ein Bereich, der in Zukunft noch wachsen wird.
nonfree
(verschoben nach opencv_contrib/xfeatures2d in OpenCV 3.0)- OpenCV enthält einige Implementierungen von Algorithmen, die patentiert oder anderweitig durch Nutzungsbeschränkungen belastet sind (z. B. der SIFT-Algorithmus). Diese Algorithmen sind in ein eigenes Modul ausgelagert, um darauf hinzuweisen, dass du eine besondere Arbeit leisten musst, um sie in einem kommerziellen Produkt zu verwenden.
contrib
(verschmolzen in ein paar opencv_contrib Modulen in OpenCV 3.0)- Dieses Modul enthält neue Dinge, die noch in die gesamte Bibliothek integriert werden müssen.
legacy
(verschwunden in OpenCV 3.0)- Dieses Modul enthält alte Dinge, die noch nicht ganz aus der Bibliothek verbannt worden sind.
ocl
(verschwunden in OpenCV 3.0; ersetzt durch T-API-Technologie)- Dies ist ein neueres Modul, das analog zum GPU-Modul betrachtet werden könnte, außer dass es den Khronos OpenCL-Standard für offene parallele Programmierung implementiert. Obwohl das
ocl
Modul derzeit viel weniger Funktionen hat als das GPU-Modul, zielt es darauf ab, Implementierungen bereitzustellen, die auf jeder GPU oder einem anderen Khronos-fähigen Parallelgerät laufen können. (Im Gegensatz zum Modulgpu
, das explizit das NVidia CUDA-Toolkit nutzt und daher nur auf NVidia-GPUs funktioniert).
Trotz der immer besser werdenden Qualität dieser Online-Dokumentation gehört es nicht zu ihren Aufgaben, ein richtiges Verständnis der implementierten Algorithmen oder der genauen Bedeutung der Parameter, die diese Algorithmen benötigen, zu vermitteln. Dieses Buch soll diese Informationen und ein tieferes Verständnis für alle grundlegenden Bausteine der Bibliothek vermitteln.
OpenCV Contribution Repository
In OpenCV 3.0 wurde die zuvor monolithische Bibliothek in zwei Teile aufgeteilt: das ausgereifte opencv und den aktuellen Stand der Technik bei größeren Bildverarbeitungsfunktionen unter opencv_contrib[opencv_contrib]. Ersteres wird vom OpenCV-Kernteam gewartet und enthält (größtenteils) stabilen Code, während letzteres weniger ausgereift ist, größtenteils von der Community gewartet und entwickelt wird, Teile unter Nicht-OpenCV-Lizenz enthalten kann und patentierte Algorithmen beinhalten kann.
Hier sind einige der Module, die im opencv_contrib Repository verfügbar sind (siehe Anhang B für eine vollständige Liste zum Zeitpunkt dieses Schreibens):
Dnn
- Tiefe neuronale Netze
face
- Gesichtserkennung
text
- Texterkennung und -erkennung; kann optional das Open-Source-OCR Tesseract als Backend verwenden
rgbd
- Verarbeitung von RGB- und Tiefenkarten, die mit Kinect und anderen Tiefensensoren gewonnen wurden (oder einfach mit Stereo-Korrespondenz-Algorithmen berechnet wurden)
bioinspired
- Biologisch inspirierte Vision
ximgproc
,xphoto
- Fortgeschrittene Algorithmen für Bildverarbeitung und Computergrafik
tracking
- Moderne Algorithmen für die Objektverfolgung
Herunterladen und Erstellen von beigetragenen Modulen
Unter Linux und OS X kannst du opencv_contrib einfach mit folgendem Befehl herunterladen:
git clone https://github.com/opencv/opencv_contrib.git
Unter Windows gibst du diese Adresse an TortoiseGit oder einen anderen solchen Client weiter. Dann musst du OpenCV mit CMake neu konfigurieren:
cmake –D CMAKE_BUILD_TYPE=Release \ –D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
und baue es wie gewohnt neu. Die erstellten Module werden im selben Verzeichnis wie die regulären OpenCV-Binärdateien abgelegt und du kannst sie ohne weitere Schritte verwenden.
Tragbarkeit
OpenCV wurde entwickelt, um portabel zu sein. Ursprünglich wurde es so geschrieben, dass es von jedem kompatiblen C++-Compiler kompiliert werden kann. Das bedeutete, dass der C- und C++-Code ziemlich standardisiert sein musste, um die plattformübergreifende Unterstützung zu erleichtern. Tabelle 1-1 zeigt die Plattformen, auf denen OpenCV bekanntermaßen läuft. Die Unterstützung für die 32-Bit- und 64-Bit-Architekturen von Intel und AMD (x86, x64) ist am ausgereiftesten, und auch die ARM-Unterstützung verbessert sich schnell. Unter den Betriebssystemen unterstützt OpenCV Windows, Linux, OS X, Android und iOS vollständig.
Wenn eine Architektur oder ein Betriebssystem nicht in Tabelle 1-1 aufgeführt ist, bedeutet das nicht, dass es keine OpenCV-Portierungen dafür gibt. OpenCV wurde auf fast jedes kommerzielle System portiert, von Amazon Cloud und 40-Core Intel Xeon Phi bis hin zu Raspberry Pi und Roboterhunden.
x86/x64 | ARM | Sonstiges: MIPs, PPC | |
---|---|---|---|
Windows | SIMD, IPP, Parallel, I/O | SIMD, Parallel (3.0), I/O | N/A |
Linux | SIMD, IPP, Parallel,a E/A | SIMD, Parallel,a E/A | Parallel,a E/A* |
Android | SIMD, IPP (3.0), Parallel,b E/A | SIMD, Parallel,b E/A | MIPS-Grundlagenunterstützung |
OS X/iOS | SIMD, IPP (3.0), Parallel, I/O | SIMD, Parallel, I/O | N/A |
Andere: BSD, QNX, ... | SIMD | SIMD | |
a Die Parallelisierung unter Linux erfolgt über eine Bibliothek eines Drittanbieters oder durch die Aktivierung von OpenMP. b Die Parallelisierung in Android erfolgt über Intel TBB. |
Hier ist die Legende zu Tabelle 1-1:
- SIMD
- Um die Geschwindigkeit zu erhöhen, werden Vektorbefehle verwendet: SSE auf x86/x64, NEON auf ARM.
- IPP
- Intel IPP ist verfügbar. Ab Version 3.0 gibt es ein kostenloses spezialisiertes IPP Subset (IPPICV).
- Parallel
- Ein Standard- oder Drittanbieter-Threading-Framework wird verwendet, um die Verarbeitung auf mehrere Kerne zu verteilen.
- E/A
- Eine Standard- oder Drittanbieter-API kann verwendet werden, um Videos zu erfassen oder zu schreiben.
Zusammenfassung
In diesem Kapitel haben wir die Geschichte von OpenCV[OpenCV] von der Gründung durch Gary Bradski[Bradski] bei Intel im Jahr 1999 bis zum aktuellen Stand der Unterstützung durch Arraiy[Arraiy] behandelt. Wir haben über die Motivation für OpenCV und einige seiner Inhalte gesprochen. Wir haben besprochen, wie die Kernbibliothek OpenCV von den neueren Funktionen in opencv_contrib (siehe Anhang B) getrennt wurde, und haben eine Reihe von Links zu den OpenCV-bezogenen Online-Inhalten zusammengestellt. In diesem Kapitel ging es auch darum, wie man OpenCV herunterlädt und installiert, sowie um seine Leistung und Portabilität.
Übungen
-
Lade die neueste Version von OpenCV herunter und installiere sie. Kompiliere sie im Debug- und Release-Modus.
-
Lade die neueste Trunk-Version von OpenCV herunter und baue sie mit Git.
-
Beschreibe mindestens drei zweideutige Aspekte bei der Umwandlung von 3D-Eingaben in eine 2D-Darstellung. Wie würdest du diese Unklarheiten beseitigen?
1 Computer Vision ist ein weites Feld. Dieses Buch gibt dir eine grundlegende Einführung in das Gebiet, aber wir empfehlen auch die Texte von Trucco[Trucco98] für eine einfache Einführung, Forsyth[Forsyth03] als umfassende Referenz und Hartley[Hartley06] und Faugeras[Faugeras93] für eine Diskussion darüber, wie 3D-Vision wirklich funktioniert.
2 Shinn Lee war eine wichtige Hilfe.
3 Derzeit unterstützt Willow Garage, ein Robotik-Forschungsinstitut und Inkubator, aktiv die allgemeine OpenCV-Wartung und neue Entwicklungen im Bereich der Robotik-Anwendungen.
4 Früher benutzten OpenCV-Entwickler Subversion für die Versionskontrolle und automake für die Erstellung. Diese Zeiten sind jedoch schon lange vorbei.
5 Es ist wichtig zu wissen, dass die Windows-Distribution zwar Binärbibliotheken für Release-Builds enthält, nicht aber die Debug-Builds dieser Bibliotheken. Es ist daher wahrscheinlich, dass du vor der Entwicklung mit OpenCV die Lösungsdatei öffnen und diese Bibliotheken selbst erstellen möchtest.
6 Der genaue Pfad hängt natürlich von deiner Installation ab; wenn du zum Beispiel auf einem 32-Bit-Rechner installierst, enthält der Pfad x86
statt x64
.
Get OpenCV 3 lernen now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.