Ergänzung zur "Kamerakalibrierung" von OpenCV-Python-Tutorials

Die Ergänzung zu OpenCV-Python-Tutorials "Kamerakalibrierung" wurde als separater Artikel umgeschrieben.

** Bedeutung der Kameramatrix **

[fx, 0, cx; 0, fy, cy; 0, 0, 1] Es ist leicht zu übersehen, dass die Einheit der Brennweiten fx und fy Pixel ist. Das kamerazentrierte (cx, cy) [Pixel] entspricht nicht immer der halben Bildgröße. Es stimmt nur überein, wenn die Kamera richtig nach vorne zeigt. Die Achse vor der Kamera ist nicht immer orthogonal zur Achse, die die beiden Kameras der Stereokamera verbindet. Daher unterscheidet sich die Position des Fluchtpunkts, wenn sich das Motiv von der Kamera entfernt, von der Bildmitte. (Cx, cy) in der Mitte der Kamera ist die Koordinate des Fluchtpunkts.

Bei Kalibrierung mit einer Stereokamera Der Unterschied in der Position der Mitte der Kamera der linken und der rechten Kamera zeigt an, dass die Ausrichtungen der beiden Kameras nicht leicht parallel sind.

(cx-halbe Bildbreite) / fx Es scheint, dass es tan (θx) des Abweichungswinkels θx der Richtung der Kamera ist.

(Ich bin kein Experte, es tut mir leid, wenn ich einen Fehler mache.)

Bei der Stereoanpassung nach dem Erstellen eines Stereokameramoduls Dies muss durch Ausführen einer Kalibrierung + Verzerrungskorrektur für das Stereopaar bestätigt werden. Auf diese Weise können Sie visuell überprüfen, inwieweit die Verzerrungskorrektur erfolgreich ist. In Bereichen, in denen die Verzerrungskorrektur nicht erfolgreich ist, verschieben sich die Parallaxenwerte systematisch und geben nicht die richtigen Werte zurück.

Skripte im Verzeichnis (opencv_3) \ sources \ samples \ python

calibrate.py Es ist ein Skript zur Kalibrierung + Verzerrungskorrektur. cv2.calibrateCamera() cv2.getOptimalNewCameraMatrix() cv2.undistort()

Befindet sich in (opencv_2-Verzeichnis) \ sources \ samples \ python2 calibrate.py Dies ist ein Skript, das nur Verzerrungen kalibriert und nicht korrigiert.

cv2.calibrateCamera()

Beispiel für eine Stereo-Gleichrichtung tom5760/stereo_vision

stereo_match.py Berechnet die Stereoanpassung aus dem Bild nach der Stereoparallelisierung. Es erzeugt einen Entfernungsunterschied und wandelt den Abstand um. Darin wird die Parallaxe wie folgt in 3D-Koordinaten konvertiert.

python


Q = np.float32([[1, 0, 0, -0.5*w],
                    [0,-1, 0,  0.5*h], # turn points 180 deg around x-axis,
                    [0, 0, 0,     -f], # so that y-axis looks up
                    [0, 0, 1,      0]])
points = cv2.reprojectImageTo3D(disp, Q)

