问题描述
在使用 Matlab 校准鱼眼相机时,我得到了鱼眼内在参数:
% Calibrate the camera using fisheye parameters
[cameraParams,imagesUsed,estimationErrors] = estimateFisheyeParameters(imagePoints,worldPoints,...
[mrows,ncols],...
'Estimatealignment',true,...
'WorldUnits','millimeters');
此函数的输出是 Scaramuzza 参数,其形状与经典的 3x3 内在矩阵非常不同。
根据这个内在参数,我想估计一个我的校准模式的姿势。到目前为止,我找到了两种解决方案,但我不知道哪个更准确。
首先,我发现我可以用当前的内在函数直接输入 extrinsics
函数:
% Extract intrinsics parameters
intrinsics = cameraParams.Intrinsics;
% Compute Rt matrix
[R,t] = extrinsics(imagePoints,intrinsics);
查看函数内部,我可以看到此方法使用了单应性,但是通过magic Scaramuzza 的内在参数进行了某种处理。它与用于鱼眼和非鱼眼模型的函数相同。知道这里处理 Scaramuzza 参数吗?
第二种解决方案是使用函数 estimateWorldCameraPose
,它使用 P3P
和下面的 RANSAC。此函数不接受原始鱼眼参数。我发现的一个解决方案 (https://fr.mathworks.com/matlabcentral/answers/548787-function-estimateworldcamerapose-or-extrinsics-for-fisheyeparameters-is-missing-is-it-possible?s_tid=answers_rc1-2_p2_MLT) 使用函数 undistortFisheyeImage
作为一种解决方法来提取 3x3 内在参数:
[J,camIntrinsics] = undistortFisheyeImage(I,intrinsics)
然后我可以在 estimateWorldCameraPose
中提供新的内在函数。
这个解决方案更好吗?这个新的内在矩阵有多现实?
解决方法
- 在所有校准方法(普通镜头或鱼眼镜头)中,外在估计都使用未失真的图像点。因此,matlab 函数“extrinsics”也应该具有不失真部分(使用 Scaramuzza 镜头失真模型的不失真)。 查看代码“外部”,我看到它在鱼眼模型时单独处理内部。
if ~isa(cameraParams,'fisheyeIntrinsics')
if isa(cameraParams,'cameraParameters')
intrinsicParams = cameraParams;
else
intrinsicParams = cameraParams.CameraParameters;
end
intrinsics = intrinsicParams.IntrinsicMatrix;
[rotationMatrix,translationVector] = vision.internal.calibration.extrinsicsPlanar(...
imagePoints,worldPoints,intrinsics);
else
- 这是唯一的解决方案,也是唯一的方法。