c++学习【13】3D-2D高斯牛顿BA迭代求解相机外参

这篇具有很好参考价值的文章主要介绍了c++学习【13】3D-2D高斯牛顿BA迭代求解相机外参。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

for (int iter = 0; iter < iterations; iter++) {
    Eigen::Matrix<double, 6, 6> H = Eigen::Matrix<double, 6, 6>::Zero();
    Vector6d b = Vector6d::Zero();

    cost = 0;
    // compute cost
    for (int i = 0; i < points_3d.size(); i++) {
      Eigen::Vector3d pc = pose * points_3d[i];
      double inv_z = 1.0 / pc[2];
      double inv_z2 = inv_z * inv_z;
      Eigen::Vector2d proj(fx * pc[0] / pc[2] + cx, fy * pc[1] / pc[2] + cy);

      Eigen::Vector2d e = points_2d[i] - proj;

      cost += e.squaredNorm();
      Eigen::Matrix<double, 2, 6> J;
      J << -fx * inv_z,
        0,
        fx * pc[0] * inv_z2,
        fx * pc[0] * pc[1] * inv_z2,
        -fx - fx * pc[0] * pc[0] * inv_z2,
        fx * pc[1] * inv_z,
        0,
        -fy * inv_z,
        fy * pc[1] * inv_z2,
        fy + fy * pc[1] * pc[1] * inv_z2,
        -fy * pc[0] * pc[1] * inv_z2,
        -fy * pc[0] * inv_z;

      H += J.transpose() * J;
      b += -J.transpose() * e;
    }

    Vector6d dx;
    dx = H.ldlt().solve(b);

    if (isnan(dx[0])) {
      cout << "result is nan!" << endl;
      break;
    }

    if (iter > 0 && cost >= lastCost) {
      // cost increase, update is not good
      cout << "cost: " << cost << ", last cost: " << lastCost << endl;
      break;
    }

    // update your estimation
    pose = Sophus::SE3d::exp(dx) * pose;
    lastCost = cost;

    cout << "iteration " << iter << " cost=" << std::setprecision(12) << cost << endl;
    if (dx.norm() < 1e-6) {
      // converge
      break;
    }
  }

  cout << "pose by g-n: \n" << pose.matrix() << endl;
    for (int i = 0; i < points_3d.size(); i++) {
      Eigen::Vector3d pc = pose * points_3d[i];
      double inv_z = 1.0 / pc[2];
      double inv_z2 = inv_z * inv_z;
      Eigen::Vector2d proj(fx * pc[0] / pc[2] + cx, fy * pc[1] / pc[2] + cy);

      Eigen::Vector2d e = points_2d[i] - proj;

      cost += e.squaredNorm();
      Eigen::Matrix<double, 2, 6> J;
      J << -fx * inv_z,
        0,
        fx * pc[0] * inv_z2,
        fx * pc[0] * pc[1] * inv_z2,
        -fx - fx * pc[0] * pc[0] * inv_z2,
        fx * pc[1] * inv_z,
        0,
        -fy * inv_z,
        fy * pc[1] * inv_z2,
        fy + fy * pc[1] * pc[1] * inv_z2,
        -fy * pc[0] * pc[1] * inv_z2,
        -fy * pc[0] * inv_z;

      H += J.transpose() * J;
      b += -J.transpose() * e;
    }

pc表示当前坐标,通过将points_3d[i]pose相乘,得到的结果pc是该点在相机坐标系下的表示。
proj是一个二维向量,表示在相机坐标系下,通过相机投影将三维点投影到二维平面上得到的坐标。

inv_z在绑定调整迭代求解相机位姿中,用于后续的优化目标函数计算或者高斯牛顿法求解过程中的中间计算。

      Eigen::Vector2d e = points_2d[i] - proj;
      cost += e.squaredNorm();

对于误差squaredNorm()是一个Eigen库的函数,用于计算向量的平方范数(二范数)的平方。在这种情况下,误差e是一个向量,通过调用squaredNorm()函数,会计算误差向量的平方范数的平方并将结果累加到cost中。
平方范数是指向量的各个元素值的平方和再开根号,而squaredNorm()则直接计算平方范数的平方,避免了开根号的计算,可以提高计算速度,并且结果与平方范数相同。
通过将误差的平方范数的平方累加到cost中,可以构建一个优化问题的目标函数,优化算法可以通过最小化目标函数来得到最优的解。

j的计算公式,bundleAdjustmentGaussNewton方法,计算雅可比矩阵Ji,

      J << -fx * inv_z,
        0,
        fx * pc[0] * inv_z2,
        fx * pc[0] * pc[1] * inv_z2,
        -fx - fx * pc[0] * pc[0] * inv_z2,
        fx * pc[1] * inv_z,
        0,
        -fy * inv_z,
        fy * pc[1] * inv_z2,
        fy + fy * pc[1] * pc[1] * inv_z2,
        -fy * pc[0] * pc[1] * inv_z2,
        -fy * pc[0] * inv_z;

H和b是什么? 通过雅可比矩阵Eigen::Matrix<double, 2, 6> J;

    Eigen::Matrix<double, 6, 6> H = Eigen::Matrix<double, 6, 6>::Zero();
    Vector6d b = Vector6d::Zero();
      H += J.transpose() * J;
      b += -J.transpose() * e;

