鱼眼外在与估计WorldCameraPose

问题描述

在使用 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 中提供新的内在函数

这个解决方案更好吗?这个新的内在矩阵有多现实?

解决方法

  1. 在所有校准方法(普通镜头或鱼眼镜头)中,外在估计都使用未失真的图像点。因此,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
  1. 这是唯一的解决方案,也是唯一的方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...