radial_distortion_self_calibration — Calibrate the radial distortion.
radial_distortion_self_calibration estimates the distortion parameters and the distortion center of a lens from a set of XLD Contours.
The distortion parameters are returned in CameraParam. Because no other parameters are estimated - particularly not the focal length or the magnification - a telecentric camera model is returned with Magnification 1 and scale factor 1 for and . See calibrate_cameras for more information on the different camera models.
Based on the result of radial_distortion_self_calibration, you can remove lens distortions from images by passing the parameter CameraParam, which contains the distortion parameters, to the operators change_radial_distortion_cam_par and change_radial_distortion_image.
The estimation of the distortions is based on the assumption that a significant number of straight lines are visible in the image. Because of lens distortions, these lines will be projected to curved contours. The operator now determines suitable parameters by which the curved contours can be straightened again, thus compensating the lens distortions.
Extract input contours
To get suitable input contours Contours, you can, e.g., use edges_sub_pix or lines_gauss. The contours should be equally distributed and should lie near the image border because there the degree of distortion is at its maximum and therefore the calibration is most stable. To improve speed and robustness, you can try to to obtain long linear or circular segments, e.g., with segment_contours_xld, union_collinear_contours_xld, union_cocircular_contours_xld, or select_shape_xld. If a single image does not contain enough straight contours in the scene, you can use the contours of multiple images (concat_obj).
Set parameters for contour selection
The operator automatically estimates those contours from Contours that are images of straigt lines in the scene using the robust RANSAC method. The contours that do not fulfill this condition and hence are not suited for the calibration process are called outliers. The operator can cope with a maximum outlier percentage of 50 percent. A contour is classified as an outlier if the mean deviation of the contour from its associated straight line is, after the distortion correction, higher than a given threshold T.
With the parameter RandSeed, you can control the randomized behavior of the RANSAC algorithm and force it to return reproducible results. The parameter is passed as initial value to the internally used random number generator. If it is set to a positive value, the operator returns identical results for each call with identical parameter values.
radial_distortion_self_calibration returns the contours that were chosen for the calibration process in SelectedContours.
Select distortion model
The distortion model used in the calibration can be selected with the parameter DistortionModel. By choosing the division model (DistortionModel = 'division'), the distortions are modeled by the distortion parameter . By choosing the polynomial model (DistortionModel = 'polynomial'), the distortions are modeled by the radial distortion parameters and the decentering distortion parameters . See calibrate_cameras for details on the different camera models.
Set parameters for the distortion center estimation
The starting value for the estimation of the distortion center is the center of the image; the image size is defined by Width and Height.
The distortion parameters or , respectively, are estimated via the methods 'variable', 'adaptive', or 'fixed', which are specified via the parameter DistortionCenter:
In the default mode 'variable', the distortion center c is estimated with all the other calibration parameters at the same time. Here, many contours should lie equally distributed near the image borders or the distortion should be high. Otherwise, the search for the distortion center could be ill-posed, which results in instability.
With the method 'adaptive', the distortion center c is at first fixed in the image center. Then, the outliers are eliminated by using the InlierThreshold. Finally, the calibration process is rerun by estimating or , respectively, which will be accepted if results from a stable calibration and lies near the image center. Otherwise, c will be assumed to lie in the image center. This method should be used if the distortion center can be assumed to lie near the image center and if very few contours are available or the position of other contours is bad (e.g., the contours have the same direction or lie in the same image region).
By choosing the method 'fixed', the distortion center will be assumed fixed in the image center and only or , respectively, will be estimated. This method should be used in case of very weak distortions or few contours in bad position.
In order to control the deviation of c from the image center, the parameter PrincipalPointVar can be used in the methods 'adaptive' and 'variable'. If the deviation from the image center should be controlled, PrincipalPointVar must lie between 1 and 100. The higher the value, the more the distortion center can deviate from the image center. By choosing the value 0, the principal point is not controlled, i.e., the principal point is determined solely based on the contours. The parameter PrincipalPointVar should be used in cases of weak distortions or similarly oriented contours. Otherwise, a stable solution cannot be guaranteed.
The runtime of radial_distortion_self_calibration is shortest for DistortionCenter = 'variable' and PrincipalPointVar = 0. The runtime for DistortionCenter = 'variable' and PrincipalPointVar > 0 increases significantly for smaller values of PrincipalPointVar. The runtimes for DistortionCenter = 'adaptive' and DistortionCenter = 'fixed' are also significantly higher than for DistortionCenter = 'variable' and PrincipalPointVar = 0.
Since the polynomial model (DistortionModel = 'polynomial') uses more parameters than the division model (DistortionModel = 'division') the calibration using the polynomial model can be slightly less stable than the calibration using the division model, which becomes noticeable in the accuracy of the decentering distortion parameters . To improve the stability, contours of multiple images can be used. Additional stability can be achieved by setting DistortionCenter = 'fixed', DistortionCenter = 'adaptive', or PrincipalPointVar > 0, which was already mentioned above.
Contours that are available for the calibration.
Contours that were used for the calibration
Width of the images from which the contours were extracted.
Default value: 640
Suggested values: 640, 768
Restriction: Width > 0
Height of the images from which the contours were extracted.
Default value: 480
Suggested values: 480, 576
Restriction: Height > 0
Threshold for the classification of outliers.
Default value: 0.05
Suggested values: 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1
Restriction: InlierThreshold >= 0
Seed value for the random number generator.
Default value: 42
Determines the distortion model.
Default value: 'division'
List of values: 'division', 'polynomial'
Determines how the distortion center will be estimated.
Default value: 'variable'
List of values: 'adaptive', 'fixed', 'variable'
Controls the deviation of the distortion center from the image center; larger values allow larger deviations from the image center; 0 switches the penalty term off.
Default value: 0.0
Suggested values: 0.0, 5.0, 10.0, 20.0, 50.0, 100.0
Restriction: PrincipalPointVar >= 0.0 && PrincipalPointVar <= 100.0
Internal camera parameters.
* 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)
If the parameters are valid, the operator radial_distortion_self_calibration returns the value 2 (H_MSG_TRUE). If necessary an exception is raised.
T. Thormälen, H. Broszio: “Automatic line-based estimation of radial lens distortion”; in: Integrated Computer-Aided Engineering; vol. 12; pp. 177-190; 2005.