史上最详细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 双系统 |
| 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.cppcd ~/ sudo nano test_opencv.cpp -
将以下内容填入
test_opencv.cpp然后保存并退出:#include#include #include 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 编译的 踩坑者,作者经历了 好几天反复尝试,踩了无数的坑,失败了无数次,才最终总结出这篇 完整且详细 的教程。
- 如果它对你有帮助,不妨点个赞支持一下,也欢迎留言交流你遇到的问题!

