未知内参和外参内的OpenCV相机标定:组合算法DLT和SolvePNP

问题描述

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

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

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

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

解决方法

简短回答 - 否。

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

PnP 假设相机已校准,如果您的相机内在计算不准确,结果也会不准确。

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