目录

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”文件夹中,生成的文件目录如下图所示:

opencv使用与不使用cmake区别 opencv cmake_TX2

使用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时代