最近自己決定動手寫一個視覺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
這是遇到的所有問題,如果大家遇到了其他問題,歡迎一起討論;