Optimization ceres解算器中多摄像机束调整的约束内参数

Optimization ceres解算器中多摄像机束调整的约束内参数,optimization,computer-vision,ceres-solver,Optimization,Computer Vision,Ceres Solver,我有一套6个视频剪辑,由车上的6个摄像头拍摄。我正在尝试使用CERES来捆绑调整这6台摄像机的0(1.4K)帧。据推测,6台摄像机中每台摄像机的固有参数都是恒定的,非常接近。所以我试图找出一种合理的方法,将这种物理约束纳入CERES的框架中 作为一名CERES的新手,我尝试过搜索以前的捆绑调整示例和问题。但令人惊讶的是,我还没有找到CERES解算器代码示例,在这些示例中,由于相机内部函数与少量物理相机相对应,所以相机内部函数受到约束 从simple_bundle_adjulator.cc示例代码

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

作为一名CERES的新手,我尝试过搜索以前的捆绑调整示例和问题。但令人惊讶的是,我还没有找到CERES解算器代码示例,在这些示例中,由于相机内部函数与少量物理相机相对应,所以相机内部函数受到约束

从simple_bundle_adjulator.cc示例代码开始,我首先尝试在BALProblem类的double*parameters_uu成员中分离外部、内部和三维点变量。我希望能够为视频帧构建单独的剩余块,这些视频帧具有不同的外部和三维点参数,但根据摄像机的物理ID共享内部参数

下面是我在simple_bundle_adjulator.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)));
     }...
static ceres::CostFunction*创建(
int i,常数双观测值,常数双观测值(v)
{
如果(使用公共内部标志)
{ 
返回(新ceres::AutoDiffCostFunction<
针孔投射器,2,
n_外在参数,
n_物理摄像头*n_内部参数,3>(
新针孔投射器(i,观察到的,观察到的);
}...
不幸的是,我还没有找到任何方法来分享6台物理摄像机的共同内在参数,这与CERES是一致的

问题1:CERES是否需要将所有外部和内部参数+3D点组合成一个大的剩余块,用于每个物理摄像机?鉴于摄像机采集的帧数在编译时通常不知道,这是否可能


问题2:每个物理摄像机的固有参数是否可以通过上/下参数边界近似强制执行?也许可以采用一些迭代方法来收紧参数限制。

如果所有六个摄像机都具有恒定的固有参数。那么没有理由为它们设置参数块,只需创建一个存储和应用内部函数的函数对象

如果您希望它们是可变的,但使用强先验,请添加一个参数块-六个摄影机各一个,然后将其用作计算剩余误差的代价函数的参数块之一


如果所有六个摄像头都有相同的内部函数,那么同样的想法也适用,在这种情况下,只有一个参数块。

如果所有六个摄像头都有已知的常量内部函数。那么没有理由为它们设置参数块,只需创建一个存储和应用内部函数的CostFunction对象

如果您希望它们是可变的,但使用强先验,请添加一个参数块-六个摄影机各一个,然后将其用作计算剩余误差的代价函数的参数块之一

同样的想法也适用于所有六个摄像头都具有相同的内部结构,在这种情况下,只有一个参数块