[PYTHON] [Computer Vision] Epipolare Geometrie mit Katzen gelernt

image

Einführung

Die Katze ist süß ~

In diesem Artikel lernen wir mit Katzen ** die Technologie zur Wiederherstellung der 3D-Welt aus Bildern mit mehreren Blickwinkeln kennen, die im Bereich der Bildverarbeitung behandelt wird **.

Dieses Gebiet wird noch erforscht und manchmal kommen schwierige Formeln heraus, aber ich hoffe, dass der Schmerz durch das Lernen mit Katzen neutralisiert wird.

Dieser Artikel entspricht Kapitel 5, "5.1 Epipolare Geometrie, 5.2 Berechnungen mit Kameras und 3D-Strukturen" in "Practical Computer Vision". Machen.

Ich möchte die 3D-Welt aus einem Bild mit mehreren Ansichten wiederherstellen

Das Bild der Katze am Anfang war ein zweidimensionales Bild. Wie stellen Sie die dreidimensionale Form dieser Katze wieder her?

Die richtige Antwort ist ** aus mehreren Perspektiven zu schießen, während Sie die Kamera auf die Katze zu bewegen **.

Basierend darauf, wie die Katze von jedem Standpunkt aus aussieht, werden die Änderung der Haltung der Kamera und die geometrische Struktur der Katze, die von der Kamera fotografiert wird, umgekehrt berechnet.

Dies wird als Struktur aus Bewegung (SfM) bezeichnet.

sfm_neko.png

Das Verfahren ist wie folgt.

Betrachten Sie hier Bildpaare, um das Problem zu vereinfachen. Mit anderen Worten, betrachten Sie nur zwei Gesichtspunkte.

Zunächst erkläre ich die grundlegende Theorie, die zwischen diesen Bildern auftritt. Danach werden wir die Kamerabewegung abschätzen und die 3D-Szene rekonstruieren. Die Gesamtoptimierung von 4. ist ein Prozess, der nur erforderlich ist, wenn es viele Gesichtspunkte gibt, daher werden wir ihn hier nicht berücksichtigen.

Epipolare Geometrie ist was?

Bevor Sie die Kamera bewegen oder eine 3D-Szene aus einem Bild mit zwei Ansichten wiederherstellen, müssen Sie die grundlegende Theorie der epipolaren Geometrie verstehen. Epipolare Geometrie ist die Geometrie, die auftritt, wenn zwei Kameras dasselbe dreidimensionale Objekt aus verschiedenen Perspektiven erfassen.

Die Elemente, die die epipolare Geometrie systematisieren, sind die Epipolarebene, die Epipolarlinien, die Epipole, die Grundmatrix und die Grundmatrix, die wir als nächstes einführen werden.

Fünf super wichtige Wörter, die in der epipolaren Geometrie vorkommen

epipolar_geometry.png

Entsprechende Punkte und epipolare Linien auf dem tatsächlichen Bild: image

Grundmatrix F.

Auftreten einer epipolaren Zurückhaltungszeremonie

Wenn $ x_ {1} $ und $ x_ {2} $ Korrespondenzpunkte sind, gilt die folgende Beziehung für alle Korrespondenzpunkte $ x_ {1} $, $ x_ {2} $.

\boldsymbol{x_{2}^{T}}F\boldsymbol{x_{1}} = 0

$ F $ heißt Basismatrix und ist eine 3x3-Matrix. $ x_ {1} $, $ x_ {2} $ sind dreidimensionale Vektoren, die die Koordinaten der entsprechenden Punkte im ** Bildkoordinatensystem im simultanen Koordinatensystem darstellen.

Diese Formel zeigt, dass zwischen den entsprechenden Punkten der beiden Bilder eine Einschränkungsbeziehung besteht. ** Diese Formel wird als epipolare Rückhalteformel bezeichnet. ** Sobald der Ansichtspunkt festgelegt ist, wird entschieden (= Einschränkung), auf welcher Seite in Bild 2 sich der entsprechende Punkt in Bild 1 befindet. Und diese Einschränkungsformel hängt nur von ** 2 Gesichtspunkten ab und überhaupt nicht von der 3D-Szene. ** ** **

F.png

Lassen Sie uns nun überprüfen, ob $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ gilt.

Da $ x_ {1} $ ein Punkt in Bild 1 ist, wird er ausgedrückt als $ x_ {1} = (x_ {1}, y_ {1}, z_ {1}) ^ {T} $ ($ z_ {1) } $ Ist 1).

