如何編譯 opencv3 和 opencv_contrib(Linux)


本文以編譯並安裝OpenCV 3.3.0 為例,安裝系統為 Linux x64 (Fedora 21),具體步驟如下:

1. 下載 Source code zip 壓縮包

從下面網址,選擇 opencv 3.3.0 Source code 下載
https://github.com/opencv/opencv/releases

從下面網址,選擇下載與 opencv 3.3.0 對應的 opencv_contrib 3.3.0
https://github.com/opencv/opencv_contrib/releases

注意:opencv和opencv_contrib 版本必須保持一致,否則可能會出現編譯錯誤。

2. 准備安裝目錄,並解壓源碼

2.1 准備安裝目錄
本人准備將 opencv 安裝到 ~/libs/opencv-trunk/release/installed 目錄,沒有安裝到默認目錄,其好處,一是節省根目錄空間(前提是 /home 和 / 不是一個分區);二是可以安裝多個版本的 opencv,詳見參考資料 How to Have Multiple Versions of OpenCV Side by Side

$ mkdir -p ~/libs/opencv-trunk/release/installed

2.2 解壓 opencv zip 壓縮包
將下載的 zip 壓縮包復制到 ~/opencv 目錄,並解壓。

$ cd ~/opencv $ unzip opencv-3.3.0.zip $ unzip opencv_contrib-3.3.0.zip

3. 配置

$ cd ~/opencv/opencv-3.3.0 $ mkdir build && cd build $ cmake -DCMAKE_INSTALL_PREFIX=/home/klchang/libs/opencv-trunk/release/installed -DCMAKE_BUILD_TYPE="Release" -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3.0/modules ..

注意,

1)這里的配置是將 opencv 3.3.0 和 opencv_contrib 3.3.0 一起編譯,如果只需編譯 opencv 3.3.0,把 "-DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3.0/modules" 去掉即可;
2)如果需要更改安裝位置或按默認位置安裝,則 需要更改 "-DCMAKE_INSTALL_PREFIX="后的目錄,或將此項配置刪除。

4. 編譯並安裝

$ make -j4 $ make install

注:在重新編譯時,無需執行 make clean,因為這樣會節省再次編譯的時間,編譯系統會自動利用已經編譯好的中間文件,而對於編譯通過的部分,無需再重新編譯。

5. 問題與解決方法

問題一: 

fatal error: unsupported/Eigen/MatrixFunctions: No such file or directory

解決方法:

復制 eigen-3.3.4/unsupported 目錄到 /usr/local/include,然后刪除 unsupported/ 目錄下,除 Eigen/ 目錄外,所有的目錄和文件。

$ sudo cp -r eigen-3.3.4/unsupported /usr/local/include $ cd /usr/local/include/unsupported $ shopt -s extglob $ sudo rm -rf !(Eigen)

然后,重新編譯 opencv 。

問題二:

opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp:72:31: error: ‘traits’ has not been declared CV_Assert(guide.type() == traits::Type<GuideVec>::value); opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp:72:52: error: expected primary-expression before ‘>’ token CV_Assert(guide.type() == traits::Type<GuideVec>::value); opencv_contrib/modules/ximgproc/src/dtfilter_cpu.inl.hpp:72:53: error: ‘::value’ has not been declared CV_Assert(guide.type() == traits::Type<GuideVec>::value);

解決方法:

這是由於編譯的 opencv 版本與 opencv_contrib 版本不一致造成的,下載相同版本的 opencv 和 opencv_contrib,然后重新編譯。

問題三:

/usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): relocation R_X86_64_32 against `__pthread_key_create@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libgflags.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status modules/sfm/CMakeFiles/opencv_sfm.dir/build.make:319: recipe for target 'lib/libopencv_sfm.so.3.3.0' failed make[2]: *** [lib/libopencv_sfm.so.3.3.0] Error 1 CMakeFiles/Makefile2:13259: recipe for target 'modules/sfm/CMakeFiles/opencv_sfm.dir/all' failed make[1]: *** [modules/sfm/CMakeFiles/opencv_sfm.dir/all] Error 2 Makefile:147: recipe for target 'all' failed make: *** [all] Error 2

解決方法:

重新配置並安裝 gflags library 。將 gflags 配置為 同時編譯靜態庫和動態庫,因為 opencv_contrib 的源文件編譯過程中,同時使用其靜態庫和動態庫。

$ cd gflags-master $ mkdir build && cd build $ cmake -DBUILD_SHARED_LIBS=ON -DBUILD_STATIC_LIBS=ON .. $ make $ sudo make install

然后,重新編譯 opencv。

問題四:

[ 98%] Building CXX object modules/sfm/CMakeFiles/opencv_sfm.dir/src/simple_pipeline.cpp.o Linking CXX shared library ../../lib/libopencv_sfm.so /usr/bin/ld: cannot find -lgflags_static collect2: error: ld returned 1 exit status modules/sfm/CMakeFiles/opencv_sfm.dir/build.make:318: recipe for target 'lib/libopencv_sfm.so.3.3.0' failed make[2]: *** [lib/libopencv_sfm.so.3.3.0] Error 1 CMakeFiles/Makefile2:13259: recipe for target 'modules/sfm/CMakeFiles/opencv_sfm.dir/all' failed make[1]: *** [modules/sfm/CMakeFiles/opencv_sfm.dir/all] Error 2 Makefile:147: recipe for target 'all' failed make: *** [all] Error 2

解決方法:

同上。

6. 參考資料

[1] Installation in Linux
http://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html
[2] How to Have Multiple Versions of OpenCV Side by Side
http://code.litomisky.com/2014/03/09/how-to-have-multiple-versions-of-the-same-library-side-by-side/

7. 附錄:本人使用源碼包版本及百度網盤下載 

OpenCV 3.3.0 - https://pan.baidu.com/s/1bp2cq67

opencv_contrib 3.3.0 - https://pan.baidu.com/s/1nuKy4bB

eigen 3.3.4 - https://pan.baidu.com/s/1kUXtMEr

gflags 2.2.1 - https://pan.baidu.com/s/1miC9jTI

glog 0.3.3 - https://pan.baidu.com/s/1gfktlPD

ceres-solver 1.13.0 - https://pan.baidu.com/s/1c1Z9WPU


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM