linux平台編譯cuda版本opencv


參考鏈接:

https://www.pyimagesearch.com/2016/07/11/compiling-opencv-with-cuda-support//

https://docs.opencv.org/3.4.0/d7/d9f/tutorial_linux_install.html

https://askubuntu.com/questions/631720/opencv-2-4-9-make-error

http://www.itboth.com/d/eyY3ma/linux-cuda-opencv

在添加了#include<opencv2/gpu/gpu.hpp>后,make的時候如果一直報下面這個錯誤

 fatal error: opencv2/gpu/gpu.hpp: No such file or directory
 #include <opencv2/gpu/gpu.hpp>

那就表明在編譯的時候opencv就沒有添加gpu,cuda相關文件,需要重新編譯opencv

 

 一、編譯opencv2系列

1、在官網上下載opencv源碼(我安裝的是2.4.10版本)

https://opencv.org/releases.html

2、解壓后建立一個build文件,然后在opencv目錄下輸入如下指令進行cmake(最后兩省略號不要漏掉),並且-DCMAKE_INSTALL_PREFIX指定編譯后opencv所在的路徑

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE \
    -DCMAKE_INSTALL_PREFIX=/home/users/qing.you/opencv/opencv-2.4.10 \
    -DWITH_CUDA=ON \
    -DENABLE_FAST_MATH=1 \
    -DCUDA_FAST_MATH=1 \
    -DWITH_CUBLAS=1 \
    -DINSTALL_PYTHON_EXAMPLES=ON \
    -DBUILD_EXAMPLES=ON \
    -DCUDA_GENERATION=Maxwell ..

這里-DWITH_CUDA=ON 表示開啟cuda的相關功能,-DCUDA_GENERATION=Maxwell中的Maxwell代表的是機器上顯卡的架構,

這里我的機器是由於是GeForce GTX Titan X,所以是Maxwell架構,具體可查看:

https://en.wikipedia.org/wiki/CUDA#GPUs_supported

參考的答案是https://stackoverflow.com/questions/28010399/build-opencv-with-cuda-support

發現在opencv路徑/cmake/OpenCVDetectCUDA.cmake這個文件中有定義可以選擇的框架,如下所示:

 set(_generations "Fermi" "Kepler")
  if(NOT CMAKE_CROSSCOMPILING)
    list(APPEND _generations "Auto")
  endif()
  set(CUDA_GENERATION "" CACHE STRING "Build CUDA device code only for specific GPU architecture. Leave empty to build for all architectures.")
  if( CMAKE_VERSION VERSION_GREATER "2.8" )
    set_property( CACHE CUDA_GENERATION PROPERTY STRINGS "" ${_generations} )
  endif()

  if(CUDA_GENERATION)
    if(NOT ";${_generations};" MATCHES ";${CUDA_GENERATION};")
      string(REPLACE ";" ", " _generations "${_generations}")
      message(FATAL_ERROR "ERROR: ${_generations} Generations are suppered.")
    endif()
    unset(CUDA_ARCH_BIN CACHE)
    unset(CUDA_ARCH_PTX CACHE)
  endif()

並且貌似opencv2版本里面只有"Fermi"、"Kepler"或者"Auto",在opencv3版本中才有"Maxwell" ,所以我只好下載openccv3進行重新編譯了

3、然后返回opencv主目錄,執行如下指令

make -j64

4、然后再執行

make install

有問題的話參考這個博客:https://www.codetd.com/article/2686117

編譯完成注意更改環境變量,打開~/.bashrc,在里面加上下面三行,然后退出source下,即可將系統默認opencv路徑換成你指定的路徑了

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/users/qing.you/opencv/opencv-3.4.3/lib:/home/users/qing.you/opencv/opencv-3.4.3/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/home/users/qing.you/opencv/opencv-3.4.3/lib64
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/users/qing.you/opencv/opencv-3.4.3/lib64/pkgconfig

 

二、編譯opencv3系列

 編譯opencv3大部分流程和opencv2幾乎一樣,與編譯opencv2不一樣,一般會在下載一個文件的地方卡住,我這里是ippicv_2017u3_lnx_intel64_general_20180822.tgz,
 需要手動將它下載下來,官方下載地址是:

https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20170822/ippicv

下載后將其放在opencv3.4.3的同級目錄,然后輸入如下指令

ipp_file=ippicv_2017u3_lnx_intel64_general_20180518.tgz &&
ipp_hash=$(md5sum ../$ipp_file | cut -d" " -f1) &&
ipp_dir=.cache/ippicv                           &&
mkdir -p $ipp_dir &&
cp ../$ipp_file $ipp_dir/$ipp_hash-$ipp_file

最后重新cmake即可

opencv3中使用cuda,包含下面三個頭文件即可,然后每個名字前面加上cv::cuda::即可,不能在前面直接增加命名空間cv::cuda,因為這樣會和cv沖突

#include <opencv2/cudaimgproc.hpp> 
#include "opencv2/cudawarping.hpp" 
#include "opencv2/cudaarithm.hpp" 

此外當時跑程序一直在remap出現下面這個錯誤:

 error: (-215:Assertion failed) dst.cols < SHRT_MAX && dst.rows < SHRT_MAX && src.cols < SHRT_MAX && src.rows < SHRT_MAX in function 'remap'

網上查半天沒有發現原因,后來查看opencv3.4.3的官方說明文檔后發現一個小細節

https://opencv.org/releases.html

 

在opencv3.2版本及以上中remap函數開始對輸入矩陣的長寬有要求了。。。。之前版本是沒有的,另外cv::cuda版本的remap對輸入矩陣長寬是沒有要求的

 


免責聲明!

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



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