g2o报错

关于ubuntu22.04运行slambook2/ch7 报错汇总

采用vscode编译

本人遇到的都汇总到这里了

首先通用报错的时候是这句

1.CMakeLists.txt

find_package( OpenCV 3 REQUIRED )改为find_package( OpenCV REQUIRED )

然后ubuntu 22.04默认是c++14的编译方式须修改

# set(CMAKE_CXX_FLAGS "-std=c++11 -O2 ${SSE_FLAGS} -msse4")
set(CMAKE_CXX_FLAGS "-std=c++14 -O2 ${SSE_FLAGS} -msse4")

2.CV_LOAD_IMAGE_COLOR 报红

 Mat img_1 = imread(argv[1], CV_LOAD_IMAGE_COLOR);

须在orb_cv.cpp ,pose_estimation_2d2d.cpp,pose_estimation_3d2d.cpp,pose_estimation_3d3d.cpp ,triangulation.cpp 的头文件添加

#include <opencv2/imgcodecs/legacy/constants_c.h>

3.就是使用高斯迭代快,博主给的代码不兼容g2o的新版本 g2o新版本和旧版本在智能指针上出现了不兼容的问题

pose_estimation_3d2d源代码为:该部分内容是在bundleAdjustment{}函数下

  // 构建图优化,先设定g2o
  // typedef g2o::BlockSolver<g2o::BlockSolverTraits<6, 3>> BlockSolverType;  // pose is 6, landmark is 3
  // typedef g2o::LinearSolverDense<BlockSolverType::PoseMatrixType> LinearSolverType; // 线性求解器类型
  // // 梯度下降方法,可以从GN, LM, DogLeg 中选
  // auto solver = new g2o::OptimizationAlgorithmGaussNewton(
  //   g2o::make_unique<BlockSolverType>(g2o::make_unique<LinearSolverType>()));
  // g2o::SparseOptimizer optimizer;     // 图模型
  // optimizer.setAlgorithm(solver);   // 设置求解器
  // optimizer.setVerbose(true);       // 打开调试输出

修改后的版本:注意试着编译运行 看看报红地方是否需要纠正

typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose 维度为 6, landmark 维度为 3

        //Block::LinearSolverType* linearSolver = new g2o::LinearSolverCSparse<Block::PoseMatrixType>(); // 线性方程求解器
        std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<Block::PoseMatrixType>());

        //Block* solver_ptr = new Block ( linearSolver );
        //std::unique_ptr<Block> solver_ptr ( new Block ( linearSolver));
        std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));     // 矩阵块求解器

        //g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg ( solver_ptr);
        g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton ( std::move(solver_ptr));
        g2o::SparseOptimizer optimizer;

        optimizer.setAlgorithm ( solver );

pose_estimation_3d3d源代码

  // typedef g2o::BlockSolverX BlockSolverType;
  // typedef g2o::LinearSolverDense<BlockSolverType::PoseMatrixType> LinearSolverType; // 线性求解器类型
  // // 梯度下降方法,可以从GN, LM, DogLeg 中选
  // auto solver = new g2o::OptimizationAlgorithmLevenberg(
  //   g2o::make_unique<BlockSolverType>(g2o::make_unique<LinearSolverType>()));
  // g2o::SparseOptimizer optimizer;     // 图模型
  // optimizer.setAlgorithm(solver);   // 设置求解器
  // optimizer.setVerbose(true);       // 打开调试输出

修改后:

   typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block;  // pose维度为 6, landmark 维度为 3

   // Block::LinearSolverType* linearSolver = new g2o::LinearSolverEigen<Block::PoseMatrixType>(); // 线性方程求解器
    std::unique_ptr<Block::LinearSolverType> linearSolver ( new g2o::LinearSolverDense<Block::PoseMatrixType>());

    //Block* solver_ptr = new Block( linearSolver );      // 矩阵块求解器
    std::unique_ptr<Block> solver_ptr ( new Block ( std::move(linearSolver)));

    //g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton( solver_ptr );
    g2o::OptimizationAlgorithmGaussNewton* solver = new g2o::OptimizationAlgorithmGaussNewton ( std::move(solver_ptr));

    g2o::SparseOptimizer optimizer;
    optimizer.setAlgorithm( solver );

3.编译问题

[ 75%] Building CXX object CMakeFiles/pose_estimation_3d2d.dir/pose_estimation_3d2d.cpp.o

ccf@ccf-virtual-machine:~/slambook2/ch7/pose_estimation_2d2d.cpp: In function ‘void pose_estimation_2d2d(std::vectorcv::KeyPoint, std::vectorcv::KeyPoint, std::vectorcv::DMatch, cv::Mat&, cv::Mat&)’:

/mnt/d/slam14/slambook2-master/ch7/pose_estimation_2d2d.cpp:144:61: error: ‘CV_FM_8POINT’ was not declared in this scope

 fundamental_matrix = findFundamentalMat(points1, points2, CV_FM_8POINT);

CV_FM_8POINT

将CV_去除即可

4.没有链接fmt

编译到最后的时候会出现一堆吗

解决方法:
修改CMakeList.txt中将带有target链接的后面都加上 fmt

举例  target_link_libraries(orb_cv ${OpenCV_LIBS} fmt)

成功解决!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值