目錄
前言:opencv4.2版本19年12月發佈,其最重要的改變是增加了對DNN模塊cuda加速,使得深度學習調用DNN接口可以獲取GPU的加速。但opencv4.2版本中DNN的加速模塊放在了opencv_contrib中,因此要使用opencv4.2進行cuda加速,就必須聯合編譯opencv_contrib,聯合編譯opencv_contrib與往期版本步驟類似,由於我編譯的是release版本亦或是最新版源碼的問題,聯合編譯的過程出現了許多坑,本文記錄了編譯過程中的問題,以防自己再次踩坑,也給需要的人提供一些參考。
我的環境:ubuntu16.04+g++5.4.0+cmake3.6.0
1.編譯cmake
之前寫過一篇文章《cmake安裝》,可以參考下。
除了cmake之外我不知道還有沒有其他的編譯方式,但官方源碼既然給出了cmakelist.txt文件,肯定也是推薦用cmake方式編譯的。
2.配置
(在編譯opencv4.2時,如果不進行聯合編譯opencv_contirb,在進行配置環節時就會報錯,錯誤時找不到"\modules\cudev"文件,所以我猜測可能時必須進行聯合編譯的。)
(1)下載opencv與opencv_contrib,分別解壓,將opencv_contrib放置於opencv解壓後的文件夾內,如下圖所示:
(2)新建build文件夾,用於存放編譯過程中間文間,進入build文件夾內,打開終端,輸入配置命令:
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib4.2.0/modules .. \
-DWITH_CUDA=1 \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DCUDA_GENERATION=Pascal ..
再次,千萬千萬提醒一句:這一步非常非常重要!配置錯了,編譯處理的結果可能就不是你想要的,後面的編譯過程很長,所以這一步非常重要。
配置注意點:
- 每個換行符後面不能有空格;
- GPU顯卡類型要正確;
- 關於EXAMPLE的編譯,很多文章都有編譯,我之前編譯過一次,出錯了,是"samples\gpu\surf_keypoint_matcher.cpp"文件編譯出錯了,錯誤是找不到cv::cuda::SURF_CUDA(),這還不是contirb中的代碼,這讓我很納悶。不知道有沒有同行遇到過,如有同樣問題,希望不吝賜教。
3. 編譯
配置完成後,執行編譯命令編譯命令:"sudo make -j1",我比較推薦單線程,雖慢但穩。
在編譯過程會出現一些問題,問題都出現在opencv_contirb中,來看第一個問題,見下圖:
缺少boostdesc_bgm.i這個文件,下面鏈接百度雲盤下載這個文件後,放入到"..\modules\xfeatures2d\src"目錄下,繼續編譯。(注:下載的所有文件都需要拷貝,以下文件都需要。)
百度雲資料:https://pan.baidu.com/s/1SmRMg_aydPYOJ1jKNjGZPw,密碼:z7dp
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
繼續編譯不需要重開終端,在已開終端裏直接"sudo make -j1"即可,編譯過程會跳過剛纔編譯完成的部分。
第二個問題如下圖,在目錄"..\modules\xfeatures2d\test"下找不到某個hpp文件
這個hpp文件在"..\modules\features2d\test"文件下有,直接拷貝到"..\modules\xfeatures2d\test"目錄下,然後修改"modules\xfeatures2d\test\test_features2d.cpp"文件中第51行,修改爲如下圖形式:
繼續編譯,然後接下來還會遇到一個缺少頭文件的問題,同樣在"..\modules\features2d\test"目錄下能找到該頭文件,將頭文件複製到"..\modules\xfeatures2d\test"目錄下,再修改對應的文件,再繼續編譯,接下來就沒有任何問題了。
等待編譯結束後,安裝.so庫,"sudo make install"。
4. opencv4.2使用中的問題
1. c++11標準的支持
4.2版本的opencv在使用時候需要c++11標準的支持,一般linux系統上的g++,gcc版本都不是默認c++11標準的,默認爲c++98標準的,如果你的程序在編譯過程中出現如下錯誤,則說明你的編譯器默認不是c++11標準。
opencv4.x+ requires enabled c++11 support
因此要使用opencv4.2版本需要顯式的開啓c++11標準,在編譯源碼時候必須加上”-std=c++11”。
舉例makefile文件:
修改前:
修改後(紅色框):
2. cuda支持
程序運行如出現下圖的提示:
則說明你的CUDA並未開啓,很可能是你的opencv並沒有安裝CUDA。
如有不足之處,希望各位同行指正。