| Operatoren |
radial_distortion_self_calibration — Kalibrieren der radialen Verzeichnung.
radial_distortion_self_calibration(Contours : SelectedContours : Width, Height, InlierThreshold, RandSeed, DistortionModel, DistortionCenter, PrincipalPointVar : CameraParam)
radial_distortion_self_calibration berechnet die Verzeichnungsparameter sowie das Verzeichnungszentrum einer Linse basierend auf den in Contours übergebenen XLD-Konturen. Ähnlich dem Operator camera_calibration werden die Verzeichnungswerte im Parameter CameraParam zurückgegeben. Indem man diesen Parameter an die Operatoren change_radial_distortion_cam_par und change_radial_distortion_image weiterreicht, kann man die radiale Verzeichnung in Bildern korrigieren. Zusätzlich werden in SelectedContours die Konturen zurückgegeben, die zur Kalibrierung verwendet wurden.
Beachten Sie jedoch, dass mit dem Operator keine 3D-Information in der Szene bestimmt werden kann, da die Brennweite und die Skalierungsfaktoren nicht bestimmt werden.
Das zur Kalibrierung verwendete Verzeichnungsmodell kann über DistortionModel gewählt werden. Beim Divisionsmodell (DistortionModel = 'division') werden die Verzeichnungen über den Verzeichnungsparameter kappa beschrieben (siehe camera_calibration). Beim polynomiellen Modell (DistortionModel = 'polynomial') werden die Verzeichnungen über die radialen Verzeichnungsparameter K1, K2, K3 und die tangentialen Verzeichnungsparameter P1, P2 beschrieben (siehe camera_calibration). Das Zentrum der Verzeichnungen c = (c_x, c_y) wird als Hauptpunkt angenommen. Für DistortionModel = 'division' enthält CameraParam die Werte für f, kappa, s_x, s_y, c_x, c_y, Width, Height. Für DistortionModel = 'polynomial' enthält CameraParam die Werte für f, K1, K2, K3, P1, P2, s_x, s_y, c_x, c_y, Width, Height. Da die Kalibrierung ohne einen Kalibrierkörper durchgeführt wird, können die Brennweite f und die Skalierungsfaktoren (s_x, s_y) nicht bestimmt werden und werden daher auf 0 beziehungsweise 1 gesetzt.
Die Bestimmung der Verzeichnung basiert auf der Annahme, dass in der aufgenommen Szene eine signifikante Anzahl von geraden Kanten oder Linien vorhanden ist. Durch die Linsenverzeichnung werden diese Geraden auf gekrümmte Linien abgebildet. Es werden nun geeignete Parameter gesucht, die diese gekrümmten Linien wieder auf Geraden abbilden, und somit also die Verzeichnung kompensieren.
In der Anwendung bestimmt man mit einem Kanten- oder Linienextraktor (z.B. edges_sub_pix oder lines_gauss) die Konturen im Bild. Die Konturen sollten im Bild gleichverteilt und möglichst in der Nähe des Bildrands liegen, da sich dort die Verzeichnung am stärksten auswirkt und damit die Kalibrierung am stabilsten wird. Zur Verbesserung von Laufzeit oder Robustheit können die Konturen auch vorverarbeitet werden (z.B. mit segment_contours_xld, union_collinear_contours_xld, union_cocircular_contours_xld oder select_shape_xld), um möglichst lange gerade oder kreisförmige Segmente zu erhalten. Falls in einem Bild nicht ausreichend viele gerade Konturen in der Szene vorhanden sind, können auch die Konturen aus mehreren Bildern übergeben werden (concat_obj).
Der Operator bestimmt automatisch über ein robustes RANSAC-Verfahren jene Konturen aus Contours, die das Abbild von Raumgeraden sind. Die Konturen, die diese Forderung nicht erfüllen und somit für den Kalibrierungsprozess ungeeignet sind, werden als Ausreißer bezeichnet. Der Operator geht von einer maximalen Ausreißerquote von 50 Prozent aus. Eine Kontur wird als Ausreißer klassifiziert, falls die mittlere Abweichung der Kontur von einer Geraden nach der Verzeichnungskorrektur den maximalen Schwellwert T überschreitet:
m
1 -----
- \ | d | > InlierThreshold * m / 100 = T
m / | j |
-----
j=1
Der Wert InlierThreshold beschreibt die mittlere Abweichung der Kontur von einer Geraden in Pixeln bei einer Kontur mit 100 Konturpunkten. Der eigentliche Schwellwert T entsteht durch die Skalierung von InlierThreshold mit der Referenzlänge (100) und der Konturpunktzahl m, um bei geometrisch ähnlichen Konturen die gleiche Kontur-Klassifizierung zu erreichen. Die typischen Werte für InlierThreshold liegen zwischen 0.05 und 0.5. Je höher der Wert, desto mehr Abweichungen werden toleriert. Wird für InlierThreshold der Wert 0 eingegeben, werden sämtliche Konturen Contours zur Kalibrierung verwendet. Die RANSAC-Konturauswahl wird dadurch unterdrückt, so dass eine manuelle Auswahl der Konturen möglich ist. Dies ist beispielsweise dann hilfreich, wenn die Ausreißerquote über 50 Prozent liegt.
Mit dem Parameter RandSeed kann das randomisierte Verhalten des RANSAC-Verfahrens beeinflusst werden, um reproduzierbare Ergebnisse zu erhalten. Wird RandSeed auf einen positiven Wert gesetzt, so liefert der Operator bei jedem Aufruf mit denselben Parametern auch dasselbe Resultat, da der intern verwendete Zufallsgenerator mit RandSeed initialisiert wird.
Zur Bestimmung der Verzeichnungsparameter (kappa, c_x, c_y) beziehungsweise (K1, K2, K3, P1, P2, c_x, c_y) stehen die Methoden 'variable', 'adaptive' und 'fixed' zur Verfügung, die unter DistortionCenter festgelegt werden. Bei der Vorauswahl 'variable' wird von Beginn an mit variablen Verzeichnungszentrum c kalibriert. Hierbei sollten viele gleichmäßig verteilte Konturen in der Nähe des Bildrandes vorliegen oder die Verzeichnung möglichst stark sein, da ansonsten das Verzeichnungszentrum nicht bestimmt werden kann und dies zur Instabilität führt. Bei der Variante 'adaptive' wird zunächst das Verzeichnungszentrum c fest in der Bildmitte angenommen und die Ausreißer mit dem Schwellwert InlierThreshold eliminiert. In einem letzten Schritt wird dann eine Kalibrierung mit allen Verzeichnungsparametern (kappa, c_x, c_y) beziehungsweise (K1, K2, K3, P1, P2, c_x, c_y) durchgeführt, die dann angenommen wird, falls c = (c_x,c_y) als eine stabile Lösung in der Nähe der Bildmitte gefunden wurde. Andernfalls wird c in der Bildmitte angenommen. Diese Methode sollte dann verwendet werden, wenn das Verzeichnungszentrum außerhalb der Bildmitte gesucht werden soll, jedoch wenige Konturen zur Verfügung stehen oder die Lage der Konturen ungünstig ist (Bsp.: Konturen verlaufen in gleiche Richtung oder liegen im selben Bildbereich). Bei 'fixed' wird schließlich das Verzeichnungszentrum als konstant in der Bildmitte angenommen und nur kappa beziehungsweise (K1, K2, K3, P1, P2) bestimmt. Diese Methode sollte bei sehr schwachen Verzeichnungen und wenigen Konturen in schlechter Lage angewendet werden.
Über den Parameter PrincipalPointVar kann bei den Methoden 'adaptive' und 'variable' schließlich die Abweichung von c von der Bildmitte gesteuert werden. Falls die Abweichung gesteuert werden soll, muss PrincipalPointVar zwischen 1 und 100 liegen. Dabei gilt: Je höher der Wert, umso mehr darf c von der Bildmitte abweichen. Liegt der Wert bei 0, findet keine Steuerung statt, d.h. der Hauptpunkt wird alleine durch die Konturen bestimmt. Generell sollte die Steuerung über PrincipalPointVar bei schwachen Verzeichnungen und ähnlich orientierten Konturen verwendet werden, da sonst unter Umständen keine stabile Lösung gefunden wird.
Aufgrund des verwendeten Algorithmus ist die Laufzeit von radial_distortion_self_calibration für DistortionCenter = 'variable' und PrincipalPointVar = 0 am geringsten. Die Laufzeit für DistortionCenter = 'variable' und PrincipalPointVar > 0 steigt mit kleineren Werten von PrincipalPointVar signifikant an. Die Laufzeiten für DistortionCenter = 'adaptive' und DistortionCenter = 'fixed' sind auch signifikant höher als bei DistortionCenter = 'variable' und PrincipalPointVar = 0.
Da das polynomielle Modell (DistortionModel = 'polynomial') mehr Parameter enthält als das Divisionsmodell (DistortionModel = 'division'), kann die Kalibrierung über das polynomielle Modell eine etwas geringere Stabilität aufweisen als die Kalibrierung über das Divisionsmodell. Dies macht sich besonders bei der Bestimmung der tangentialen Verzeichnungskomponenten P1, P2 bemerkbar. Die Stabilität kann verbessert werden, indem man Konturen aus mehreren Bildern verwendet. Zusätzliche Stabilität erhält man wie oben bereits erwähnt für DistortionCenter = 'fixed', DistortionCenter = 'adaptive' oder PrincipalPointVar > 0.
Konturen, die für die Kalibrierung zur Verfügung stehen.
Konturen, die zur Kalibrierung verwendet wurden
Breite der Bilder, aus denen die Konturen extrahiert wurden.
Defaultwert: 640
Wertevorschläge: 640, 768
Restriktion: Width > 0
Höhe der Bilder, aus denen die Konturen extrahiert wurden.
Defaultwert: 480
Wertevorschläge: 480, 576
Restriktion: Height > 0
Schwellwert zur Klassifizierung von Ausreißern.
Defaultwert: 0.05
Wertevorschläge: 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1
Restriktion: InlierThreshold >= 0
Initialisierungswert für den Zufallszahlengenerator.
Defaultwert: 42
Legt das Verzeichnungsmodell fest.
Defaultwert: 'division'
Werteliste: 'division', 'polynomial'
Legt fest, wie das Verzeichnungszentrum bestimmt wird.
Defaultwert: 'variable'
Werteliste: 'adaptive', 'fixed', 'variable'
Steuert die Abweichung des Verzeichnungszentrums von der Bildmitte; größere Werte erlauben größere Abweichungen; 0 schaltet den Strafterm ab.
Defaultwert: 0.0
Wertevorschläge: 0.0, 5.0, 10.0, 20.0, 50.0, 100.0
Restriktion: PrincipalPointVar >= 0.0 && PrincipalPointVar <= 100.0
Interne Kameraparameter.
Parameteranzahl: CameraParam == 8 || CameraParam == 12
* Assume that GrayImage is one image in gray values with a
* resolution of 640 x 480 and a suitable number of contours. Then
* the following example performs the calibration using these
* contours and corrects the image with the estimated distortion
* parameters.
edges_sub_pix (GrayImage, Edges, 'canny', 1.0, 20, 40)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 8, 4)
radial_distortion_self_calibration (ContoursSplit, SelectedContours, \
640, 480, 0.08, 42, 'division', \
'variable', 0, CameraParam)
get_domain (GrayImage, Domain)
change_radial_distortion_cam_par ('fullsize', CameraParam, 0, CamParamOut)
change_radial_distortion_image (GrayImage, Domain, ImageRectified, \
CameraParam, CamParamOut)
Sind die Parameterwerte korrekt, dann liefert radial_distortion_self_calibration den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
edges_sub_pix, segment_contours_xld
change_radial_distortion_cam_par, change_radial_distortion_image
T. Thormälen, H. Broszio: „Automatic line-based estimation of radial lens distortion“; in: Integrated Computer-Aided Engineering; vol. 12; pp. 177-190; 2005.
Calibration
| Operatoren |