1

我正在尝试估计未校准图像的绝对相机位置,即在单个图像上。我有 2 组关键点:在 3d 模型(对象坐标)和 2d 图像(uv 坐标)上。让我们假设关键点是准确的。然后我执行以下步骤:

  • 我应用标准直接线性变换 (DLT) 来估计投影矩阵 P - 从 3d“世界”到 2d 图像变换 x = P*X;
  • OpenCV DecomposeProjectionMatrix() 函数有助于将投影矩阵分解为外在矩阵和内在矩阵:P = K {R|t};
  • 为了改进我对旋转和平移矩阵的第一次猜测,我将 SolvePnP(使用迭代方法,据我所知它为我提供了“最佳”解决方案)函数应用于关键点集和相机参数;

在几种情况下运行我的组合算法时,我注意到在大多数情况下 SolvePnP 返回非常接近基本事实的结果。其余结果不准确,旋转和平移与实际相差甚远。

问:是否可以针对我当前算法失败的这些情况进行改进:可能是基于 OpenCV CameraCalibrate() 优化内在参数,或应用其他 SolvePnP 算法?

4

1 回答 1

1

简短的回答 - 不。

长答案:DLT 结果在统计上不是最优的。此外,如果控制点大致位于一个平面上,则 DLT 算法的结果是不稳定的。有关详细信息,请参阅此幻灯片。在这种情况下,内在函数和外在函数可能不准确,甚至完全错误。

PnP 假定已校准相机,如果您的相机内在函数计算不准确,则结果也将不准确。

CameraCalibrate(),如果您有一组具有不同相机位置且具有已知 2D-3D 坐标的图像,可能会有所帮助。

于 2021-07-21T13:03:46.227 回答