首页 > 其他分享 >Ceres简单使用

Ceres简单使用

时间:2024-03-21 14:33:22浏览次数:25  
标签:ceres const 函数 double 简单 Ceres 使用 problem cost

用Ceres解决最小二乘问题步骤一般是这样

  1. 我们要先建立一个最小二乘问题;(代码中就是构建一个用Problem类构建一个problem对象)
  2. 接着我们需要建立代价函数costFunction。(如果是用AutoDiff自动求解,用法是这样的:AutoDiffCostFunction<仿函数类,残差的维度,剩下的一堆是优化变量的维度>);
    我们看到这里有一个“仿函数类”需要我们填。所以,这时我们需要在外面定义一个仿函数类:这个仿函数类主要是告诉Ceres怎么计算残差。
    注意:这里“剩下一堆是优化变量的维度”含义是,如果把目个变量写在一起变成向量的形式(成了一个变量),那就直接写向量的维度m;要是分开写的话就是m个1;
  3. 添加残差模块,用problem.AddResidualBlock(costFunc, 鲁邦核函数,优化变量们用指针传)
    (鲁棒核函数没有的话就是nullptr;引用也是指针)
  4. 设置求解器和输出报告
#include <iostream>
#include <ceres/ceres.h>
#include <opencv2/core/core.hpp>

/*这个工程优化 y=mx+c中的参数m和参数c*/

// 设计一个仿函数(函数对象)用于残差计算 cost function
class computeResidual
{
public:
    computeResidual(double x, double y) : _x(x), _y(y) {}

//    template <typename T>
//    bool operator()(const T *m, const T *c, T *residual) const
//    {
//        residual[0] = T(_y) - (m[0] * T(_x) + c[0]);
//        return true;
//    }

     template <typename T>
     bool operator()(const T *const paraMC, // 参数维度,2维
                     T *residual) const
     {
         residual[0] = T(_y) - (paraMC[0] * T(_x) + paraMC[1]);
         return true;
     }

    const double _x;
    const double _y;
};

int main(int argc, char **argv)
{
    // 参数
    double m = 0.0, c = 0.0;
    // 参数块
    double paraMC[2] = {m, c};

    cv::RNG rng;
    double sigma = 0.2;

    // 1、建立最小二乘问题
    ceres::Problem problem;
    for (int i = 0; i < 100; ++i)
    {
        // 按照m = 0.3, c = 0.1来对100个点进行赋值,并给予白噪声
        double y_with_noise = std::exp(0.3 * i / 100.0 + 0.1) + rng.gaussian(sigma * sigma);

        // 2、建立costFunction。如果是AutoDiff自动求解就如下 :
        // AutoDiffCostFunction<仿函数类,残差的维度,剩下的一堆是优化变量的维度>

//        ceres::CostFunction *cost_function =
//            new ceres::AutoDiffCostFunction<computeResidual, 1, 1, 1>(
//                new computeResidual(i / 100.0, y_with_noise));
//
//        // 3、添加残差模块,用problem.AddResidualBlock(costFunc, 鲁邦核函数,优化变量们用指针传)
//        problem.AddResidualBlock(cost_function, nullptr, &m, &c);

        /*********************************************************************************************/

         ceres::CostFunction *cost_function =
             new ceres::AutoDiffCostFunction<computeResidual, 1, 2>(
                 new computeResidual(i / 100.0, y_with_noise));

         problem.AddResidualBlock(cost_function, nullptr, paraMC);
    }

    // 4、设置求解器和输出报告
    ceres::Solver::Options options;               // 这其中有很多配置项可以填
    options.linear_solver_type = ceres::DENSE_QR; // 增量方程怎么求解
    options.minimizer_progress_to_stdout = true;  // 输出到cout
    options.max_num_iterations = 10;

    ceres::Solver::Summary summary;            // 优化信息
    ceres::Solve(options, &problem, &summary); // 开始优化

    std::cout << summary.BriefReport() << std::endl;

//    std::cout << "m=" << m << " "
//              << "c=" << c << std::endl;

    /*********************************************************************************************/

     std::cout << summary.BriefReport() << std::endl;
     std::cout << "m=" << paraMC[0] << "c=" << paraMC[1] << std::endl;

    return 0;
}

