Learn OpenCV

Der Turmbau zu Babel war nach einer mythischen Erzählung in der Bibel die erste technische Katastrophe der Menschheit. Das Projekt hatte all die großartigen Eigenschaften eines klaren Auftrags, viel Arbeitskraft, keine Zeitbeschränkung und angemessene Technologie (Ziegel und Mörtel). Dennoch scheiterte es spektakulär, weil Gott die Sprache der menschlichen Arbeiter verwirrte und sie sich nicht mehr verständigen konnten.

Begriffe wie „Homographie“ erinnern mich oft daran, wie schwer wir uns immer noch mit der Kommunikation tun. Homographie ist ein einfaches Konzept mit einem seltsamen Namen!

Was ist Homographie?

Betrachten Sie zwei Bilder einer Ebene (oben im Buch) in Abbildung 1. Der rote Punkt stellt denselben physikalischen Punkt in den beiden Bildern dar. Im Fachjargon nennt man dies korrespondierende Punkte. Abbildung 1 zeigt vier korrespondierende Punkte in vier verschiedenen Farben – rot, grün, gelb und orange. Eine Homographie ist eine Transformation (eine 3×3-Matrix), die die Punkte eines Bildes auf die entsprechenden Punkte des anderen Bildes abbildet.

Abbildung 1: Zwei Bilder einer 3D-Ebene (oben im Buch) sind durch eine Homographie miteinander verbunden

Da eine Homographie eine 3×3-Matrix ist, können wir sie wie folgt schreiben

Betrachten wir den ersten Satz von korrespondierenden Punkten – im ersten Bild und im zweiten Bild. Dann bildet die Homographie sie auf folgende Weise ab

Bildausrichtung mit Hilfe der Homographie

Die obige Gleichung gilt für ALLE Mengen korrespondierender Punkte, solange sie in der realen Welt auf derselben Ebene liegen. Mit anderen Worten: Sie können die Homographie auf das erste Bild anwenden und das Buch im ersten Bild wird mit dem Buch im zweiten Bild ausgerichtet! Siehe Abbildung 2.

Abbildung 2 : Ein Bild einer 3D-Ebene kann mit Hilfe der Homographie an einem anderen Bild der gleichen Ebene ausgerichtet werden

Aber was ist mit Punkten, die nicht auf der Ebene liegen? Nun, sie werden NICHT durch eine Homographie ausgerichtet, wie Sie in Abbildung 2 sehen können. Aber Moment, was ist, wenn es zwei Ebenen im Bild gibt? Nun, dann gibt es zwei Homographien – eine für jede Ebene.

Panorama: Eine Anwendung der Homographie

Im vorigen Abschnitt haben wir gelernt, dass wir ein Bild auf das andere verzerren können, wenn eine Homographie zwischen zwei Bildern bekannt ist. Es gab jedoch eine große Einschränkung. Die Bilder mussten eine Ebene enthalten (den oberen Teil eines Buches), und nur der ebene Teil wurde richtig ausgerichtet. Es stellte sich heraus, dass, wenn man ein Bild einer beliebigen Szene (nicht nur einer Ebene) aufnimmt und dann ein zweites Bild durch Drehen der Kamera macht, die beiden Bilder durch eine Homographie miteinander verbunden sind! Mit anderen Worten: Sie können Ihre Kamera auf ein Stativ montieren und ein Bild aufnehmen. Dann schwenken Sie sie um die vertikale Achse und machen ein weiteres Bild. Die beiden Bilder, die Sie gerade von einer völlig willkürlichen 3D-Szene aufgenommen haben, sind durch eine Homographie miteinander verbunden. Die beiden Bilder haben einige gemeinsame Bereiche, die ausgerichtet und zusammengefügt werden können, und schon haben Sie ein Panorama aus zwei Bildern. Ist das wirklich so einfach? Nö! (Tut mir leid, Sie enttäuschen zu müssen) Es gehört viel mehr dazu, ein gutes Panorama zu erstellen, aber das Grundprinzip besteht darin, die Bilder anhand einer Homografie auszurichten und intelligent zusammenzufügen, so dass man die Nähte nicht sieht. Die Erstellung von Panoramen wird auf jeden Fall Teil eines zukünftigen Beitrags sein.

Wie berechnet man eine Homographie?

Um eine Homographie zwischen zwei Bildern zu berechnen, müssen Sie mindestens 4 Punktkorrespondenzen zwischen den beiden Bildern kennen. Wenn Sie mehr als 4 korrespondierende Punkte haben, ist es sogar noch besser. OpenCV schätzt auf robuste Weise eine Homographie, die am besten zu allen korrespondierenden Punkten passt. Normalerweise werden diese Punktkorrespondenzen automatisch durch den Abgleich von Merkmalen wie SIFT oder SURF zwischen den Bildern gefunden, aber in diesem Beitrag werden wir die Punkte einfach von Hand anklicken.

Lassen Sie uns zuerst die Verwendung betrachten.

C++

Python

Schauen wir uns ein vollständigeres Beispiel sowohl in C++ als auch in Python an.

OpenCV C++ Homographie Beispiel

Die Bilder in Abbildung 2. können mit dem folgenden C++ Code erzeugt werden. Der folgende Code zeigt, wie man vier korrespondierende Punkte in zwei Bildern nimmt und das Bild auf das andere verzieht.

