前言
在本教程中,我们将以 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 源码
-
打开 opencv-releases 版本页面 ,选择并点击
OpencCV-4.10.0
版本的Sources
。 -
将下载得到的
opencv-4.10.0.zip
解压至~/opencv_cuda
目录下:unzip ~/下载/opencv-4.10.0.zip -d ~/opencv_cuda
3. 下载 OpenCV Contrib 4.10.0
-
打开 opencv_contrib 版本页面,点击
4.10.0
版本。 -
如图所示,点击
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
-
访问 NVIDIA-Your GPU Compute Capability,下滑找到
CUDA-Enabled GeForce and TiTAN Products
后点击并查看自己显卡算力,下一步需要填写CUDA_ARCH_BIN
参数。 -
修改以下命令当中的
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
-
执行以下命令进行
opencv
的安装。sudo make install
-
安装过程中可能出现即便科学上网也无法很快下载的文件,比如
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
-
此时先按
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/
-
返回
build
目录,重新安装 OpenCV。cd ~/opencv_cuda/opencv-4.10.0/build sudo make install
5. 链接OpenCV 的共享库
-
执行
sudo ldconfig
,命令如下:sudo ldconfig
-
检查 OpenCV 共享库是否正确链接:
ldconfig -p | grep opencv
如果看到多个
libopencv_*.so.4.10
相关的库路径,说明链接正确,例如下图。
三、验证 OpenCV(必须)
1. 验证 Python 是否支持 CUDA 的 OpeCV
-
验证
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.0
的PYTHONPATH
: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__)"
-
验证安装的
opencv
是否支持cuda
,打开终端运行以下命令:python3 -c "import cv2; print(cv2.getBuildInformation())" | grep -i cuda
如果可以找到
NVIDIA CUDA:YES
说明 OpenCV 已成功启用 CUDA(例如下图)。
2. 验证 C++ 是否支持 CUDA 的 OpeCV
-
创建
test_opencv.cpp
cd ~/ sudo nano test_opencv.cpp
-
将以下内容填入
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; }
-
执行以下命令编译
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
-
运行编译结果:
./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 编译的 踩坑者,作者经历了 好几天反复尝试,踩了无数的坑,失败了无数次,才最终总结出这篇 完整且详细 的教程。
- 如果它对你有帮助,不妨点个赞支持一下,也欢迎留言交流你遇到的问题!