Da F eine 3x3-Matrix ist, ist $ Fx_ {1} $, das Produkt von $ x_ {1} $, ein dreidimensionaler Vektor. Sei dieser Vektor $ Fx_ {1} = (a, b, c) ^ T $.

Dieses $ Fx_ {1} = (a, b, c) ^ T $ ist der Koeffizient der Epipolarlinie in Bild 2. Das Multiplizieren dieses Koeffizienten mit x2 auf der Epipolarlinie zeigt dann, dass die lineare Gleichung $ ax + mit + c = 0 $ erfüllt ist. Mit anderen Worten, $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ gilt!

Im Gegenteil, wenn das Ergebnis der Ersetzung von $ x_ {2} $ nicht 0 ist, kann gesagt werden, dass der Punkt $ x_ {2} $ nicht der entsprechende Punkt von x1 ist (siehe die folgende Abbildung).

point_to_line_by_F.png

Bei der Suche nach dem entsprechenden Punkt $ x_ {2} $ in Bild 2 des Punktes $ x_ {1} $ in Bild 1, anstatt nach dem gesamten Bild in ** Bild 2 zu suchen, $ x_ {1} $ Es muss nur die auf Bild 2 projizierte Epipolarlinie $ l_ {2} $ durchsucht werden **, damit sich die Berechnungskosten und die Fehlerantwortrate verringern.

Übrigens bildet die obige Gleichung $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ den Punkt $ x_ {1} $ auf Bild 1 auf Bild 2 als gerade Linie ab. Es repräsentiert den Fall. Wenn im Gegensatz dazu der Punkt $ x_ {2} $ auf Bild 2 als gerade Linie auf Bild 1 abgebildet wird, wird die folgende Gleichung erhalten und beide Seiten werden transponiert, so dass es mathematisch gleich ist. ($ (\ Boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}}) ^ {T} = $ Die folgende Formel)

\boldsymbol{x_{1}^{T}}F^{T}\boldsymbol{x_{2}} = 0

Der Punkt ist, dass die Positionen von $ x_ {1} $ und $ x_ {2} $ vertauscht und F transponiert werden.

point_to_line_by_F_inv.png

1. Finden Sie F.

Wie findest du F? Dafür gibt es mehrere typische Methoden.

Wenn Sie die beiden Kameramatrizen kennen, finden Sie sie auch dort Implementierung.

8-Punkt-Algorithmus

Hier finden Sie eine Übersicht über den grundlegendsten 8-Punkt-Algorithmus (eine detaillierte Implementierung finden Sie unter dem obigen Link).

Der epipolare Einschränkungsausdruck $ \ boldsymbol {x_ {2} ^ {T}} F \ boldsymbol {x_ {1}} = 0 $ gibt eine Gleichung für jeden Korrespondenzpunkt i:

F_mat.png

Da die unbekannte Variable hier eine F-Matrix ist, werden wir F zusammenfassen und in Form der Gleichung Af = 0 nach f auflösen. Hier ist F eine 3x3-Matrix, aber da die Skala unbestimmt ist, kann sie gelöst werden, wenn es praktisch 8 entsprechende Punkte gibt. Der Name des "8-Punkt-Algorithmus" stammt von hier.

8point_al.png

Verwenden Sie nach dem Zerlegen mit SVD, dass F Rang 2 ist. Wenn die minimale Singularität der diagonalen Komponente von Σ auf 0 gesetzt und gelöst wird, erhöht sich die Genauigkeit von F. Die linke Seite der folgenden Abbildung ist der Fall, in dem die Einschränkung von Rang 2 nicht angewendet wird, und die rechte Seite ist der Fall, in dem die Einschränkung von Rang 2 angewendet wird.

F_singular_correct.png Zitiert aus Lit. [1].

2. Suchen Sie die Kameramatrix aus F.

Warum haben wir F gefunden? Weil wir die Kameramatrix P aus ** F ** finden können.

Wie bereits erwähnt, enthält F eine interne Kameramatrix und eine externe Kameramatrix. Wenn daher F in interne und externe Kameramatrizen zerlegt wird, kann die Kameramatrix daher aus F geschätzt werden.

Die Genauigkeit der Schätzung hängt jedoch davon ab, ob die Kamera im Voraus kalibriert wurde oder nicht. Wenn die internen Parameter der Kamera unbekannt sind, kann nur die Projektionstransformation aus F geschätzt werden.

Der Prozessablauf von F zur Schätzung der Kameramatrix ist in der folgenden Abbildung dargestellt.

F_to_cam_summary.png

Wenn die Kamera nicht kalibriert ist

