史上最详细Ubuntu20.04编译OpenCV+CUDA教程(Python & C++ 双支持 | 速通 + 避坑)

前言

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

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

🚨 注意(必看)


一、下载 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 编译的 踩坑者,作者经历了 好几天反复尝试,踩了无数的坑,失败了无数次,才最终总结出这篇 完整且详细 的教程。
  • 如果它对你有帮助,不妨点个赞支持一下,也欢迎留言交流你遇到的问题!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值