CUDA支持的OpenCV

简介

**OpenCV(Open Source Computer Vision Library)**是一个开源软件库,专为计算机视觉和图像处理设计。它提供了数百种优化算法,用于图像和视频分析、目标检测、人脸识别、特征提取、相机校准和3D重建等任务。

JetPack在reComputer设备上预装了OpenCV,但默认版本不包含CUDA加速。这意味着虽然您可以将OpenCV用于标准图像处理,但GPU加速功能(如cv::cuda::GpuMat操作、DNN推理或实时视频处理)将不会受益于Jetson的GPU。

通过从源代码使用CUDA支持编译OpenCV,您可以利用GPU进行许多计算机视觉任务,这显著提高了以下方面的性能:

  • 实时视频处理(例如高分辨率摄像头流)
  • 使用OpenCV DNN模块进行深度学习推理
  • 可以在GPU上并行化的图像变换和滤镜
  • 机器 人或自主系统中的计算机视觉管道,低延迟和高吞吐量至关重要

因此,在Jetson上使用CUDA编译OpenCV使您能够充分利用GPU进行加速的计算机视觉工作负载,使应用程序更快、更高效。

本教程将逐步指导您如何安装支持CUDA的OpenCV版本。

image-20250918172500287

注意:演示环境为Jetpack 6.2

使用CUDA编译OpenCV

步骤1. 卸载Python包和库文件

bash
pip list | grep opencv
pip3 uninstall opencv-python
sudo apt purge libopencv*
sudo apt autoremove
sudo apt update

步骤2. 安装后续编译过程所需的依赖库。

注意:以下依赖项适用于Jetpack 6.2 Ubuntu 22.04系统。其他环境的依赖项名称可能不同!

bash
sudo apt install -y build-essential checkinstall cmake pkg-config yasm git gfortran
sudo apt update
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt install -y libjpeg8-dev libpng-dev libtiff5-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libv4l-dev libdc1394-dev libopenjp2-7-dev
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgtk2.0-dev libtbb-dev libatlas-base-dev libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev libxvidcore-dev libopencore-amrnb-dev libopencore-amrwb-dev x264 v4l-utils
sudo apt install -y \
  python3-dev python3-numpy \
  libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev \
  libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
  libxvidcore-dev libx264-dev libgtk-3-dev libcanberra-gtk3-dev \
  libatlas-base-dev gfortran

步骤3. 下载官方源代码。

这里我们使用OpenCV的4.10.0版本和OpenCV_contrib

image-20250920135447788

bash
wget https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip
unzip 4.10.0.zip
rm 4.10.0.zip
wget https://github.com/opencv/opencv_contrib/archive/refs/tags/4.10.0.zip
unzip 4.10.0.zip -d opencv-4.10.0/
cd opencv-4.10.0

步骤4. 构建并安装OpenCV。

bash
mkdir build 
cd build
export PATH=/usr/local/cuda-12.6/bin:$PATH && export LD_LIBRARY_PATH=/usr/local/cuda-12.6/lib64:$LD_LIBRARY_PATH 

cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_ENABLE_NONFREE=ON \
-DWITH_FFMPEG=ON \
-DWITH_CUDA=ON \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-12.6 \
-DCUDA_ARCH_BIN=8.7 \
-DCUDA_ARCH_PTX="" \
-DENABLE_FAST_MATH=ON \
-DCUDA_FAST_MATH=ON \
-DWITH_CUBLAS=ON \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DBUILD_opencv_python2=OFF \
-DBUILD_opencv_python3=ON \
-DPYTHON3_EXECUTABLE=$(which python3) \
-DPYTHON3_INCLUDE_DIR=$(python3 -c "from sysconfig import get_paths as gp; print(gp()['include'])") \
-DPYTHON3_LIBRARY=$(python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR') + '/libpython' + sysconfig.get_python_version() + '.so')") \
-DOPENCV_EXTRA_MODULES_PATH=/home/seeed/Downloads/opencv_contrib/modules \
..

-DWITH_FFMPEG=ON 启用FFMPEG支持使OpenCV能够读取和写入各种视频格式(avi、mp4、mkv)。如果关闭,则只能访问MJPEG/RAW视频流。

-DWITH_CUDA=ON 启用CUDA加速

-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda 指定CUDA安装路径

-DCUDA_ARCH_BIN=8.7 指定目标GPU的计算能力。不同的模块列在下表中。

Jetson型号GPU架构SM数量计算能力 (CUDA_ARCH_BIN)
Jetson NanoMaxwell1285.3
Jetson TX1Maxwell2565.3
Jetson TX2Pascal2566.2
Jetson Xavier NXVolta3847.2
Jetson AGX XavierVolta5127.2
Jetson Orin NanoAmpere5128.7
Jetson Orin NXAmpere10248.7
Jetson AGX OrinAmpere20488.7

-DPYTHON3_EXECUTABLE=$(which python3) -DPYTHON3_INCLUDE_DIR -DPYTHON3_LIBRARY

指定Python3、头文件和动态库的路径。如果安装了虚拟环境,需要将其修改为您自己的虚拟环境的编译器路径。

在CMake过程中,会显示一些配置信息。

image-20250919151723696

步骤5. 构建项目并安装。

bash
#编译过程可能需要一段时间!请耐心等待!
make -j4

5f2e3b7cb50af1e7c09fa111170bfd0d

bash
sudo make install

545c9f009141bf2d99fd8f37942328b4

步骤6. 验证安装。

安装完成后,打开jtop。您将看到"opencv with cuda"已变为"yes"。

bash
jtop

image-20250920135806440

测试Python是否能成功导入OpenCV。使用以下Python测试脚本:

python
#python
import cv2
import numpy as np

print("OpenCV version:", cv2.__version__)

# 检查OpenCV是否安装了CUDA模块
print("CUDA available in OpenCV:", cv2.cuda.getCudaEnabledDeviceCount() > 0)

if cv2.cuda.getCudaEnabledDeviceCount() > 0:
    print("Number of CUDA devices:", cv2.cuda.getCudaEnabledDeviceCount())
    cv2.cuda.setDevice(0)
    print("CUDA device set to 0")

    # 测试GPU加速功能
    print("Creating test image...")
    img = (np.random.rand(1080, 1920, 3) * 255).astype("uint8")
    print("Test image shape:", img.shape)

    # 上传到GPU
    gpu_img = cv2.cuda_GpuMat()
    gpu_img.upload(img)
    print("Image uploaded to GPU successfully!")

    # 在GPU上执行高斯模糊
    print("Performing Gaussian blur on GPU...")
    gaussian = cv2.cuda.createGaussianFilter(gpu_img.type(), gpu_img.type(), (15, 15), 0)
    gpu_result = gaussian.apply(gpu_img)

    # 下载结果
    result = gpu_result.download()
    print("Gaussian blur completed on GPU!")
    print("Result shape:", result.shape)
    print("✅ OpenCV 4.10.0 with CUDA 12.6 support is working correctly!")

else:
    print("❌ No CUDA device found or OpenCV not built with CUDA.")

98c824a91fa3d3d677206575085f34dc

资源

https://github.com/opencv

https://docs.opencv.org/4.10.0/d2/dbc/cuda_intro.html