关于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)
成功解决!
725





