Hi,
Currently I am developing a 3D reconstruction project. Which requires images to be distortion-free (rectilinear) and with known intrinsics.
The session I am developing on is a builtInDualWideCamera
, with isGeometricDistortionCorrectionEnabled
set to false
to be able to get the intrinsic matrix of the images, isVirtualDeviceConstituentPhotoDeliveryEnabled
set to true
and isAutoVirtualDeviceFusionEnabled
set to false
to get both images and isCameraCalibrationDataDeliveryEnabled
set to true
to actually get the calibration data.
The distortion correction parameters such as lensDistortionLookupTable
are used.
The 42 coefficients mapping array is used as described in the AVCameraCalibrationData header file. A simple piecewise linear interpolation.
There are two questions I would like to get support on:
- A way to set the calibration parameters in each image.
I have an approach that sets the parameters in the kCGImagePropertyExifDictionary
-> "UserComment"
. Is there a better approach to write calibration parameter data into the images? I feel like this is a bit dirty and there might be a better and neat approach.
- For the ultra-wide angle camera's images, the
lensDistortionLookupTable
contains several zeros at the end of the array.
For example (last 10 elements are zero): "LensDistortionLookupTable":"0.000000000000000,0.000349554029526,0.001385628827848,0.003071037586778,... ,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000,0.000000000000000"
The problem comes when the complete array is used to correct the image (including zeros), the end result is a wrapped-like-circle image close to the edges of it which is completely wrong.
In contrast, if the LensDistortionLookupTable
is used without the last zeros and the new size accommodated the image looks better (although not as rectilinear as if you take the image from the iPhone's camera app), but definitely less distorted.
Including zeros (full array):
Excluding zeros (array size changed):
- Am I missing an important point in the usage of the
lensDistortionLookupTable
where this case is addressed (zeros at the end)? - What is the criteria to shrink/exclude elements of the array?
Any advice is very much welcome.