1

我有一组 6 个视频剪辑,由车顶的 6 个摄像头拍摄。我正在尝试使用 CERES 来捆绑调整这 6 台摄像机的 O(1.4K) 帧。据推测,这 6 个摄像机中的每一个的内在参数都是恒定的,非常接近。因此,我试图找出一种合理的方式将这种物理约束纳入 CERES 的框架中。

作为 CERES 新手,我尝试搜索以前的捆绑调整示例和问题。但令人惊讶的是,我还没有找到 CERES 求解器代码示例,其中相机内在函数由于对应于少量物理相机而受到限制。

从 simple_bundle_adjuster.cc 示例代码开始,我首先尝试在 BALProblem 类的 double* parameters_ 成员中分离外部、内部和 3D 点变量。我希望可以为具有不同外部和 3D 点参数但根据摄像机的物理 ID 共享内部参数的视频帧构建单独的 ResidualBlocks。

这是我对 simple_bundle_adjuster.cc 示例中的 Create() 方法稍作修改的版本:

  static ceres::CostFunction* Create(
    int i, const double observed_u, const double observed_v)
  {
     if (use_common_intrinsics_flag)
     { 
        return (new ceres::AutoDiffCostFunction<
                PinholeReprojectionError, 2,
                n_extrinsic_params, 
                n_physical_cameras * n_intrinsic_params, 3>(
                new PinholeReprojectionError(i, observed_u, observed_v)));
     }...

不幸的是,我无法找到任何方法来分享与 CERES 一致的 6 个物理摄像机的共同内在参数。

Q1:CERES 是否需要将所有外在参数和内在参数 + 3D 点组合到每个物理摄像机的一个大残差块中?鉴于在编译时通常不知道摄像机收集的帧数,这是否可能?

Q2:每个物理摄像机的内在参数的恒定性是否可以通过上/下参数界限来近似强制执行?也许一些收紧参数限制的迭代方法可能会奏效。

4

1 回答 1

0

如果所有六个相机都知道恒定的内在函数。然后没有理由为它们设置参数块,只需创建一个存储和应用内在函数的 CostFunction 对象。

如果您想让它们可变但具有强先验,请添加一个参数块 - 六个摄像机中的每一个一个,然后将其用作计算残差的成本函数的参数块之一。

如果所有六个相机都具有相同的内在函数,则同样的想法适用,在这种情况下,只有一个参数块。

于 2019-08-06T13:43:32.140 回答