最近自己决定动手写一个视觉slam程序,
写代码不仅仅加深对slam实现原理的理解,同时提升使用cmake、kdevelop等工具的
熟练度,这些是编译大型项目的基础;
一个成熟完整的程序展现的是bin lib include src等文件夹,但是不可能将整个构造过程统统展现出来,对于小白来说,很难理解整个项目的搭建过程是怎样的,自己写代码,搭建项目的的时候可能仍是一头雾水,因此可以借写代码熟悉整个编译过程;
以后做改进,或者希望做框架的拓展时,也会更加得心应手;
话不多说,这一篇即是自己搭建slam程序遇到的第一个暗坑所做的总结;
做slam的第一步是从IO图片或者视频开始,我们很自然的要用到OpenCV,但是如果想要在opencv中使用sift算子,我们需要安装extra_modules(Opencv_contrib)组件,
因为sift和surf是需要专利付费的算法,专利权隶属于哥伦比亚大学,因此opencv3将一些不稳定的或需要专利付费的算法整理出了一个模块,所以如果工业界的同学们需要用这两个算法的时候(居然不用ORB?),要谨慎呀。
安装Opencv和Opencv_contrib的时候要注意版本匹配,下面给出网址大家可以从里面挑选对应的版本:
温馨提示:点击opencv(or opencv_contrib)
点击release,选择你想要的版本:
选择需要的版本和文件(ubuntu下选择源码安装)。
OpenCV contrib组件的下载同样,二者版本要匹配!
切记不要直接在opencv界面上选择Clone and download,版本会是最新版本,和opencv_contrib不匹配;
卸载OpenCV
接下来我们进去ubuntu;首先我们需要先卸载安装的opencv版本(也可以选择不卸载,这里提供给大家卸载的方法,毕竟我还不清楚如何在ubuntu下实现opencv多版本共存):
1.完全卸载opencv2
1.1.From repository,从软件仓库中安装的opencv2
sudo apt-get purge libopencv*
1.2.From source,使用cmake自行编译安装的opencv你
首进入原先编译opencv2的build目录,在该目录下打开终端;再执行以下代码。
sudo make uninstall
cd ..
sudo rm -r build
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*
这一步可能有error,忽略之。最后执行如下操作:
sudo apt-get -purge remove opencv-doc opencv-data python-opencv
对一些error可以无视,实现上述步骤,可进入/usr/local/include/下查看是否还是有opencv文档,如果没有,说明已经卸载成功;
安装OpenCV依赖项:
接下来我们安装opencv的依赖项;在ubuntu下的好处就是对于任何操作几行指令就可以完成,非常方便:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get update
至此,依赖项安装完毕;
安装OpenCV以及Opencv_contribe组件
下面我们开始安装opencv以及opencv_contrib组件:
首先将二者解压,如果选择的是zip文档解压代码为
unzip opencv-3.4.1.zip
unzip opencv_contrib-3.4.1.zip
解压后将opencv_contrib-3.4.1移动道opencv-3.4.1文档目录下;
进入opencv-3.4.1文档,采用外部编译的方式,输入下列代码:
mkdir build;
cd build;
关键是cmake的代码,因为各位ubuntu的系统配置不尽相同,因此可以使用下列比较通用的代码:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local/ \
-DINSTALL_PYTHON_EXAMPLES=ON \
-DINSTALL_C_EXAMPLES=ON \
-DPYTHON_EXCUTABLE=/usr/bin/python \
-DOPENCV_EXTRA_MODULES_PATH=/home/lxy/opencv/opencv-3.4.1/opencv_contrib-3.4.1/modules \
-DWITH_CUDA=OFF \
-DWITH_CUFFT=OFF \
-DWITH_CUBLAS=OFF \
-DWITH_TBB=ON \
-DWITH_V4L=ON \
-DWITH_QT=ON \
-DWITH_GTK=ON \
-DWITH_OPENGL=ON \
-DBUILD_EXAMPLES=ON ..
标红行意味着是各位需要根据自己的opencv解压后的文件目录以及opencv_contrib文件目录(你已经把它移动道opencv目录下了)做更改;
注意最后两个点不能省略(懂的自然懂,不懂的记得google呦),如果某些文档没有安装,可自己选择on 或者off选项,此处也有人采用cmake-gui来设置,但是实现懒的学,就先采用这种方式吧。
正常的话,即可进入编译,此时输入
make –j8
-j8的意思是8核同时编译,也意味着8个进程同时编译(给非IT的我一点见识-、-)
这个时候就会遇到各种各样的问题了:
除了下面这个blog
http://www.cnblogs.com/klchang/p/7510526.html
可能遇到这种问题
问题1
这个时候很简单,将contrib/modules/中的相关hpp文件移动到/usr/local/include下即可(花了我1-2个小时才明白这个道理),如果没有opencv2 建立对应的文件夹,记得在/usr/local/include目录下所有的操作都需要加sudo 权限
如建立opencv2文件夹:
sudo mkdir opencv2
如上述问题可采用
sudo cp –r <source-directory> <goal-directory>
相信这样的操作大家一定可以摸索成功
问题2
linemod问题,下面github上的一个哥们即把这个问题提出来,放在了网上,记得不需要加cv::只需要把#include <opencv2/rgbd/linemod.hpp>加到报错的hpp中即可,如果出现如问题1的 no such file or directory,采取问题1的解决方式即可。所以说,认真分析bug信息,坚持google,我们会不断进步的(小N:师兄加油!!! )
https://github.com/opencv/opencv/issues/10844
问题3
如果出现关于build opencv_contribute fatal error boostdesc_bgm.i and vgg;
这个问题遇到的时候极为难受,因为根本毫无头绪,然而总是由大神给出答案,可参考opencv网站上的questions
我这里直接也给出解决方式:
图片中标蓝的网址为:
https://github.com/opencv/opencv_3rdparty/branches/stale
转自:https://www.cnblogs.com/needybeerlxy/p/8979238.html