linux下opencv4.2編譯cuda的那些坑

目錄

1.編譯cmake

2.配置

3. 編譯

4. opencv4.2使用中的問題

1. c++11標準的支持

2. cuda支持


前言: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。


如有不足之處,希望各位同行指正。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章