我有一组6个视频剪辑由6个摄像头拍摄的车辆顶部。我正在尝试使用CERES来捆绑调整这6个摄像头的O(1.4K)帧。假设6个摄像机中的每一个的内部参数都是恒定的,以非常好的近似值。因此,我正在尝试找出一种合理的方法,将这种物理约束合并到CERES的框架中。
作为一名CERES新手,我已经尝试过搜索以前的捆绑调整示例和问题。但令人惊讶的是,我还没有找到CERES-solver代码示例,其中相机内部函数由于对应于少量物理相机而受到约束。
从simple_bundle_adjuster.cc示例代码开始,我首先尝试在BALProblem类的double* parameters_成员中分离外部变量、内部变量和3D点变量。我希望有可能为视频帧构造单独的ResidualBlocks,它将具有不同的外部和3D点参数,但根据摄像机的物理ID共享内部参数。
下面是我对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)));
}...不幸的是,我还没有找到任何方法来共享6个物理摄像机的公共内部参数,这与CERES是一致的。
Q1:对于每个物理摄像机,CERES是否需要将所有外部参数和内部参数+ 3D点合并为一个大的残差块?考虑到在编译时通常不知道摄像机收集的帧数,这是可能的吗?
Q2:是否可以通过参数上限/下限近似强制每个物理摄像机的内部参数恒定?也许一些参数限制收紧的迭代方法可能会起作用。
发布于 2019-08-06 21:43:32
如果所有六个摄像机都有已知的常量内禀函数。那么就没有理由为它们设置参数块,只需创建一个CostFunction对象来存储和应用内部函数即可。
如果您希望它们是可变的,但具有较强的先验性,请添加一个参数块-六个摄像机中的每一个,然后将其用作计算残差的成本函数中的一个参数块。
如果所有六个摄像机都有相同的内部函数,那么同样的想法也适用,在这种情况下,只有一个参数块。
https://stackoverflow.com/questions/56925759
复制相似问题