Ubuntu 20.04下OpenCV CUDA编译全程指南(Python篇)

前言

在本教程中,我们将以 OpenCV-4.10.0 为例从零开始 编译 OpenCV,并确保 支持 CUDA,同时兼容 Python 和 C++ 版本。 官方提供的 python-opencv 版本不包含 CUDA 支持,因此我们需要手动编译以获得 GPU 加速能力,本教程的最初系统环境如下表所示:

软件 版本 说明
系统 Ubuntu 20.04.6 LTS 作者是 Windows11 + Ubuntu20.04 双系统
CUDA 12.1.1 NVIDIA GPU 计算框架
cuDNN 8.9.5 CUDA 深度学习加速库
Python 3.8.10 系统默认 Python 版本
C++ 9.4.0 Ubuntu 20.04 默认的 GCC 版本,直接运行sudo apt install g++安装即可
系统自带 OpenCV 4.2.0 默认安装的 python-opencv不支持 CUDA
目标 OpenCV 4.10.0 我们将手动编译源码并启用 CUDA 加速

🚨 注意(必看)

  • 本文需要卸载系统自带的 OpenCV 4.2.0,并替换为源码编译的 OpenCV 4.10.0 (支持 CUDA)
  • 提前安装 NVIDIA 驱动 + CUDA + cuDNN,否则 OpenCV 无法启用 CUDA
  • 如果你还没有安装 NVIDIA 驱动和 CUDA,可以参考我的文章:
    全网最详细教你在Ubuntu 20.04安装NVIDIA 驱动+CUDA+cuDNN(避坑版 | 图文详解)
  • 需要科学上网,因为部分 OpenCV 组件需要从 GitHub 下载。

  • 一、下载 OpenCV 源码

    1. 创建工作目录

    mkdir ~/opencv_cuda && cd ~/opencv_cuda
    

    2. 下载 OpenCV 4.10.0 源码

    1. 打开 opencv-releases 版本页面 ,选择并点击OpencCV-4.10.0版本的Sources

    2. 将下载得到的opencv-4.10.0.zip解压至~/opencv_cuda目录下:

      unzip ~/下载/opencv-4.10.0.zip -d ~/opencv_cuda
      

    3. 下载 OpenCV Contrib 4.10.0

    1. 打开 opencv_contrib 版本页面,点击4.10.0版本。

    2. 如图所示,点击Source code (zip)

      3. 将下载得到的opencv_contrib-4.10.0.zip解压至~/opencv_cuda目录下:

      unzip ~/下载/opencv_contrib-4.10.0.zip -d ~/opencv_cuda
      

    4. 创建 build 目录

    cd ~/opencv_cuda/opencv-4.10.0
    mkdir build && cd build
    

    5. 最终目录结构

    在完成 OpenCV 和 OpenCV Contrib 源码的下载和解压后,你的 ~/opencv_cuda/ 目录结构应如下:

    ~/opencv_cuda/
    │── opencv-4.10.0/             # OpenCV 主源码目录
    │   ├── build/                 # 我们创建的编译目录(之后会生成编译结果)
    │   └── ...                    # 其他文件
    └── opencv_contrib-4.10.0/     # OpenCV Contrib 扩展模块
    	└── ...                    # 其他文件
    

    二、编译 OpenCV

    1. 安装必要的依赖

    sudo apt update
    sudo apt install -y build-essential cmake git unzip pkg-config
    sudo apt install -y libjpeg-dev libpng-dev libtiff-dev
    sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
    sudo apt install -y libxvidcore-dev libx264-dev libx265-dev
    sudo apt install -y libgtk-3-dev libcanberra-gtk3-dev
    sudo apt install -y libatlas-base-dev gfortran
    sudo apt install -y python3-dev python3-pip
    

    2. 配置 CMake

    1. 访问 NVIDIA-Your GPU Compute Capability,下滑找到CUDA-Enabled GeForce and TiTAN Products后点击并查看自己显卡算力,下一步需要填写CUDA_ARCH_BIN参数。

    2. 修改以下命令当中的CUDA_ARCH_BIN参数替换为刚才查找到的自己电脑算力(命令中是-D CUDA_ARCH_BIN="8.9" \),然后执行命令。

      cmake -D CMAKE_BUILD_TYPE=Release \
            -D CMAKE_INSTALL_PREFIX=/usr/local \
            -D OPENCV_EXTRA_MODULES_PATH=~/opencv_cuda/opencv_contrib-4.10.0/modules \
            -D WITH_CUDA=ON \
            -D ENABLE_FAST_MATH=ON \
            -D CUDA_FAST_MATH=ON \
            -D WITH_CUBLAS=ON \
            -D OPENCV_DNN_CUDA=ON \
            -D WITH_LIBV4L=ON \
            -D WITH_OPENGL=ON \
            -D WITH_TBB=ON \
            -D BUILD_TIFF=ON \
            -D BUILD_EXAMPLES=OFF \
            -D BUILD_opencv_python3=ON \
            -D PYTHON3_EXECUTABLE=$(which python3) \
            -D PYTHON3_INCLUDE_DIR=$(python3 -c "from sysconfig import get_paths as gp; print(gp()['include'])") \
            -D PYTHON3_PACKAGES_PATH=$(python3 -c "from sysconfig import get_paths as gp; print(gp()['purelib'])") \
            -D OPENCV_GENERATE_PKGCONFIG=ON \
            -D INSTALL_C_EXAMPLES=OFF \
            -D INSTALL_PYTHON_EXAMPLES=OFF \
            -D CUDA_ARCH_BIN="8.9" \
            -D CUDA_ARCH_PTX="" \
            -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
            -D CMAKE_C_COMPILER=/usr/bin/gcc-9 \
            -D CMAKE_CXX_COMPILER=/usr/bin/g++-9 ..
      

      注意:需要科学上网,否则编译过程中将无法成功下载一些组件。

    3. 编译 OpenCV

    make -j$(nproc)
    

    提示$(nproc) 代表当前系统的最大 CPU 逻辑核心数,make -j$(nproc)代表最大化利用 CPU 资源(预计编译15~60分钟不等)

    4. 安装 OpenCV

    1. 执行以下命令进行opencv的安装。

      sudo make install
      
    2. 安装过程中可能出现即便科学上网也无法很快下载的文件,比如face_landmark_model.dat如下:

      -- highgui: using builtin backend: GTK3
      -- data: Downloading face_landmark_model.dat from https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat
      
    3. 此时先按Ctrl + C终止安装过程,然后手动下载 face_landmark_model.dat 并复制到正确位置:

      cd ~/opencv_cuda/opencv-4.10.0/.cache/data/
      wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat
      mkdir -p ~/opencv_cuda/opencv-4.10.0/build/share/opencv4/testdata/cv/face/
      cp face_landmark_model.dat ~/opencv_cuda/opencv-4.10.0/build/share/opencv4/testdata/cv/face/
      
    4. 返回build目录,重新安装 OpenCV。

      cd ~/opencv_cuda/opencv-4.10.0/build 
      sudo make install
      

    5. 链接OpenCV 的共享库

    1. 执行sudo ldconfig,命令如下:

      sudo ldconfig
      
    2. 检查 OpenCV 共享库是否正确链接:

      ldconfig -p | grep opencv
      

      如果看到多个 libopencv_*.so.4.10 相关的库路径,说明链接正确,例如下图。


    三、验证 OpenCV(必须)

    1. 验证 Python 是否支持 CUDA 的 OpeCV

    1. 验证 opencv版本,执行如下命令:

      python3 -c "import cv2; print(cv2.__version__)"
      

      若输出的 opencv版本 不是4.10.0,则说明使用的是系统级opencv,先查看Python实际加载的cv2位置:

      python3 -c "import cv2; print(cv2.__file__)"
      

      如果输出如下,那么 Python 仍然在使用 旧版本的 OpenCV,而不是刚刚安装的 4.10.0

      /usr/lib/python3.8/dist-packages/cv2.cpython-38-x86_64-linux-gnu.so
      

      需要先卸载系统级opencv

      sudo apt remove python3-opencv
      sudo rm -rf /usr/lib/python3.8/dist-packages/cv2*
      

      然后手动设置OpenCV 4.10.0PYTHONPATH

      export PYTHONPATH=/usr/lib/python3.8/site-packages:$PYTHONPATH
      echo 'export PYTHONPATH=/usr/lib/python3.8/site-packages:$PYTHONPATH' >> ~/.bashrc
      source ~/.bashrc
      

      然后再次测试:

      python3 -c "import cv2; print(cv2.__version__)"
      
    2. 验证安装的opencv是否支持cuda,打开终端运行以下命令:

      python3 -c "import cv2; print(cv2.getBuildInformation())" | grep -i cuda
      

      如果可以找到 NVIDIA CUDA:YES 说明 OpenCV 已成功启用 CUDA(例如下图)。

    2. 验证 C++ 是否支持 CUDA 的 OpeCV

    1. 创建 test_opencv.cpp

      cd ~/
      sudo nano test_opencv.cpp
      
    2. 将以下内容填入test_opencv.cpp 然后保存并退出:

      #include <opencv2/cvconfig.h>
      #include <opencv2/opencv.hpp>
      #include <iostream>
      int main() {
          std::cout << "OpenCV Version: " << CV_VERSION << std::endl;
      #ifdef HAVE_CUDA
          std::cout << "CUDA is available." << std::endl;
      #else
          std::cout << "CUDA is NOT available." << std::endl;
      #endif
          return 0;
      }
      
    3. 执行以下命令编译test_opencv.cpp

      g++ test_opencv.cpp -o test_opencv `pkg-config --cflags --libs opencv4` -I/usr/local/include/opencv4/opencv2 -L/usr/local/lib -Wl,-rpath,/usr/local/lib
      
    4. 运行编译结果:

      ./test_opencv
      

      如果显示opencv版本CUDA is available.说明 OpenCV 已成功启用 CUDA(例如下图)。


    四、总结

    通过本教程,我们成功 从源码编译并安装了 OpenCV 4.10.0,并且 启用了 CUDA 加速,同时支持 Python 和 C++ 版本

    ✅ 你现在可以使用 GPU 加速 OpenCV!

  • 在 Python 中使用 cv::cuda::GpuMat 进行 GPU 计算
  • 在 C++ 代码中使用 CUDA 加速的 OpenCV 模块
  • 📌 如果本教程帮到了你

    如果你按照本教程成功编译并安装了 支持 CUDA 的 OpenCV 4.10.0,希望可以得到你的小小 点赞 👍、收藏 ⭐ 和评论 💬,这将是对作者最大的支持!

    💡 为什么写这篇文章?

  • 作为 OpenCV + CUDA 编译的 踩坑者,作者经历了 好几天反复尝试,踩了无数的坑,失败了无数次,才最终总结出这篇 完整且详细 的教程。
  • 如果它对你有帮助,不妨点个赞支持一下,也欢迎留言交流你遇到的问题!
  • 作者:Natsuagin

    物联沃分享整理
    物联沃-IOTWORD物联网 » Ubuntu 20.04下OpenCV CUDA编译全程指南(Python篇)

    发表回复