**
《一起做RGB-D SLAM》(3)遇到的问题
**
1.SIFI特征点,没有nonfree.hpp模块
解决:下载安装与opencv对应的opencv-contrib,看别人教程说得与opencv同时编译,所以首先得把之前的opencv删除。删除网上教程比较多,这里不详细贴出。
opencv3.2+opencv_contrib3.2 安装参考:opencv3.2+opencv_contrib3.2
注意:高翔博士在github上的源代码更新成不需要使用SIFI特征点,也就不需要安装opencv_contrib模块。如果不需要用到,可以选择不安装,因为安装过程会有很多error!本人大约用了一天时间~才成功,但是目前也没有用到(因为我到后面才看到高博写的更新。。。)。
2.按照高博教程,cmake工程后,make出现fatal error:slamBase.h no such file or directory 没有那个文件或目录
解决:我犯了一个很弱智的错误!难怪上网搜都找不到解决方法。slamBase.h文件程序写错了。。。具体是PointCloud::Ptr image2PointCloud(cv::Mat& rgb,cv::Mat& depth,CAMERA_INTRINSIC_PARAMETERS& camera);中有一个“&”打成"$"。
3.出现error: ‘create’ is not a member of ‘cv::FeatureDetector {aka cv::Feature2D}’
解决:这是因为高博用的opencv2,我用的是opencv3。我把原来的代码修改如下,就可以顺利运行了。
cv::Ptr<cv::ORB> detector;
// 如果使用 sift, surf ,之前要初始化nonfree模块
// cv::initModule_nonfree();
// _detector = cv::FeatureDetector::create( "SIFT" );
// _descriptor = cv::DescriptorExtractor::create( "SIFT" );
detector = cv::ORB::create();
vector< cv::KeyPoint > kp1, kp2; //关键点
detector->detect( rgb1, kp1 ); //提取关键点
detector->detect( rgb2, kp2 );
// 计算描述子
cv::Mat desp1, desp2;
detector->compute( rgb1, kp1, desp1 );
detector->compute( rgb2, kp2, desp2 );
4.最后计算两个图像的运动时,又又又出错了,出现opencv-3.2/modules/calib3d/src/ptsetreg.cpp:178: error: (-215) confidence > 0 && confidence < 1 in function run。
解决:网上搜只用改detectFeatures.cpp文件的一个地方就可以了
// 求解pnp
cv::solvePnPRansac( pts_obj, pts_img, cameraMatrix, cv::Mat(), rvec, tvec, false, 100, 1.0, 0.99, inliers );
最后终于运行成功了,图片就不放了,网上都一样的。总之,遇到bug要不放弃,坚持google。我的第一篇笔记就结束了。
附上opencv3.2和对应版本的opencv_contrib下载链接opencv3.2及opencv_contrib下载