OpenCV Python Homography Example

Die Bilder in Abbildung 2. können auch mit dem folgenden Python-Code erzeugt werden. Der folgende Code zeigt, wie man vier korrespondierende Punkte in zwei Bildern nimmt und ein Bild auf das andere verzieht.

Anwendungen der Homographie

Die interessanteste Anwendung der Homographie ist zweifellos die Erstellung von Panoramen (auch bekannt als Bildmosaik und Bildstitching). Panoramen werden Gegenstand eines späteren Beitrags sein. Sehen wir uns einige andere interessante Anwendungen an.

Perspektivische Korrektur mit Homographie

Abbildung 3. Perspektivische Korrektur

Angenommen, Sie haben ein Foto wie in Abbildung 1. Wäre es nicht cool, wenn Sie auf die vier Ecken des Buches klicken könnten, um schnell ein Bild zu erhalten, das so aussieht wie in Abbildung 3. Den Code für dieses Beispiel finden Sie im unten stehenden Download-Bereich. Hier sind die Schritte.

  1. Schreiben Sie eine Benutzeroberfläche, um vier Ecken des Buches zu sammeln. Nennen wir diese Punkte pts_src
  2. Wir müssen das Seitenverhältnis des Buches kennen. Für dieses Buch ist das Seitenverhältnis (Breite/Höhe) 3/4. Wir können also die Größe des Ausgangsbildes auf 300×400 festlegen und unsere Zielpunkte ( pts_dst ) auf (0,0), (299,0), (299,399) und (0,399)
  3. Erhalten Sie die Homographie unter Verwendung von pts_src und pts_dst.
  4. Wenden Sie die Homographie auf das Ausgangsbild an, um das Bild in Abbildung 3 zu erhalten.
Sie können den Code und die Bilder, die in diesem Beitrag verwendet wurden, herunterladen, indem Sie unseren Newsletter hier abonnieren.

Virtuelle Werbetafel

Bei vielen im Fernsehen übertragenen Sportereignissen wird Werbung virtuell in die Live-Videoübertragung eingefügt. Beim Fußball und Baseball z.B. können die Anzeigen auf kleinen Werbetafeln direkt am Spielfeldrand virtuell verändert werden. Anstatt allen Zuschauern die gleiche Werbung zu zeigen, können die Werbetreibenden anhand der demografischen Daten, des Standorts usw. der Person auswählen, welche Werbung angezeigt werden soll. Bei diesen Anwendungen werden die vier Ecken der Werbetafel im Video erkannt, die als Zielpunkte dienen. Die vier Ecken der Anzeige dienen als Ausgangspunkte. Auf der Grundlage dieser vier korrespondierenden Punkte wird eine Homografie berechnet, mit der die Anzeige in das Videobild eingefügt wird.

Nach der Lektüre dieses Beitrags haben Sie wahrscheinlich eine Vorstellung davon, wie man ein Bild auf einer virtuellen Werbetafel platziert. Abbildung 4. zeigt das erste ins Internet hochgeladene Bild.

Abbildung 4. Das erste ins Internet hochgeladene Bild.

Abbildung 5. zeigt den Times Square.

Abbildung 5. Der Times Square
Sie können den Code (C++ & Python) und die Bilder, die in diesem Beispiel und anderen Beispielen in diesem Beitrag verwendet werden, herunterladen, indem Sie hier unseren Newsletter abonnieren.

Wir können eine der Werbetafeln am Times Square durch ein Bild unserer Wahl ersetzen. Hier sind die Schritte.

  1. Schreiben Sie eine Benutzeroberfläche, um die vier Ecken der Werbetafel im Bild zu sammeln. Nennen wir diese Punkte pts_dst
  2. Lassen Sie die Größe des Bildes, das Sie auf die virtuelle Werbetafel stellen wollen, w x h sein. Die Ecken des Bildes ( pts_src ) sollen daher (0,0), (w-1,0), (w-1,h-1) und (0,h-1)
  3. Erhalten Sie die Homographie mit pts_src und pts_dst .
  4. Wenden Sie die Homographie auf das Quellbild an und mischen Sie es mit dem Zielbild, um das Bild in Abbildung 6 zu erhalten.

Beachten Sie, dass wir in Abbildung 6. das in Abbildung 4. gezeigte Bild in das Times Square Bild eingefügt haben.

Abbildung 6. Virtuelle Werbetafel. Eine der Reklametafeln auf der linken Seite wurde durch ein Bild unserer Wahl ersetzt.

Abonnement &Code herunterladen

Wenn Ihnen dieser Artikel gefallen hat und Sie den in diesem Beitrag verwendeten Code (C++ und Python) und Beispielbilder herunterladen möchten, abonnieren Sie bitte unseren Newsletter. Sie erhalten dann auch einen kostenlosen Computer Vision Resource Guide. In unserem Newsletter veröffentlichen wir OpenCV-Tutorials und Beispiele in C++/Python sowie Algorithmen und Neuigkeiten aus den Bereichen Computer Vision und maschinelles Lernen.

Jetzt abonnieren

Bildnachweis

  1. Das Bild in Abbildung 4. war das erste fotografische Bild, das ins Internet hochgeladen wurde. Es fällt unter den Begriff „Fair Use“.
  2. Das in Abbildung 5 verwendete Bild. ( The Time Square ) ist unter der GFDL lizenziert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.