C++ 平行束调整(PBA)

C++ 平行束调整(PBA),c++,slam,reprojection-error,C++,Slam,Reprojection Error,我试图对同一台相机拍摄的一系列立体图像(class步骤)执行束调整(BA) 每个步骤都有左图像和右图像(校正和同步)、生成的深度图、左图像的关键点+描述符和2个4x4矩阵-1(局部(图像平面)到全局(3D世界)及其逆矩阵(分别为T_L2G和T_G2L) 这些步骤是相对于第一个图像登记的 我试图在结果上运行BA来优化转换,我试图使用PBA( 设置摄像头的代码: for (int i = 0; i < steps.size(); i++) { Step& step = step

我试图对同一台相机拍摄的一系列立体图像(class
步骤
)执行束调整(BA)

每个
步骤
都有左图像和右图像(校正和同步)、生成的深度图、左图像的关键点+描述符和2个4x4矩阵-1(局部(图像平面)到全局(3D世界)及其逆矩阵(分别为T_L2G和T_G2L)

这些步骤是相对于第一个图像登记的

我试图在结果上运行BA来优化转换,我试图使用PBA(

设置摄像头的代码:

for (int i = 0; i < steps.size(); i++)
{
    Step& step = steps[i];

    cv::Mat& T_G2L = step.T_G2L;

    cv::Mat R;
    cv::Mat t;

    T_G2L(cv::Rect(0, 0, 3, 3)).copyTo(R);
    T_G2L(cv::Rect(3, 0, 1, 3)).copyTo(t);
    CameraT camera;

    // Camera Parameters
    camera.SetFocalLength((double)m_focalLength); // Same camera, global focal length
    camera.SetTranslation((float*)t.data);
    camera.SetMatrixRotation((float*)R.data);

    if (i == 0)
    {
        camera.SetConstantCamera();
    }

    camera_data.push_back(camera);
}
然后,我面临的问题是,从PBA中提取数据:

for (int i = 1/*First camera is stationary*/; i < camera_data.size(); i++)
{
    Step& step = steps[i];

    CameraT& camera = camera_data[i];
    int type = CV_32F;
    cv::Mat t(3, 1, type);
    cv::Mat R(3, 3, type);
    cv::Mat T_L2G = cv::Mat::eye(4, 4, type);
    cv::Mat T_G2L = cv::Mat::eye(4, 4, type);

    camera.GetTranslation((float*)t.data);
    camera.GetMatrixRotation((float*)R.data);

    t.copyTo(T_G2L(TranslationRect));       
    R.copyTo(T_G2L(RotationRect));


    cv::invert(T_G2L, T_L2G);

    step.SetTransformation(T_L2G); // Step expects local 2 global transformation
}
for(int i=1/*第一个摄像头是静止的*/;i
一切都按我预期的方式运行。PBA报告相对较小的初始错误(目前使用少量成对注册的图像进行测试,因此错误不应该太大),运行后报告较小的错误。(收敛速度很快,通常少于3次迭代)

然而,当我使用新发现的变换转储关键点时,云似乎彼此移动得更远

(我也尝试过在T_G2L和T_L2G之间切换以“拉近他们”。不起作用)

我想知道我在使用它时是否遗漏了什么

云似乎彼此之间的距离越来越远

这似乎不是PBA的特定问题,而是捆绑调整的一般问题

执行束调整时,需要约束云,7个自由度至少有7个约束。否则,云将在3个轴、3个旋转和比例中漂移


在本地BA中,边界点是固定的。在完整BA中,通常有指定的点,如原点和一对额外的点,用于固定比例和方向。

您可以尝试查看一些开源软件,如g2o或okvisHi,您是否解决了这一问题?
ParallelBA pba(ParallelBA::PBA_CPU_FLOAT);
pba.SetFixedIntrinsics(true); // Same camera with known intrinsics

pba.SetCameraData(camera_data.size(), &camera_data[0]);                        //set camera parameters
pba.SetPointData(point_data.size(), &point_data[0]);                            //set 3D point data
pba.SetProjection(measurements.size(), &measurements[0], &ptidx[0], &camidx[0]);//set the projections

pba.SetNextBundleMode(ParallelBA::BUNDLE_ONLY_MOTION);

pba.RunBundleAdjustment();    //run bundle adjustment, and camera_data/point_data will be 
for (int i = 1/*First camera is stationary*/; i < camera_data.size(); i++)
{
    Step& step = steps[i];

    CameraT& camera = camera_data[i];
    int type = CV_32F;
    cv::Mat t(3, 1, type);
    cv::Mat R(3, 3, type);
    cv::Mat T_L2G = cv::Mat::eye(4, 4, type);
    cv::Mat T_G2L = cv::Mat::eye(4, 4, type);

    camera.GetTranslation((float*)t.data);
    camera.GetMatrixRotation((float*)R.data);

    t.copyTo(T_G2L(TranslationRect));       
    R.copyTo(T_G2L(RotationRect));


    cv::invert(T_G2L, T_L2G);

    step.SetTransformation(T_L2G); // Step expects local 2 global transformation
}