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对输入矩阵长宽是没有要求的