07 手写 BA 优化

07 手写 BA 优化

原理见笔记 《后端 1》

世界坐标系 --> 相机坐标系(外参)--> 归一化坐标 --> 去畸变 --> 像素坐标系(内参)

由此得到的估计值与实际观测到的像素坐标作差,得到二维误差项。

7.1 误差及雅可比矩阵

7.2 Ceres BA 优化

注意残差块的维度:待优化变量分成两块,相机内外参和空间点坐标;残差为像素理论值与实际值之差,为2维。

c++ 复制代码
/*****
 * 计算重投影误差项
 * 定义误差项
*/

#ifndef SNAVELYREPROJECTIONERROR_H
#define SNAVELYREPROJECTIONERROR_H

#include <iostream>
#include <ceres/ceres.h>
#include "common/projection.h"
#include "common/tools/rotation.h"

// 误差项,仿函数
// observation_x, observation_y 实际值
class SnavelyReprojectionError
{
public:
    SnavelyReprojectionError(double observation_x, double observation_y) : observed_x(observation_x), observed_y(observation_y) {}

    template<typename T>

    // 待优化变量分为两块:camera 内外参 9 维; point 空间点 3 维
    // 残差为 2 维
    bool operator()(const T* const camera, const T* const point, T* residuals)
    {
        T predictions[2];
        CamProjectionWithDistortion(camera, point, predictions);         // 计算理论值
        residuals[0] = predictions[0] - observed_x;
        residuals[1] = predictions[1] - observed_y;

        return true;
    }


    static ceres::CostFunction* Create(const double observed_x, const double observed_y)
    {
        // 使用自动求导,模板参数:误差类型,输出维度2,输入维度 9 + 3
        return (new ceres::AutoDiffCostFunction<SnavelyReprojectionError, 2, 9, 3>(
            new SnavelyReprojectionError(observed_x, observed_y)));
    }

private:
    double observed_x;
    double observed_y;
};

#endif

7.3 g2o BA 优化

两个顶点,分别表示相机内外参(9维)、空间点(3维),边为二元边,连接两个顶点。

c++ 复制代码
// 相机顶点 9 维
class VertexCameraBAL : public g2o::BaseVertex<9, Eigen::VectorXd>
{
    
};

// 空间点 3 维
class VertexPointBAL : public g2o::BaseVertex<3, Eigen::Vector3d>
{
    
};

// 定义二元边
// 误差维度2, 误差类型Eigen::Vector2d, 连接两种顶点
class EdgeObservationBAL : public g2o::BaseBinaryEdge<2, Eigen::Vector2d, VertexCameraBAL, VertexPointBAL>
{

};
相关推荐
Codeking__11 分钟前
”一维前缀和“算法原理及模板
数据结构·算法
休息一下接着来12 分钟前
C++ 条件变量与线程通知机制:std::condition_variable
开发语言·c++·算法
Code哈哈笑25 分钟前
【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南
人工智能·算法·机器学习·回归·svm
努力学习的小廉36 分钟前
【C++】 —— 笔试刷题day_29
开发语言·c++·算法
小羊在奋斗37 分钟前
【LeetCode 热题 100】搜索插入位置 / 搜索旋转排序数组 / 寻找旋转排序数组中的最小值
算法·leetcode·职场和发展
meisongqing43 分钟前
【软件工程】符号执行与约束求解缺陷检测方法
人工智能·算法·软件工程·软件缺陷
莫叫石榴姐1 小时前
如何为大模型编写优雅且高效的提示词?
人工智能·算法
Echo``2 小时前
1:OpenCV—图像基础
c++·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
COOCC13 小时前
激活函数全解析:定义、分类与 17 种常用函数详解
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·自然语言处理
林下清风~3 小时前
力扣hot100——347.前K个高频元素(cpp手撕堆)
算法·leetcode·职场和发展