目录
1 资源
slambook2、g2o-20230223_git、google-glog 0.6.0、Ceres 2.1.0、DBow3
2 配置
3 运行
ch2、ch3、ch4、ch5imageBasics与slambook基本一致,详情可以看我这篇文章:
持续更新 SLAM学习笔记 | 全过程含资源 | Linux环境
在slambook2中,CMakeList.txt在章节文件夹中,按章节编译运行。
3.1 ch5
1)修改CMakeList.txt中c++的标准支持的c++11 -02为c++14 -03,并添加fmt库。由于笔者的Eigen是通过cmake编译安装的,所以安装在/usr/lcoal/include中,如果通过apt安装,则无需修改:
// slambook2/ch5/CMakeList.txt
set(CMAKE_CXX_FLAGS "-std=c++14 -O3")
// include_directories("/usr/include/eigen3")
include_directories("/usr/local/include/eigen3")
include_directories("/usr/local/include/fmt")
在ch5/rgbd/CMakeList.txt中添加对fmt的链接:
// target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES} )
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES} fmt)
2)编译imageBasics、rgbd、stereo:
cd ~/pkgs/slambook2/ch5
mkdir build && cd build
cmake ..
make -j2
编译完成好,在build文件夹中就能看到对应的三个文件夹:
ls ~/pkgs/slambook2/ch5/build/

3)首先运行rgbd,我们编译好的joinMap可执行文件在ch5/build/rgbd下,我们需要将其拷贝到ch5/rgbd文件夹下才可以运行:

# 复制joinMap到有pose.txt、文件夹color、文件夹depth的目录
cd ~/pkgs/slambook2/ch5/build/rgbd/
cp joinMap ../../rgbd
# 运行
./joinMap pose.txt
运行结果:鼠标左键平移,右键旋转

4)接着运行stereo,同样将ch5/build/stereo的可执行文件stereoVision拷贝到ch5/stereo目录下:
# 复制stereoVision到有left.png、right.png的目录
cd ~/pkgs/slambook2/ch5/build/stereo/
cp stereoVision ../../stereo
# 运行
./stereoVision
运行结果:鼠标左键平移,右键旋转


3.2 ch6
1)修改CMakeList.txt中Eigen库的位置及c++标准支持:
// include_directories("/usr/include/eigen3")
include_directories("/usr/local/include/eigen3")
// set(CMAKE_CXX_FLAGS "-std=c++14 -O3")
set(CMAKE_CXX_FLAGS "-std=c++17")
2)编译
cd ~/pkgs/slambook2/ch6
mkdir build && cd build
cmake ..
make -j2
报错:没有找到Ceres

安装Ceres
再次编译,依旧报错‘make_unique’ is not a member of ‘g2o’:

这类问题通常是g2o的版本导致的
3)重新下载g2o_20230223_git,具体的安装过程参考(安装g2o)。安装完后再次编译,ceresCurveFitting.cpp和gaussNewton.cpp编译通过,g2oCurveFitting.cpp依旧有大量错误,看错误的代码,应该是glog的问题。
4)无奈重新安装google-glog 0.6.0,安装完成后再次编译,结果又提示找不到Ceres。。。。。。再次安装Ceres ,这一次下载Ceres 2.1.0的版本。经过漫长的编译和安装后,再次make -j2终于成功!!!

g2o、glog、Ceres之间存在相互依赖关系,总结还是版本的问题:
g2o_20230223_git=>google-glog 0.6.0=>Ceres 2.1.0
5)最后./g2oCurveFitting 、./gaussNewton 查看运行结果:


