跟做高博的《一起做RGB-D SLAM》系列时,出现了挺多bug的(主要因为自己还是个小白),在此记录下解决过程。(ubuntu18.04,opencv3.4.9)
一起做RGB-D SLAM(3):
1./home/max/slam0.1/src/detectFeatures.cpp:9:5: error: stray ‘#’ in program
出现这个错误,真的要反思下自己太粗心了,低级到不能再低级的错误。这里把高博src/detectFeatures.cpp的代码直接复制粘贴过来,需要把代码前面的序号都删掉(其他代码片段都没问题,是可以直接复制粘贴的)。
删除前面序号有个简便方法,用sublime txt编辑器(很好用,实力推荐,下载好后用命令subl “文件名”,打开文件进行操作),先安装emmet插件(不会的同学百度下),再选中要编辑的代码行(我们全选就行),按下 Ctrl+Shift+L或者Command+Shift+L ,最后键盘方向键把光标移到序号后面再删除即可。
2./home/max/slam0.1/src/detectFeatures.cpp:15:11: fatal error: opencv2/nonfree/nonfree.hpp: 没有那个文件或目录
出现这个错误是因为nonfree模块在opencv3.0以上的release版本中被移除了,其中我们主要用到的SIFT算法现在被放到了xfeacture模块里,此时有两条路可以走:
-
安装contrib模块(扩展模块)——不稳定,不建议安装:
这个可以参照Ubuntu18.04安装OpenCV4.0.0和OpenCV-contrib模块。 -
换用其他特征提取匹配算法(ORB算法):
可以先看看几种算法的差别:特征检测和特征匹配方法,opencv 特征点提取算法 SIFT SURF ORB FAST LBP学习(一),SURF和SIFT算法一样都在扩展模块里,用不了,综合比较下还是选用ORB好一点。
首先把src/detectFeatures.cpp里的nonfree引用和初始化部分(下图第一、第二白框处的内容)删去,然后将算法改为ORB即下图第三白框处的内容改为:
_detector = cv::ORB::create();
_descriptor = cv::ORB::create();
需要注意的是,这是opencv3.0以上版本的写法,如果是2.**版本的话则改为:
_detector = cv::FeatureDetector::create("ORB");
_descriptor = cv::DescriptorExtractor::create("ORB");
ORB特征描述子是uchar类型,只能使用BruteForce匹配法。因此我们还要将FLANN匹配法改为BF(暴力)法,即将下图白框处改为:
cv::BFMatcher matcher;
3.CMakeFiles/detectFeatures.dir/detectFeatures.cpp.o:在函数‘main’中:detectFeatures.cpp:(.text+0x1090):对‘point2dTo3d(cv::Point3_&, CAMERA_INTRINSIC_PARAMETERS&)’未定义的引用collect2: error: ld returned 1 exit status
这里出错是因为没有链接slambase的静态库文件,在src/CMakeLists.txt里加上libslambase.a或slambase即可(如下图)。
或
如果出现:
/usr/bin/ld: 找不到 -lslambase,
先看看主目录下的CMakeLists.txt里,库文件的输出目录是否正确(如下图)。
如果正确,则先把src/CMakeLists.txt里的detectFeatures部分注释掉(如下图)。
然后再编译一遍,看看主目录的lib文件夹里是否有libslambase.a文件,如果有的话再把刚才的注释部分恢复,重新编译下即可。
4.terminate called after throwing an instance of 'cv::Exception’what(): OpenCV(3.4.9) /home/max/SLAM-env/opencv-3.4.9/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ‘cvtColor’ 已放弃 (核心已转储)
在主目录里执行bin/detectFeatures
即可
5.terminate called after throwing an instance of 'cv::Exception’what(): OpenCV(3.4.9) /home/max/SLAM-env/opencv-3.4.9/modules/calib3d/src/ptsetreg.cpp:172: error: (-215:Assertion failed) confidence > 0 && confidence < 1 in function ‘run’ 已放弃 (核心已转储)
这个错误是因为opencv3.0以上版本里的solvePnPRansac()函数参数有更改,把置信度改为0.99即可,详情可以参考官方文档:Camera Calibration and 3D Reconstruction。
把src/detectFeatures.cpp里的:
cv::solvePnPRansac( pts_obj, pts_img, cameraMatrix, cv::Mat(), rvec, tvec, false, 100, 1.0, 100, inliers );
改为:
cv::solvePnPRansac(pts_obj, pts_img, cameraMatrix, cv::Mat(), rvec, tvec, false, 100, 1.0, 0.99, inliers);
重新编译下,运行成功,奶斯!