【環境配置】(四)opencv3中配置sfm模組
1、配置前準備
下載:glog, gflags, eigen, ceres solver,地址見https://docs.opencv.org/trunk/db/db8/tutorial_sfm_installation.htmlopencv配置sfm官方說明
Eigen是一個高層次的C ++庫,有效支援線性代數,矩陣和向量運算,數值分析及其相關的演算法
Glog是google提供的一個開源的C++日誌庫.
gflags:google開源的gflags是一套命令列引數解析工具,還支援從環境變數、配置檔案讀取引數(可用gflags代替配置檔案)。
ceres solver:google開源專案,可以求解兩類問題:1、帶有邊界約束的非線性最小二乘問題。2、一般的無約束優化問題。
https://ceres-solver.googlesource.com/ceres-solver/+/1.13.0 點選tgz下載,我用opencv官網連結中git方式獲取的ceres solver 配置失敗,用此連線下載的配置成功
2、編譯。
必須按順序編譯(相互之間有依賴)。
(1)cmake編譯gflag,如下所示,編譯完成之後開啟build下面的glags.sln,debug和release模式下面分別編譯後點擊install——project only——build only install
出現錯誤 1 error MSB3073:Error 1 error MSB3073: The command "setlocal D:\牙齒專案雜記\磁碟資料\D盤\app_software\cmake-3.7.0-win64-x64\bi,解決辦法:
以管理員身份執行vs程式。
出現問題的原因:install在C盤中,沒有檔案讀寫許可權,所以出錯。出現這個錯誤還有可能的原因有:
1 在執行vs時,install目錄設定在C盤時,沒有以管理員身份啟動也會出現這種問題!
2 也可以在cmake時修改install的路徑,即修改變數CAMKE_INSTALL_PREFIX的值,例如修改為D:/openMVG/INSTALL
3 出現這個問題的原因還有可能是vs沒有找到install所需要的資料夾,比如cmake時設定的CMAKE_INSTALL_PREFIX是D:/eigen_3_4/eigen/installHere,但是在D:/eigen_3_4/eigen/下並沒有installHere資料夾,此時只要手動建立資料夾installHere也可以解決問題
(2)cmake編譯glog,需要配置gflags_dir如下所示
同樣編譯好之後開啟解決方案,編譯,INSTALL
(3)配置 eigen。
Eigen只包含標頭檔案,因此它不需要在vs中實現編譯(只需要使用#include),cmake是為了將標頭檔案指定放到目標資料夾下。使用時,指定好Eigen的標頭檔案路徑,編譯專案即可。
此處我取消了build_Testing項,載入工程會快很多,選中的話會幫你編譯生成很多的test工程專案。
(4)ceres solver模組編譯執行
a\suitesparse獲取:https://github.com/jlblancoc/suitesparse-metis-for-windows ,同樣cmake,編譯sln,INSTALL。這個並不是必須安裝的依賴庫。但是如果裝上將會提高Ceres對稀疏矩陣的計算效能,提供更多可用的優化演算法。編譯選項如下圖所示,注意將其install-prefix放在C:/Programe File/下面,以便於在後續cmake cere模組時尋找路徑時候自動找到,不用手動新增。
配置選項:不選test,example,節省後續編譯時間
b\編譯cere,解壓下載檔案,放入cmake編譯,編譯設定如下:
- 取消選中BUILD_EXAMPLES。為了節省後續編譯時間。
- 取消選中BUILD_TESTING。為了節省後續編譯時間。
- 選中BUILD_SHARED_LIBS,以便生成動態連結庫檔案。
- CMAKE_BUILD_TYPE 設為 Release。
- 選中CUSTOM_BLAS。
- 新增BLAS_LIBRARIES項(FILEPATH類)賦值
C:/Program Files/suitesparse/lib64/lapack_blas_windows/libblas.lib
- 選中LAPACK。
- 新增LAPACK_LIBRARIES項(FILEPATH類)賦值
C:/Program Files/suitesparse/lib64/lapack_blas_windows/liblapack.lib
。- 選中EIGENSPARSE。如果之前沒有安裝Eigen,只是解壓。這裡還需要手動配置EIGEN_INCLUDE_DIR項或Eigen3_DIR。
- GFLAGS和GLOG是否被選中,並且正確定位。如果安裝在C盤Program FIles應該可以自動定位。
- 選中SUITESPARSE,注意這一選項會自動取消選中。
- 新增SUITESPARSE_CHECK_INCLUDE_DIRS項(PATH類)賦值
C:/Program Files/suitesparse/include
,提示suitesparse元件標頭檔案位置。- 新增SUITESPARSE_CHECK_LIBRARY_DIRS項(PATH類)賦值
C:/Program Files/suitesparse/lib64
,提示suitesparse元件庫檔案位置。- !!! 新增CMAKE_INSTALL_PREFIX 賦值
C:/Program Files/Ceres
按照上面的設定後,我config出現如下錯誤,提示相關的lib not found,找不到的這些是suitesparse需要用到的,如果不管也能生成工程專案但是這個時候編譯得到的是without suiteSparse的,解決辦法是去不能找到lib的地方手動新增相關路徑即可。
我新增的路徑如下所示:
C:\Program Files\suitesparse\lib64\libspqr.lib
C:\Program Files\suitesparse\lib64\libcholmod.lib
C:\Program Files\suitesparse\lib64\libccolamd.lib
C:\Program Files\suitesparse\lib64\libcamd.lib
C:\Program Files\suitesparse\lib64\libcolamd.lib
C:\Program Files\suitesparse\lib64\libamd.lib
C:\Program Files\suitesparse\lib64\suitesparseconfig.lib。
注意這是release的包含庫,編譯生成工程後切換到release模式 ALL Build-INSTALL,得到release版本的資料,之後切換到debug,手動為debug模式配置包含的lib(工程屬性——linker——input——附加項),在上面的路徑下面加個d即可。同樣ALLBUILD-INSTALL。
到這裡編譯配置完成。這部分配置詳細參考:https://www.jianshu.com/p/736e89aaf788
(5)重新編譯opencv
a\新增contrib的module路徑,cmake再次編譯---此時無sfm模組
b\新增eigen的include路徑(C盤生成的庫檔案),新增GLOG的lib路徑(C盤生成的庫檔案),再次編譯。
注意eigen的路徑為include/eigen3,不要只寫到include
c\ALLBUILD-INSTALL(需要漫長的時間,之間編譯的時候忘記新增module路徑了,白編譯了一次).
總結:前面編譯都還挺容易的,但是後面opencv的一次allbuild需要的時間太長了導致如果編譯出現錯誤了再編譯一次需要的時間太長。
參考:https://blog.csdn.net/fanhao900322/article/details/78787712
注意:程式設計opencv時不要勾選opencv_contrib_world,否則會出錯,如果要編譯這個模組,參考https://blog.csdn.net/efanlee/article/details/69944267?locationNum=5&fps=1