如何使用 opencv bundle调整



我已经计算了 5 个相机矩阵 ( c1, ... c5 ),相机矩阵是通过在 5 个不同位置放置一个 3D 对象来计算的,对于每个位置,我计算了相机矩阵(并且相机是恒定的)。相机矩阵使用SVD方法计算。

现在我想在opencv中使用束调整来获得一个最佳相机矩阵。我在这里找到了文档

但是文档不清楚,我也找不到任何示例代码。谁能解释一下如何使用 opencv 捆绑包调整来获得optimal camera matrix

我的回答假设您使用特定的3D对象(其尺寸是准确已知的)从对象的多个图像中估计一台相机的内在参数。根据您对@fireant回答的评论,我认为这适用于您的问题。

关于"相机矩阵"含义的快速说明

术语"相机矩阵"非常模糊,可以通过多种方式理解:

  • 相机姿势 T = [R|t],也表示外部相机参数。
  • 固有相机矩阵 K = [fx, s, cx; 0, fy, cy; 0, 0, 0, 1]。
  • 相机投影矩阵 P = K.[R|t]。

正如你所说,你有多个图像,但你想要一个相机矩阵,我认为你说的是固有的相机矩阵K。

为什么不应使用捆绑包调整

束调整是一种用于解决比相机校准更普遍的问题的技术,其中外部相机参数(.3D即方向和位置)和 3D 地标(例如.3D点)都是未知的。如@fireant所述,在这种全局联合优化中也可以包括固有的相机参数。另一方面,相机校准假设单个相机在多个图像中已知并观察到3D地标,因此它为每个图像优化一组固有相机参数和一个相机姿势。

要理解的是,更一般的优化问题涉及更多需要优化的变量,因此很难使它们受到良好约束。如果它们没有很好的约束,它们将以确实减少全局误差的方式优化您的变量,但这与您的实际问题的解决方案不符。这就是为什么在使用联合优化算法时,应始终尝试减少要优化的变量数量。

在"束调整"与"相机校准"的情况下,仅当您对 3D 地标的位置没有准确概念时,才应使用"束调整"。即便如此,尝试解耦问题可能是一个更好的主意,例如通过事先校准3D对象。如果您确实对 3D 地标的位置有准确的了解,则不应将它们视为要优化的变量,因此您应该使用相机校准技术。

优化的初始估计

您说您对相机矩阵 K 有多个不准确的估计值,并希望执行联合优化以获得单个更准确的估计值。问题在于,由于要估计单个相机矩阵,因此需要提供只有一个初始估计的联合优化算法。

为了仍然使用多个近似估计值,您可以做的是尝试选择最接近真实解决方案的估计值作为优化算法的初始估计值。为此,可以使用多个启发式条件。例如,您可以选择与最小重投影误差相关联的那个,或者您可以使用与校准对象最大的图像相关联的那个,等等。

但是,它可能不会对相机矩阵的最终估计产生太大影响。

如何使用"校准相机"来完成此任务

假设您有一个带有特征点的校准对象。它可以是标准的 2D 棋盘或不对称圆网格,也可以是任何经过校准的 3D 对象。假设您已经开发出一种在图像中检测此校准对象的方法(例如,自定义特征检测器或手动确定对象位置的工具)。然后,您可以定义一个向量allObjectPoints,其中包含对象上可以检测到的 3D 点。然后对于每个图像i,您可以确定检测到的 2D 点的矢量imagePoints_i,这些点是某些物体的 3D 点的观察值(请注意,某些物体点可能会被遮挡,因此项目可能比allObjectPoints中少)。然后,由于所有对象点都是可识别的(直接或通过推理),因此可以确定矢量objectPoints_i,其中包含在图像i中实际观察到的对象3D点,并与imagePoints_i一致地排序。

然后,将所有objectPoints_i向量堆叠在一个大的向量objectPoints中。同样,您将所有imagePoints_i向量堆叠在一个大的向量imagePoints中。然后,您可以使用CV_CALIB_USE_INTRINSIC_GUESS标志调用 calibrateCamera 来指示您希望优化算法使用您提供的初始值。

请参阅使用

OpenCV 学习图像处理的第 155 页的示例代码。像这样:

vector<CameraParams> cameras;
vector<MatchesInfo> pairwise_matches;
vector<ImageFeatures> features(num_images);
// initialize the above params here
Ptr<BundleAdjusterBase> adjuster;
adjuster = makePtr<BundleAdjusterReproj>();
if (!(*adjuster)(features, pairwise_matches, cameras)) {
    cout << "Camera parameters adjusting failed." << endl; 
    return -1;
}

如果您提供MCVE,那么更容易提供帮助。

编辑:假设您对相同的 K 矩阵有 5 个估计值。最简单的方法是简单地平均您的 5 个估计值以获得更准确的 K。在一些温和的假设下,这将是一个最佳估计。如果重新投影误差差异很大,则可以计算加权平均值。

相关内容

  • 没有找到相关文章

最新更新