3.3 ch7
问题1 OpenCV版本问题
解决方法:在CMakeLists.txt中将find_package( OpenCV3.0 REQUIRED )中的3.0改为对应版本。笔者下载的是4.6.0吗,所以这里改成4
#find_package(OpenCV 3 REQUIRED)
find_package(OpenCV 4 REQUIRED)
问题2 error: ‘CV_LOAD_IMAGE_COLOR’ was not declared in this scope
解决方法:在ch7文件夹中每一个.cpp文件中都引入头文件:
#include "opencv2/imgcodecs/legacy/constants_c.h"
或直接替换报错代码:
CV_LOAD_IMAGE_UNCHANGED = -1 ( = cv::IMREAD_UNCHANGED),
CV_LOAD_IMAGE_GRAYSCALE = 0 ( = cv::IMREAD_GRAYSCALE),
CV_LOAD_IMAGE_COLOR = 1 ( = cv::IMREAD_COLOR),
CV_LOAD_IMAGE_ANYDEPTH = 2 ( = cv::IMREAD_ANYDEPTH),
问题3 error: ‘index_sequence’ is not a member of ‘std’
解决方法:在CMakeList.txt中将set(CMAKE_CXX_FLAGS "-std=c++11 -O2 ${SSE_FLAGS} -msse4")替换如下:
set(CMAKE_CXX_FLAGS "-std=c++14 -O2 ${SSE_FLAGS} -msse4")
问题4 CV_FM_8P0INT was not declared
解决方法:将CV_FM_8P0INT改为:
cv::FM_8P0INT
问题5 undefined reference to fmt::v10::vprint(fmt::v10::basic_string_view<char>, fmt::v10::basic_format_args<fmt::v10::context>
解决方法:在CMakeList.txt的include_directories添加fmt的头文件路径,并在target_link_libraries中链接:
include_directories(
${OpenCV_INCLUDE_DIRS}
${G2O_INCLUDE_DIRS}
${Sophus_INCLUDE_DIRS}
"/usr/include/eigen3/"
"/usr/local/include/fmt")
target_link_libraries(pose_estimation_2d2d ${OpenCV_LIBS} fmt)
target_link_libraries(pose_estimation_3d2d
g2o_core g2o_stuff
${OpenCV_LIBS} fmt)
add_executable(pose_estimation_3d3d pose_estimation_3d3d.cpp)
target_link_libraries(pose_estimation_3d3d
g2o_core g2o_stuff
${OpenCV_LIBS} fmt)
1)笔者在第七章遇到的所有问题都记录如上,希望对大家有帮助。修改完成后编译:
cd ~/pkgs/slambook2/ch7/
mkdir build && cd build
cmake ..
make -j2
编译成功,并产生可执行文件:

2)运行orb_cv,在build文件夹下执行:
./orb_cv ../1.png ../2.png
运行结果:


3)运行orb_self,由于orb_self要同1.png和2.png在同一目录下,故在build文件夹下执行:
cp orb_self ../
cd ..
./orb_self
运行结果:

4)运行pose_estimation_2d3d,在build文件夹下执行:
./pose_estimation_2d2d ../1.png ../2.png
5)运行pose_estimation_3d2d,在build文件夹下执行:
./pose_estimation_3d2d ../1.png ../2.png ../1_depth.png ../2_depth.png
6)运行pose_estimation_3d3d,在build文件夹下执行:
./pose_estimation_3d3d ../1.png ../2.png ../1_depth.png ../2_depth.png
7)运行triangulation,在build文件夹下执行:
./triangulation ../1.png ../2.png
运行结果:

3.4 ch8
问题1 identifier "CV_GRAY2BGR" is undefined
出现位置:optical_flow.cpp中第146行cv::cvtColor(img2, img2_single, CV_GRAY2BGR);和direct_method.cpp中第208行cv::cvtColor(img2, img2_show, CV_GRAY2BGR);
解决方法:在optical_flow.cpp和direct_method.cpp中引入头文件
#include <opencv2/imgproc/types_c.h>
问题2 ‘enable_if_t’ in namespace ‘std’ does not name a template type
出现类似std的报错基本上是c++标准的问题
解决方法:修改CMakeList.txt中c++11为c++14:
set(CMAKE_CXX_FLAGS "-std=c++14 ${SSE_FLAGS} -g -O3 -march=native")
问题3 undefined reference to fmt::v10::vprint(fmt::v10::basic_string_view<char>, fmt::v10::basic_format_args<fmt::v10::context>
出现fmt::v10的保存,基本解决方法都是一样的
解决方法:在CMakeList.txt的include_directories添加fmt的头文件路径,并在target_link_libraries中链接:
include_directories(
${OpenCV_INCLUDE_DIRS}
${G2O_INCLUDE_DIRS}
${Sophus_INCLUDE_DIRS}
"/usr/include/eigen3/"
${Pangolin_INCLUDE_DIRS}
"/usr/local/include/fmt"
)
target_link_libraries(optical_flow ${OpenCV_LIBS} fmt)
target_link_libraries(direct_method ${OpenCV_LIBS} ${Pangolin_LIBRARIES} fmt)
1)笔者在第八遇到的所有问题都记录如上,希望对大家有帮助。修改完成后编译:
cd ~/pkgs/slambook2/ch8/
mkdir build && cd build
cmake ..
make -j2
编译成功,并产生可执行文件:

2)运行direct_method,由于direct_method要同.png文件在同一目录下,故在build文件夹下执行:
cp direct_method ../
cd ..
./direct_method
运行结果(若干张,仅展示其中一张):

3)运行optical_flow,由于optical_flow要同.png文件在同一目录下,故在build文件夹下执行:
cp optical_flow ../
cd ..
./optical_flow
运行结果:

3.5 ch9
问题1 undefined reference to g2o::csparse::CSparse::
解决方法:参考文章
替换CMakeList.txt中的所有内容:
cmake_minimum_required(VERSION 2.8)
project(bundle_adjustment)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3 -std=c++14")
set( CMAKE_CXX_STANDARD 14)
if (POLICY CMP0072)
set(OpenGL_GL_PREFERENCE LEGACY)
endif()
Find_Package(g2o REQUIRED)
Find_Package(Ceres REQUIRED)
Find_Package(Sophus REQUIRED)
Find_Package(fmt REQUIRED)
# SET(G2O_LIBS g2o_csparse_extension g2o_stuff g2o_core cxsparse)
SET(G2O_LIBS g2o::g2o_ceres_ad g2o::stuff g2o::opengl_helper g2o::core
g2o::g2o_hierarchical_library g2o::g2o_simulator_library
g2o::types_slam2d g2o::types_slam2d_addons
g2o::solver_pcg g2o::solver_dense g2o::solver_slam2d_linear
g2o::solver_structure_only g2o::solver_csparse g2o::csparse_extension g2o::solver_cholmod g2o::solver_eigen
# g2o::csparse_extension g2o::stuff g2o::core
cxsparse)
# Eigen
include_directories("/usr/include/eigen3")
include_directories("/usr/include/suitesparse/")
add_library(bal_common common.cpp)
add_executable(bundle_adjustment_g2o bundle_adjustment_g2o.cpp)
add_executable(bundle_adjustment_ceres bundle_adjustment_ceres.cpp)
target_link_libraries(bundle_adjustment_ceres Ceres::ceres fmt::fmt bal_common)
target_link_libraries(bundle_adjustment_g2o ${G2O_LIBS} fmt::fmt bal_common)
问题2 ./bundle_adjustment_g2o: error while loading shared libraries: libg2o_csparse_extension.so: cannot open shared object file: No such file or directory
解决方法:打开ld.so.conf:
sudo gedit /etc/ld.so.conf
添加语句并保存:
/usr/local/lib
更新:
sudo ldconfig
1)修改完成后编译:
cd ~/pkgs/slambook2/ch9/
mkdir build && cd build
cmake ..
make -j4
编译成功,并产生可执行文件:

2)运行bundle_adjustment_ceres:
cp bundle_adjustment_ceres ../
./bundle_adjustment_ceres problem-16-22106-pre.txt
报错:./bundle_adjustment_ceres: /home/zyr/miniconda3/lib/libstdc++.so.6: version GLIBCXX_3.4.30 not found (required by ./bundle_adjustment_ceres)
解决方法:重新创建软链接即可,注意自己libstdc++.so.6的路径
#ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /home/zyr/miniconda3/lib/libstdc++.so.6
ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 <Your libstdc++.so.6 Path>
再次运行bundle_adjustment_ceres成功,终端输出结果,生成final.ply和initial.ply文件。
3)运行bundle_adjustment_g2o:
cp bundle_adjustment_g2o ../
./bundle_adjustment_g2o problem-16-22106-pre.txt
终端输出结果,生成final.ply和initial.ply文件。
3.6 ch10
这章编译比较顺利,修改CMakeList.txt中c++标准以及链接fmt即可,完整CMakeList.txt如下
cmake_minimum_required(VERSION 2.8)
project(pose_graph)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++14 -O2")
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
# Eigen
include_directories("/usr/include/eigen3")
include_directories("/usr/local/include/fmt")
# sophus
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
# g2o
find_package(G2O REQUIRED)
include_directories(${G2O_INCLUDE_DIRS})
add_executable(pose_graph_g2o_SE3 pose_graph_g2o_SE3.cpp)
target_link_libraries(pose_graph_g2o_SE3
g2o_core g2o_stuff g2o_types_slam3d ${CHOLMOD_LIBRARIES}
fmt)
add_executable(pose_graph_g2o_lie pose_graph_g2o_lie_algebra.cpp)
target_link_libraries(pose_graph_g2o_lie
g2o_core g2o_stuff
${CHOLMOD_LIBRARIES}
${Sophus_LIBRARIES}
fmt)
1)修改完后编译:
cd ~/pkgs/slambook2/ch10/
mkdir build && cd build
cmake ..
make -j4
编译成功,并产生可执行文件:

2)运行pose_graph_g2o_lie:
cp pose_graph_g2o_lie ../
cd ..
./pose_graph_g2o_lie sphere.g2o
报错:Sophus ensure failed in function 'void Sophus::SO3Base<Derived>::normalize() [with Derived = Sophus::SO3<double>]', file '/usr/local/include/sophus/so3.hpp', line 320.
顶点类VertexSE3LieAlgebra的读入函数virtual bool read(istream& is)缺少返回值,会报以上错误。
解决方法:在pose_graph_g2o_lie_algebra.cpp代码的VertexSE3LieAlgebra函数最后(第55行)加上return true;,再次编译即可解决。
class VertexSE3LieAlgebra : public g2o::BaseVertex<6, SE3d> {
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
virtual bool read(istream &is) override {
double data[7];
for (int i = 0; i < 7; i++)
is >> data[i];
setEstimate(SE3d(
Quaterniond(data[6], data[3], data[4], data[5]),
Vector3d(data[0], data[1], data[2])
));
return true; //添加
}
再次编译成功,执行cp pose_graph_g2o_lie ../,然后./pose_graph_g2o_lie sphere.g2o,终端输出结果,生成result_lie.g2o,使用g2o_viewer查看结果:
g2o_viewer result_lie.g2o

3)运行pose_graph_g2o_SE3:
cp pose_graph_g2o_SE3 ../
cd ..
./pose_graph_g2o_SE3 sphere.g2o
终端输出结果,生成result.g2o,使用g2o_viewer查看结果:
g2o_viewer result.g2o

3.7 ch11
问题1 首先安装DBoW3,make时出现如下错误:
error: ‘ostream’ in namespace ‘std’ does not name a type;
error: ‘string’ in namespace ‘std’ does not name a type
error: ‘size_t’ has not been declared
error: ‘uint64_t’ does not name a type error: ‘std::ostream’ has not been declared
error: ‘std::istream’ has not been declared
error: ‘ostream’ in namespace ‘std’ does not name a type
解决方法:
在/DBow3-master/src/BowVector.h中引入头文件:
#include <ostream>
#include <string>
#include <cstdint>
BowVector.h头文件引入完整代码:
#ifndef __D_T_BOW_VECTOR__
#define __D_T_BOW_VECTOR__
#include <map>
#include <vector>
#include "exports.h"
#include <ostream> //添加
#include <string> //添加
#include <cstdint> //添加
// #if _WIN32
// #include <cstdint>
// #endif
在/DBow3-master/src/FeatureVector.h中引入头文:
#include <ostream>
修改完后,执行编译安装:
mkdir build && cd build
cmake ..
make -j4
sudo make install
问题2 Could not find a configuration file for package "OpenCV" that is compatible with requested version "3.1".
由OpenCV版本不匹配导致
解决方法:修改CMakeList.txt中OpenCV版本要求为自己安装的版本即可
# find_package( OpenCV 3.1 REQUIRED )
find_package( OpenCV 4 REQUIRED )
问题3
No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'loop_closure'.
No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'feature_training'.
No rule to make target '/usr/local/lib/libDBoW3.a', needed by 'gen_vocab'.
解决方法:在CMakeList.txt中添加对DBoW3的动态链接
set(DBoW3_LIBS "/usr/local/lib/libDBoW3.so")
1)修改完后编译:
cd ~/pkgs/slambook2/ch11/
mkdir build && cd build
cmake ..
make -j4
编译成功,并产生可执行文件:

将三个可执行文件复制到ch11目录下:
cp feature_training ../
cp gen_vocab ../
cp loop_closure ../
2)运行feature_training:
./feature_training
运行后生成vocabulary.yml.gz文件
3)运行loop_closure:
./loop_closure
终端输出图像两两间的相似度评分
4)运行gen_vocab,报错:
terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid
这是由于传入空指针导致的
解决方法:修改代码,完整gen_vocab_large.cpp如下:
#include "DBoW3/DBoW3.h"//词袋支持头文件
#include <opencv2/core/core.hpp>//opencv核心模块
#include <opencv2/highgui/highgui.hpp>//gui模块
#include <opencv2/features2d/features2d.hpp>//特征点头文件
#include <iostream>
#include <vector>
#include <string>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
String directoryPath = "/home/zyr/pkgs/slambook2/ch11/data";//图像路径
vector<String> imagesPath;
glob(directoryPath, imagesPath);
cout<<"generating features ... "<<endl;//输出generating features (正在检测ORB特征)...
vector<Mat> descriptors;//描述子
Ptr< Feature2D > detector = ORB::create();
int index = 1;
for ( String path : imagesPath )
{
Mat image = imread(path);
vector<KeyPoint> keypoints; //关键点
Mat descriptor;//描述子
detector->detectAndCompute( image, Mat(), keypoints, descriptor );
descriptors.push_back( descriptor );
cout<<"extracting features from image " << index++ <<endl;//输出extracting features from image(从图像中提取特征)
}
cout<<"extract total "<<descriptors.size()*500<<" features."<<endl;
// create vocabulary
cout<<"creating vocabulary, please wait ... "<<endl;//输出creating vocabulary, please wait (创建词典,请稍等)...
DBoW3::Vocabulary vocab;
vocab.create( descriptors );
cout<<"vocabulary info: "<<vocab<<endl;
vocab.save( "vocab_larger.yml.gz" );//保存词典
cout<<"done"<<endl;
return 0;
}
再次编译后运行成功,生成vocab_larger.yml.gz文件
3.8 ch12
问题1 error: ‘CV_GRAY2BGR’ was not declared in this scope
在OpenCV4中,CV_GRAY2BGR已被cv::COLOR_GRAY2BGR替换
解决方法:修改ch12/dense_mono/dense_mapping.cpp中所有的CV_GRAY2BGR为
cv::COLOR_GRAY2BGR
问题2 error: ‘class pcl::MovingLeastSquares<pcl::PointXYZRGB, pcl::PointXYZRGBNormal>’ has no member named ‘setPolynomialFit’; did you mean ‘setPolynomialOrder’?
解决方法:修改ch12/dense_RGBD/surfel_mapping.cpp中(第31行)的setPolynomialFit()为setPolynomialOrder()
SurfelCloudPtr reconstructSurface(
const PointCloudPtr &input, float radius, int polynomial_order) {
pcl::MovingLeastSquares<PointT, SurfelT> mls;
pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
mls.setSearchMethod(tree);
mls.setSearchRadius(radius);
mls.setComputeNormals(true);
mls.setSqrGaussParam(radius * radius);
// mls.setPolynomialFit(polynomial_order > 1); //修改为setPolynomialOrder
mls.setPolynomialOrder(polynomial_order > 1);
mls.setPolynomialOrder(polynomial_order);
mls.setInputCloud(input);
SurfelCloudPtr output(new SurfelCloud);
mls.process(*output);
return (output);
}
问题3 undefined reference to fmt::v10::vprint(fmt::v10::basic_string_view<char>, fmt::v10::basic_format_args<fmt::v10::context>
出现fmt::v10的保存,基本解决方法都是一样的
解决方法:在CMakeList.txt的target_link_libraries中链接fmt即可
完整dense_RGBD/CMakeList.txt代码:
cmake_minimum_required(VERSION 2.8)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "-std=c++14 -O2")
# opencv
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# eigen
include_directories("/usr/include/eigen3/")
# fmt
include_directories(${FMT_INCLUDE_DIRS})
find_package(FMT REQUIRED)
# pcl
find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
# octomap
find_package(octomap REQUIRED)
include_directories(${OCTOMAP_INCLUDE_DIRS})
add_executable(pointcloud_mapping pointcloud_mapping.cpp)
target_link_libraries(pointcloud_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} fmt::fmt) #链接fmt
add_executable(octomap_mapping octomap_mapping.cpp)
target_link_libraries(octomap_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} ${OCTOMAP_LIBRARIES} fmt::fmt) #链接fmt
add_executable(surfel_mapping surfel_mapping.cpp)
target_link_libraries(surfel_mapping ${OpenCV_LIBS} ${PCL_LIBRARIES} fmt::fmt) #链接fmt
完整dense_mono/CMakeList.txt代码:
cmake_minimum_required(VERSION 2.8)
project(dense_monocular)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++14 -march=native -O3")
# Eigen
include_directories("/usr/include/eigen3")
# OpenCV
find_package(OpenCV 4 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# Sophus
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
完整`dense_RGBD/CMakeList.txt`代码:
set(THIRD_PARTY_LIBS
${OpenCV_LIBS}
${Sophus_LIBRARIES})
add_executable(dense_mapping dense_mapping.cpp)
target_link_libraries(dense_mapping ${THIRD_PARTY_LIBS} fmt) #链接fmt
1)修改完成后编译:
cd ~/pkgs/slambooks/ch12
cmake ..
make -j4
编译成功,生成可执行文件:

1)运行dense_mapping,需要先下载数据集(复制到浏览器就会下载,界面打不开):
http://rpg.ifi.uzh.ch/datasets/remode_test_data.zip
笔者运行会莫名中断:
read total 202 files.
*** loop 1 ***
Segmentation fault (core dumped)
大概率是内存爆掉了:( ,结果可以参考这篇文章:《视觉SLAM十四讲 第二版》笔记及课后习题(第十二讲)
2)运行octomap_mapping,在有data文件夹的目录下执行:
./octomap_mapping
生成octomap.bt文件,使用octovis查看结果:
octovis octomap.bt

3)运行pointcloud_mapping、surfel_mapping,在有data文件夹的目录下执行:
./pointcloud_mapping
生成map.pcd文件,使用surfel_mapping或pcl_viewer查看结果:
./surfel_mapping map.pcd
pcl_viewer map.pcd
查看./surfel_mapping map.pcd结果:

查看pcl_viewer map.pcd结果:

3.9 ch13
问题1 error: ‘CV_GRAY2BGR’ was not declared in this scope
在OpenCV4中,CV_GRAY2BGR已被cv::COLOR_GRAY2BGR替换
解决方法:修改ch13/src/viewer.cpp中所有的CV_GRAY2BGR为
cv::COLOR_GRAY2BGR
问题2 error: ‘CV_FILLED’ was not declared in this scope
在OpenCV4中,CV_FILLED已被cv::FILLED替换
解决方法:修改ch13/src/frontend.cpp中所有的CV_FILLED为
cv::FILLED
问题3
/usr/bin/ld: cannot find -lglut: No such file or directory
collect2: error: ld returned 1 exit status
解决方法:
sudo apt-get install freeglut3-dev
1)修改完成后,再在将c++的标准改为14,并增加对fmt的链接,具体操作方法可以参考3.8 ch12,基本都会遇到的问题。编译:
cd ~/pkgs/slambook2/ch13
mkdir build && cd build
cmake ..
make -j4
编译完成后会在ch13/bin目录下生成run_kitti_stereo和test_triangulation两个可执行文件:

2)运行test_triangulation:
./test_triangulation
终端输出结果:

3)运行run_kitti_stereo,run_kitti_stereo需要与config在同级目录:
cp run_kitti_stereo ../
cd ..
./run_kitti_stereo
运行结果:
7674

被折叠的 条评论
为什么被折叠?