标签:ceres,const,函数,double,简单,Ceres,使用,problem,cost
From: https://www.cnblogs.com/qizhengxun/p/18087318

相关文章

  • 使用元类实现Django的ORM
    一、ORM基本介绍ORM是python编程语言后端web框架Django的核心思想,“ObjectRelationalMapping”,即对象-关系映射,简称ORM。二、实现目标创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句如图:三、......
  • Git22_在IDEA中使用Git5
    一、在IDEA中配置Git安装好IntelliJIDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。选择File→Settings打开设置窗口,找到VersionControl下的git选项:选择git的安装目录后可以点击“Test”按钮测试是......
  • linux centos使用rz、sz命令上传下载文件
    一般情况下,我们会使用终端软件,如XShell、SecureCRT或FinalShell、JumpServer堡垒机来连接远程服务器后,使用rz命令上传本地文件到远程服务器,再解压发版上线。一、安装使用安装rz和sz命令yum-yinstalllrzsz使用rz上传文件,会跳出文件选择窗口,选择好文件,点击确认即可r......
  • 微软的Garnet的安装学习以及与Redis的简单对比
    微软的Garnet的安装学习以及与Redis的简单对比安装方式官网上面其实没有写如何安装garnet的很多人见识用nuget的方式进行安装我这边简单尝试了下也没看出来怎么用exe没办法只能学习dockerfile里面的内容在windows上面进行编译.下载地址https://codeload.github.com......
  • 5、控制语句的使用
    fromflaskimportFlask,render_templateapp=Flask(__name__)#定义类用于参数传递classUser:"""对于参数age是后续加上去的,因为前期已经对于类进行过实例化了,所以在增加参数时,最好给上一个默认值.不然之前的写法都要重新修改."""def__i......
  • 使用appuploder流程笔记
     1.如何没有账号去apple官网注册一个,地址:https://developer.apple.com/account2.下载解压appuploder,双击打开,用刚刚注册的账号登录,下载地址:http://www.applicationloader.net/(使用第一次后,可以点击记住密码即可一键登录)注意:未支付apple的账号需要勾选“未付苹果688”  ......
  • 4、过滤器的使用及自定义过滤器
    fromflaskimportFlask,render_templatefromdatetimeimportdatetimeapp=Flask(__name__)#定义类用于参数传递classUser:"""对于参数age是后续加上去的,因为前期已经对于类进行过实例化了,所以在增加参数时,最好给上一个默认值.不然之前的写法都要......
  • Git安装与使用总结
    Git分布式版本控制工具一、Git安装与配置Git基本配置打开GitBash设置用户信息#配置全局用户名和用户邮箱gitconfig--globaluser.namexxxgitconfig--globaluser.emailxxx@xx.com查看用户信息#查看用户名和用户邮箱gitconfig--globaluser.namegi......
  • linux apache 使用记录
    1、安装集成phpyuminstallhttpdyuminstallphpsystemctlrestarthttpd2、开启url重写功能修改/etc/httpd/conf/httpd.conf:A开启重写模块:LoadModulerewrite_modulemodules/mod_rewrite.soIncludeconf.modules.d/*.confB修改参数 AllowOverrideAllC网站根目录添......
  • SD-如何使用
    用法安装软件后,导航到您的浏览器(我们建议使用Chrome、Edge或Firefox以防止出现问题)并导航到http://localhost:9000。项目可能需要几秒钟的时间才能准备好。加载后应该是这样的:提示您可以将多个Jobs.项目会将它们一一处理。您无需等到第一项工作完成。您可以通过每行输......