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 eines Objektivs
basierend auf den in Contours
übergebenen XLD-Konturen.
Die Verzeichnungswerte werden in CameraParam
zurückgegeben.
Da keine weiteren Parameter geschätzt werden - insbesondere nicht die
Brennweite oder der Vergrößerungsmaßstab - wird ein telezentrisches
Kameramodell mit Vergrößerungsmaßstab 1 und Skalierungsfaktor 1 für
und zurückgegeben.
Siehe Kalibrierung für mehr Informationen zu den
verschiedenen Kameramodellen.
Anwendung
Mit dem Ergebnis von radial_distortion_self_calibration
kann
man die Objektivverzeichnungen in Bildern korrigieren. Hierzu muss man
den Parameter CameraParam
, der die Verzeichnungsparameter
enthält, an die Operatoren change_radial_distortion_cam_par
und change_radial_distortion_image
weiterreichen.
Grundprinzip
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 die Verzeichnung kompensieren.
Eingabekonturen extrahieren
Um geeignete Eingabekonturen Contours
zu erhalten, kann man
z.B. edges_sub_pix
oder lines_gauss
verwenden.
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 Sie versuchen,
z.B. mit
segment_contours_xld
, union_collinear_contours_xld
,
union_cocircular_contours_xld
oder
select_shape_xld
möglichst lange gerade oder
kreisförmige Segmente zu erhalten. Falls in einem einzelnen Bild nicht
ausreichend viele gerade Konturen in der Szene vorhanden sind,
können Sie auch die Konturen aus mehreren Bildern übergeben
(concat_obj
).
Parameter für die Konturauswahl setzen
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 Kalibrierprozess 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:
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.
radial_distortion_self_calibration
gibt die Konturen, die zur
Kalibrierung verwendet wurden in SelectedContours
die zurück.
Verzeichnungsmodell auswählen
Das zur Kalibrierung verwendete Verzeichnungsmodell kann über
DistortionModel
gewählt werden. Beim Divisionsmodell
(DistortionModel
= 'division' ) werden die Verzeichnungen
über den Verzeichnungsparameter beschrieben. Beim
polynomiellen Modell
(DistortionModel
= 'polynomial' ) werden
die Verzeichnungen über die radialen Verzeichnungsparameter
und die tangentialen
Verzeichnungsparameter
beschrieben.
Siehe Kalibrierung für mehr Informationen zu den
verschiedenen Kameramodellen.
Parameter zur Bestimmung des Verzeichnungszentrums einstellen
Als Startpunkt für die Bestimmung des Verzeichnungszentrums
wird die Bildmitte verwendet;
die Bildgröße wird über Width
und Height
definiert.
Zur Bestimmung der Verzeichnungsparameter
beziehungsweise stehen die Methoden 'variable' ,
'adaptive' und 'fixed' zur Verfügung, die über den Parameter
DistortionCenter
ausgewählt 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
beziehungsweise
durchgeführt, die dann angenommen wird,
falls 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 beziehungsweise 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.
Laufzeit
Die Laufzeit von
radial_distortion_self_calibration
ist 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 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.
Contours
(input_object) xld_cont-array →
object
Konturen, die für die Kalibrierung zur Verfügung stehen.
SelectedContours
(output_object) xld_cont-array →
object
Konturen, die zur Kalibrierung verwendet wurden
Width
(input_control) extent.x →
(integer)
Breite der Bilder, aus denen die Konturen extrahiert wurden.
Defaultwert: 640
Wertevorschläge: 640, 768
Restriktion: Width > 0
Height
(input_control) extent.y →
(integer)
Höhe der Bilder, aus denen die Konturen extrahiert wurden.
Defaultwert: 480
Wertevorschläge: 480, 576
Restriktion: Height > 0
InlierThreshold
(input_control) real →
(real)
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
RandSeed
(input_control) integer →
(integer)
Initialisierungswert für den Zufallszahlengenerator.
Defaultwert: 42
DistortionModel
(input_control) string →
(string)
Legt das Verzeichnungsmodell fest.
Defaultwert: 'division'
Werteliste: 'division' , 'polynomial'
DistortionCenter
(input_control) string →
(string)
Legt fest, wie das Verzeichnungszentrum bestimmt wird.
Defaultwert: 'variable'
Werteliste: 'adaptive' , 'fixed' , 'variable'
PrincipalPointVar
(input_control) real →
(real)
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
CameraParam
(output_control) campar →
(real / integer / string)
Interne Kameraparameter.
* 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