Die räumlichen Koordinaten lassen sich leicht in Dateien mit der Erweiterung .ply konvertieren. Resulting .ply file cam be easily viewed using MeshLab ( http://meshlab.sourceforge.net/ ) Da es geschrieben ist, kann es mit MeshLab wie folgt in 3D angezeigt werden. meshlab_half.png

Die Abbildung zeigt die in stereo_match.py generierten 3D-Koordinaten, die in MeshLab angezeigt werden.

aloe画像 Es war schwer zu bemerken, dass das Tuch hinter dem eine Tiefenänderung wie bei dieser 3D-Anzeige aufwies. aloe画像とdepth画像

Es gibt eine Entdeckung, dass die 3D-Anzeige mit MeshLab usw. wie diesem erfolgt.

Die Konvertierung in das Ply-Dateiformat ist im obigen Python-Skript enthalten. Der folgende Code ist der Code des Teils, der die 3D-Daten (sowohl die 3D-Koordinaten jedes Punkts als auch die Farbe) für diesen Zweck ausgibt. Es ist sehr einfach zu schreiben, da es numpys savetxt () verwendet.

python


import numpy as np
import cv2

ply_header = '''ply
format ascii 1.0
element vertex %(vert_num)d
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
'''

def write_ply(fn, verts, colors):
    verts = verts.reshape(-1, 3)
    colors = colors.reshape(-1, 3)
    verts = np.hstack([verts, colors])
    with open(fn, 'w') as f:
        f.write(ply_header % dict(vert_num=len(verts)))
        np.savetxt(f, verts, '%f %f %f %d %d %d')

Geben Sie bei der Berechnung der Disparität den minimalen Disparitätswert und die Anzahl der Suchvorgänge an, damit die Disparität nur innerhalb eines bestimmten Bereichs der Anordnung und des Objekts gesucht wird. Damit ・ Es ist weniger wahrscheinlich, dass eine falsche Parallaxe auftritt. ・ Die Rechenzeit wird reduziert. Es führt zu.

** Verwandte Beispielprogramme in OpenCV-C ++ (Stereoanlage / Kamerakalibrierungssystem) **

Liste der Beispielquellen für OpenCV 2.4.0 (Beispiele / cpp) https://github.com/YusukeSuzuki/opencv_sample_list_jp/blob/master/samples_cpp.rst Es ist auch nützlich, Beispielprogramme zu lesen, die sich auf Stereo in C ++ beziehen. 3calibration.cpp calibration.cpp calibration_artificial.cpp stereo_calib.cpp stereo_match.cpp

Der auf diese Weise erfasste Disparitätswert wird tendenziell durch Rauschen beeinflusst. In OpenCV3.1 kann der Einfluss des Rauschens mithilfe der folgenden Funktion reduziert werden. cv::ximgproc::DisparityWLSFilter Class Reference Es sollte beachtet werden, dass OpenCV3.1 eine andere Funktionsschnittstelle als das OpenCV2.4-System hat, aber es lohnt sich, es zu versuchen.

** Für Fischaugen-Kamera **

Kalibrierung der Fischaugen-Kamera mit OpenCV

Verwenden Sie die Kalibrierungsfunktion cv :: fisheye :: kalibrieren () für Fischaugen-Kameras, um die Kameraparameter abzurufen. Die Funktionsbeschreibung finden Sie auf der folgenden Seite. http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#fisheye-calibrate

Ich habe im [Python-Dokumentationsserver] festgestellt, dass die Kalibrierung der Fischaugen-Kamera nicht in cv2 enthalten ist. Geben Sie in diesem Fall die Verarbeitung in Python und den Code in C ++ auf.

Nur die Stereo-Parallelisierung erfordert die Funktionalität des cv :: fisheye-Namespace. Nachdem die Stereo-Parallelisierung abgeschlossen ist, müssen Sie lediglich das Parallaxenbild wie zuvor ableiten.

Der folgende Artikel enthält den Code für den Fisheye-Fall. Beispielcode für die OpenCV-Kamerakalibrierung

Omnidirectional Camera Calibration Mit einer omnidirektionalen Kamera, die einen größeren Winkel als eine Fischaugen-Kamera hat, wird die Stereo-Parallelisierung schwieriger.

YouTube OpenCV GSoC 2015 Omnidirectional Camera Calibration

“Omnidirectional Cameras Calibration and Stereo 3D Reconstruction” – opencv_contrib/ccalib module (Baisheng Lai, Bo Li)

Davide Scaramuzza Omnidirectional Camera pdf

Es gibt verschiedene Methoden für Fischaugen-Kameras, da der relationale Ausdruck zwischen R und θ unterschiedlich ist. Bitte beziehen Sie sich auf die folgende URL. Sie müssen überprüfen, welche der folgenden Methoden vom Quellcode in opencv_contrib unterstützt wird.

Fisheye Projection

Äquidistanzprojektion Equisolid Angle Projection Orthographische Projektion

Unterschied in der Projektionsmethode

[Konventionelle Fischaugenlinse (H180) Neu untersuchte Fischaugenlinse (TY180)] (http://www.mvision.co.jp/mcm320fish.html)

[Design Wave MAGAZIN] Ausgabe September 2008 [Magazin]](http://books.rakuten.co.jp/rb/7848928/) [Schwerpunktprojekt] Forschung zu Fischaugenobjektiven, die in Autos eingebaut wurden - Der Vergleich verschiedener Projektionsmethoden und gegenseitiger Konvertierungsmethoden ist ein 15-seitiger Artikel. Die Beschreibung des Verfahrens ist detailliert, und das Verfahren zum Konvertieren des Erscheinungsbilds des Bildes zwischen den Verfahren wird ebenfalls beschrieben.

[Windows] [Python] Kamerakalibrierung des Fischaugenobjektivs mit OpenCV


** Welches soll ich verwenden, quadratisches Gitter oder Kreisgitter? **

Abschließend ist es besser, das Kreisgitter zu verwenden. Der Grund ist einfach: Das Kreisgitter hat eine höhere Genauigkeit bei der Berechnung der Koordinaten der Merkmalspunkte in Schritt 2. Da eine Ellipse (einschließlich eines Kreises) die Eigenschaft hat, eine Ellipse zu sein, selbst wenn sie aus einem Winkel betrachtet wird, können die Koordinaten des Merkmalspunkts genau erhalten werden, indem der Schwerpunkt als Merkmalspunkt verwendet wird. Andererseits ist im Fall eines quadratischen Gitters der Merkmalspunkt der Schnittpunkt von geraden Linien. Aus einem Winkel betrachtet ist die Form des Quadrats verzerrt und es ist nicht möglich, stabile Koordinaten zu erhalten.

[cv2.findCirclesGridDefault(image, patternSize[, centers[, flags]]) ] (http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#findcirclesgrid)

garbage in garbage out Stereo Matching ist eine Messung. Gute Ergebnisse werden nur erzielt, wenn das Bild in einem für die Messung geeigneten Zustand aufgenommen wurde. Richten Sie die Helligkeit der linken und rechten Kamera aus (stellen Sie die automatische Verstärkung aus). Stellen Sie das Bild in den richtigen Helligkeitsbereich (extrem hell, verdunkelt). Stellen Sie sicher, dass das Bild Texturänderungen aufweist (vermeiden Sie zu flache Bilder). Diese Dinge programmieren nicht, aber Sie können sie nicht ignorieren und gute Ergebnisse erzielen. Ich werde es wiederholen. Stereo Matching ist eine Messung. Die Qualität der Eingangsdaten für die Stereoanpassung ändert sich abhängig von den Motivbedingungen bei der Aufnahme und den Aufnahmebedingungen der Kamera. Egal wie gut das Programm selbst ist, wenn die Qualität der Eingabedaten schlecht ist, werden nur schlechte Ergebnisse erzielt. Es ist "Müll in Müll raus".

** Stereokameras nach dem Prinzip verstehen **

Das Verständnis von Stereokameras wird stark durch das Experiment der 3D-Messung beeinflusst, das sich ein wenig von anderen Bildverarbeitungs- und Bilderkennungsteilen unterscheidet. Selbst diejenigen, die sich mit normaler Bildverarbeitung auskennen, können es schwierig finden, die große Anzahl von Argumenten von Stereo-Matching-Funktionen zu beherrschen.

—— Wiederherstellung von 3D-Bildern in mehreren Ansichten und Zusammenfassung der Stereovision http://qiita.com/sobeit@github/items/d419ea39b06e43e6200f

Ist auch leicht verständlich geschrieben.

slideshare  Stefano Mattoccia「 Stereo Vision: Algorithms and Applications」 Stefano Mattoccia DEIS University of Bologna 214 pages Ist eine ziemlich detaillierte Folie. Es ist schwer, eine so detaillierte Erklärung in einem Bilderkennungsbuch zu finden.

So erstellen Sie eine Stereokamera

Semi-Global Matching mit Jetson TK1

Hochpräzise Kalibrierung der Fischaugen-Linsenkamera mit Streifenmuster http://www.iim.cs.tut.ac.jp/~kanatani/papers/fisheyecalib.pdf

** Maßnahmen zur Vermeidung von Fehlausrichtungsfehlern im SAD-Algorithmus, wenn zwischen der linken und der rechten Kamera ein Helligkeitsunterschied besteht **

Es ist bekannt, dass Unterschiede in den Helligkeitswerten die Ergebnisse der Stereoanpassung verschlechtern. Als Gegenmaßnahme dagegen wird eine Änderung des Histogramms in Betracht gezogen. [Suppression for Luminance Difference of Stereo Image-Pair Based on Improved Histogram Equalization ] http://onlinepresent.org/proceedings/vol6_2012/17.pdf

Vorteile der CENSUS-Konvertierung • Die Helligkeitswerte werden nicht direkt verglichen, daher ist sie gut für Beleuchtungsschwankungen geeignet. - Im Vergleich zur relativen Beziehung zum Zentrum. • Stark gegen Rauschen. - Binärwerte werden verglichen, sodass das winzige Rauschen nur wenig reflektiert wird • Stabile Zuordnung in Bereichen mit wenigen Mustern - Effekt der Hervorhebung von Kanten (Mustern) aufgrund von Effekten wie Unterschied vom Zentrum → Differenzierung http://www.slideshare.net/FukushimaNorishige/popcnt


Nachtrag

SlideShare SSII2019TS: Praktische Grundlagen der Kamerakalibrierung und Anwendungen der realen Messung mit Kameras-

Recommended Posts

Ergänzung zur "Kamerakalibrierung" von OpenCV-Python-Tutorials
OpenCV-Python & Scikit-Image-Ergänzung zu "Must-See" OpenCV-Python Tutorials "2"
Ich möchte in der Einschlussnotation drucken
Kamerakalibrierung
Wie bekomme ich Stacktrace in Python?
[V11 ~] Ein Memorandum für Misskey
Erstellen Sie ein Schachbrettmuster für die Kamerakalibrierung
Berechnen wir das statistische Problem mit Python
So löschen Sie einen Taple in einer Liste (Python)
Einbetten von Variablen in Python-Strings
Ich möchte mit Python ein Fenster erstellen
So erstellen Sie eine JSON-Datei in Python
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
So implementieren Sie eine Verlaufsauswahl in Houdini
Schritte zum Entwickeln einer Webanwendung in Python
So fügen Sie Python ein Modul hinzu, das Sie in Julialang eingefügt haben
So benachrichtigen Sie Discord-Kanäle in Python
Kamerakalibrierung und Verwendung mit opencv-python [chang method]
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
So erstellen Sie eine Rest-API in Django
Wie schreibe ich ein benanntes Tupeldokument im Jahr 2020?
So zählen Sie Zahlen in einem bestimmten Bereich
So lesen Sie Dateien in verschiedenen Verzeichnissen
Wie man eine öffentliche Funktion in Pytest verspottet
Muss "OpenCV-Python Tutorials" 2
Muss "OpenCV-Python Tutorials"
So legen Sie das Schema in den Django-Datenbankeinstellungen fest
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
So konvertieren / wiederherstellen Sie einen String mit [] in Python
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
[Python] So erweitern Sie Variablen in einer Zeichenfolge
Erstellen Sie ein Plug-In, das Python Doctest auf Vim ausführt (2)
Ich habe ein Skript erstellt, um ein Snippet in README.md einzufügen
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Erstellen Sie ein Plug-In, um Python Doctest mit Vim (1) auszuführen.
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
So zeigen Sie DataFrame als Tabelle in Markdown an
Was tun, wenn in pip ein Unicode-Dekodierungsfehler auftritt?
Praktisch, um Matplotlib-Unterzeichnungen in for-Anweisungen zu verwenden
Einführung in die lineare Algebra mit Python: A = LU-Zerlegung
[Python] Erstellt eine Methode zum Konvertieren von Radix in 1 Sekunde
So führen Sie einen Befehl mit einem Unterprozess in Python aus
Es wurde eine Möglichkeit für UEFI behoben, Windows zum Booten zu zwingen
Geben Sie einen Binärspeicherauszug in Binärdatei und zurück in eine Binärdatei aus
So verweisen Sie auf statische Dateien in einem Django-Projekt
2 Möglichkeiten, alle CSV-Dateien in einem Ordner zu lesen
Veröffentlichen / Hochladen einer in Python erstellten Bibliothek in PyPI
[Linux] Wie Sie Ihre IP in eine Variable einfügen