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后,make的时候如果一直报下面这个错误

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

那就表明在编译的时候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  
#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

 linux平台编译cuda版本opencv_第1张图片

在opencv3.2版本及以上中remap函数开始对输入矩阵的长宽有要求了。。。。之前版本是没有的,另外cv::cuda版本的remap对输入矩阵长宽是没有要求的

 

转载于:https://www.cnblogs.com/yqyouqing/p/9853572.html

你可能感兴趣的:(linux平台编译cuda版本opencv)