目录
1. 安装相关库
2. 下载源码并解压:
3. 配置
4.编译
5.生成库文件
编译CUDA版opencv
在Linux下编译自己的opencv库,个人觉得用cmake编译最好了,其主要是opencv源码路径下提供了CMakeLists.txt文件用于编译,而且使用cmake编译很方便。
这是opencv在linux下的编译官方tutorial:https://docs.opencv.org/3.4.0/d7/d9f/tutorial_linux_install.html,本文很多地方都是直接进行翻译的。
1. 安装相关库
在正式编译之前,先打开终端输入下面几个命令,安装几个与opencv有关的库,注:安装需在连网情况下进行。
[compiler] sudo apt-get install build-essential
[required] sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
[optional] sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
2. 下载源码并解压:
tar zxvf 文件名.tar
3. 配置
cd ~/opencv-3.4.3 # 进入opencv文件夹
mkdir build # 创建build文件夹
cd build # 进入build文件夹
# CMAKE_BUILD_TYPE=Release表示编译的版本,CMAKE_INSTALL_PREFIX:表示生成的include和lib文件#夹路径,注意,后面的两个点千万不能省,代表了上级目录,这一步是cmake的配置过程
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
/usr/local是系统默认路径,许多第三方库都安装在这个目录下面,.so文件都安装在/usr/local/lib目录下面,最好不要换其他路径,否则很容易导致找不到.so库的问题。如果上面的配置命令无效,则尝试将空格去掉试试,使用以下命令:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..
4.编译
编译,网上很多教程都是多线程编译的,我这里不是很推荐,我尝试过多线程编译很容易出问题,最好还是使用单线程,这一步比较耗时,耐心等待编译完成。
make -j1
5.生成库文件
安装库文件,即生成.so
sudo make install
sudo make install 这一步生成所需要的头文件和.so文件,根据上面的设置,头文件在“usr/local/include”中,.so文件夹在“usr/local/lib”文件夹中,还有一些可执行文件在“usr/local/bin”文件夹中,生成的文件目录如下图所示:
使用cmake-gui编译设置:
- set full path to OpenCV source code, e.g. /home/user/opencv:源码路径
- set full path to <cmake_build_dir>, e.g. /home/user/opencv/build:编译生成文件的路径
- set optional parameters
- run: “Configure”
- run: “Generate”
编译CUDA版opencv
编译CUDA版本的opencv只在第三步配置阶段有所不同,其他过程都一样,CUDA版本的配置命令如下:
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DWITH_CUDA=ON \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DINSTALL_PYTHON_EXAMPLES=ON \
-DBUILD_EXAMPLES=ON \
-DCUDA_GENERATION=Maxwell .. //Tx1为maxwell架构,tx2为pascal架构
这里-DWITH_CUDA=ON 表示开启cuda的相关功能,-DCUDA_GENERATION=Maxwell中的Maxwell代表的是机器上显卡的架构。
在opencv3.4.7版本的OpenCVDetectCUDA.cmake文件中,显示了多种显卡架构类型:
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "2.0")
elseif(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
elseif(CUDA_GENERATION STREQUAL "Maxwell")
set(__cuda_arch_bin "5.0 5.2")
elseif(CUDA_GENERATION STREQUAL "Pascal")
set(__cuda_arch_bin "6.0 6.1")
elseif(CUDA_GENERATION STREQUAL "Volta")
set(__cuda_arch_bin "7.0")
elseif(CUDA_GENERATION STREQUAL "Turing")
set(__cuda_arch_bin "7.5")
elseif(CUDA_GENERATION STREQUAL "Auto")
历代显卡架构:Tesla时代——》Fermi时代——》Kepler时代——》Maxwell时代