Wenn die Kamera nicht kalibriert ist, dh wenn die internen Parameter der Kamera unbekannt sind, müssen sowohl die internen als auch die externen Parameter der Kamera geschätzt werden. In diesem Fall ** kann die Kameramatrix nur bis zur Projektionstransformation geschätzt werden. ** ** **

Normalerweise kann P zu F als eins berechnet werden, aber ** im Gegenteil, F zu P kann nicht als eins berechnet werden **. Dies liegt daran, dass die Grundmatrizen der beiden Sätze projizierter Bilder gleich sind.

Zum Beispiel sind F in der Kameramatrix (P, P'H) und F in der Kameramatrix (PH, P'H) gleich.

Die Kameramatrix $ P_ {1} $, $ P_ {2} $ ist wie folgt. × ist das äußere Produkt.

P_{1}=[I|0]Und P_{2} =[[e_{2}]×F|e_{2}]

Wenn die Kamera kalibriert wurde

Wenn die Kamera kalibriert wurde, müssen Sie nur die externen Parameter der Kamera schätzen. Alle Parameter mit Ausnahme der Translationsskala können geschätzt werden. F hat die Mehrdeutigkeit der Projektionstransformation, während E die Mehrdeutigkeit hat, vier Lösungen zu haben.

Finden Sie zuerst die Basismatrix E aus F mit $ E = K_ {2} FK_ {1} $. Als nächstes zerlegen Sie E mit SVD. Da E det (E) = 0 hat und die anderen Singularwerte als 0 gleich sind und ihre Größen unbestimmt sind, kann die diagonale Komponente von Σ als (1,1,0) geschrieben werden. Mit anderen Worten kann es durch SVD wie folgt zerlegt werden.

E=Udiag(1,1,0)V^{T}

$ u_ {3} $ ist der Vektor der dritten Spalte von $ U $

W = \begin{pmatrix}
0 & -1 & 0 \\
1 & 0 & 0 \\
0 & 0 & 1 
\end{pmatrix}

Am Ende erscheinen dann die folgenden vier Lösungen in der Kameramatrix.

スクリーンショット 2016-02-24 6.50.49.png

Von diesen hat nur einer die Szene vor der Kamera, daher ist (a) die richtige Lösung. (Abbildung unten)

スクリーンショット 2016-02-23 17.12.44.png

Zitiert aus Lit. [1].

3. Erstellen Sie die 3D-Welt neu

Die Kameramatrix P wurde erhalten. Lassen Sie uns endlich die dreidimensionale Welt rekonstruieren.

Dreieckige Vermessung

Die dreieckige Vermessung schätzt X, das gleichzeitig die folgenden Kamerakonvertierungsformeln aus zwei Blickwinkeln erfüllt.

スクリーンショット 2016-02-23 10.04.12.png

Zitiert aus Lit. [1].

Aus der Kamerakonvertierungsformel, in der die Kameramatrix $ P_ {1} $, $ P_ {2} $ lautet

\lambda_{1}x_{1} = P_{1}X
\lambda_{2}x_{2} = P_{2}X

Wenn Sie es also in einer Matrix ausdrücken,

\begin{bmatrix}
P_{1} & -x_{1} & 0 \\
P_{2} & 0 & -x_{2} 
\end{bmatrix}
\begin{bmatrix}
X \\
\lambda_{1}\\
\lambda_{2} 
\end{bmatrix}
=0

Es wird sein.

Da dies auch in Form von Ax = 0 vorliegt, kann 3D X durch Lösen von x mit SVD wiederhergestellt werden.

Implementierung

Referenzmaterial

Recommended Posts

[Computer Vision] Epipolare Geometrie mit Katzen gelernt
Lernen Sie mit Chainer, monochrome Bilder einzufärben
Vorbereitung auf das Erlernen technischer Indikatoren mit TFlearn
Öffnen Sie AI Gym, um mit PD-gesteuertem Cart Pole zu lernen
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Lernen Sie mit Caffe, handschriftliche Zahlen (MNIST) zu erkennen
AWS-Schrittfunktionen zum Lernen anhand eines Beispiels
Wie man Kaldi mit JUST Corpus trainiert
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Vom Kauf eines Computers bis zur Ausführung eines Programms auf Python
Site-Zusammenfassung zum Erlernen des maschinellen Lernens mit englischen Videos
Wie man strukturiertes SVM von ChainCRF mit PyStruct lernt
[How to!] Lerne und spiele Super Mario mit Tensorflow !!
MVC-Model Edition, um nur mit Voreingenommenheit von 0 zu lernen
Ich möchte einen Quantencomputer mit Python betreiben
Textextraktion (Lese-API) mit Azure Computer Vision-API (Python3.6)