參考鏈接:
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對輸入矩陣長寬是沒有要求的