对每一个点求完之后。dx用于存储线性系统Hx = b的解

    Vector6d dx;
    dx = H.ldlt().solve(b);

更新使用指数映射将位姿增量转换为相机位姿变换矩阵。这个变换矩阵表示相机从一个位姿移动到另一个位姿的变换。
新的位姿是通过将当前位姿与位姿增量相乘得到的。

pose = Sophus::SE3d::exp(dx) * pose;

相机位姿更新原理,与雅可比矩阵有什么关系?用于估计相机位姿以最小化重投影误差。重投影误差关于相机位姿的雅可比矩阵---是一个函数的偏导数矩阵。这个雅可比矩阵描述了相机位姿变化对重投影误差的影响。在每一次迭代中,通过计算雅可比矩阵,可以将相机位姿调整为使得重投影误差最小化的方向。
具体地,雅可比矩阵参与到高斯牛顿优化的迭代更新过程中,用于构建线性方程组的系数矩阵和右侧向量。求解这个线性方程组可以得到更新后的相机位姿。文章来源地址https://www.toymoban.com/news/detail-511769.html

到了这里,关于c++学习【13】3D-2D高斯牛顿BA迭代求解相机外参的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【视觉SLAM入门】5.2. 2D-3D PNP 3D-3D ICP BA非线性优化方法 数学方法SVD DLT

    前置事项: 该问题描述为:当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿 1.1.1 DLT(直接线性变换法) 解决的问题:已知空间点 P = ( X , Y , Z , 1 ) T P = (X, Y, Z, 1)^T P = ( X , Y , Z , 1 ) T 和它投影点 x 1 = ( u 1 , v 1 , 1 ) T x_1 = (u_1, v_1, 1)^T x 1 ​ = ( u 1 ​ , v 1

    2024年02月12日
    浏览(42)
  • C++模拟牛顿力学(2D)

    如何用计算机来模拟真实世界呢?计算机最大的功能是计算,而物理学的种种公式就把现实世界中的物理规律以数学的语言描绘了出来,从而使我们可以通过计算大致模拟现实世界的物体运动。因此不难想到把物理学定律(这里用的是牛顿力学)用计算机语言描述出来,模拟

    2024年02月08日
    浏览(26)
  • Matlab中求解线性方程组——高斯消元法、LU分解法、QR分解法、SVD分解法、迭代法等

    MATLAB迭代的三种方式以及相关案例举例 MATLAB矩阵的分解函数与案例举例 MATLAB当中线性方程组、不定方程组、奇异方程组、超定方程组的介绍 MATLAB语句实现方阵性质的验证 MATLAB绘图函数的相关介绍——海底测量、二维与三维图形绘制 MATLAB求函数极限的简单介绍 文章目录 前言

    2024年02月08日
    浏览(62)
  • 2d相机和3d相机的联合标定

    2D相机和3D相机的联合标定是通过以下步骤进行的: 1、收集标定数据: 首先,需要收集一组已知世界坐标和图像坐标的标定数据。这可以通过使用已知尺寸和位置的3D物体或平面棋盘格来收集 2、提取特征点: 在收集标定数据后,需要从图像中提取特征点。这些特征点应该是具有

    2024年02月16日
    浏览(45)
  • 计算机视觉与深度学习 | 非线性优化理论:图优化、高斯牛顿法和列文伯格-马夸尔特算法

    ===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 计算机视觉与深度学习 | SLAM国内外研究现状 计算机视觉与深度学习 | 视觉惯性SLAM的基础理论 计算机

    2024年02月08日
    浏览(48)
  • 机器视觉初步13:3D相机介绍

    在工业中,3D相机是一种非常重要的传感器,它通过测量目标的物理尺寸和形状来获取关于目标的数据。这种3D相机的工作原理主要基于机器视觉和计算机视觉技术。以下是一些常见的3D相机的工作原理: 这种3D相机使用特定类型的激光光源和摄像机,通常是红外光。激光在物

    2024年02月14日
    浏览(33)
  • 随手笔记——如何手写高斯牛顿法

    将演示如何手写高斯牛顿法 注: 该部分仅用于学习使用,如有侵权,请联系!

    2024年02月16日
    浏览(41)
  • MATLAB数值分析学习笔记:线性代数方程组的求解和高斯消元法

    工程和科学计算的许多基本方程都是建立在守恒定律的基础之上的,比如质量守恒等,在数学上,可以建立起形如 [A]{x}={b} 的平衡方程。其中{x}表示各个分量在平衡时的取值,它们表示系统的 状态 或 响应; 右端向量{b}由无关系统性态的常数组成通常表示为 外部激励。 矩阵

    2023年04月15日
    浏览(61)
  • MATLAB数值分析学习笔记:线性代数方程组的求解和高斯-赛德尔方法

    迭代法是前面介绍的消元法的有效替代,线性代数方程组常用的迭代法有 高斯-赛德尔方法 和 雅克比迭代法, 下面会讲到二者的不同之处,大家会发现两者的实现原理其实类似,只是方法不同,本篇只重点介绍高斯-赛德尔方法。 看了我之前的笔记的同学应该已经对迭代法不

    2024年02月05日
    浏览(58)
  • 【学习笔记】求解线性方程组的G-S迭代法

    matlab中调用上述函数结果显示: 哪里出问题了啊?

    2024年02月10日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包