OpenCV con CUDA

Introducción

OpenCV (Open Source Computer Vision Library) es una biblioteca de software de código abierto diseñada para visión artificial y procesamiento de imágenes. Proporciona cientos de algoritmos optimizados para tareas como análisis de imágenes y video, detección de objetos, reconocimiento facial, extracción de características, calibración de cámaras y reconstrucción 3D.

JetPack viene con OpenCV preinstalado en los dispositivos reComputer, pero la versión predeterminada no incluye aceleración CUDA. Esto significa que aunque puede usar OpenCV para procesamiento de imágenes estándar, las funciones aceleradas por GPU (como operaciones cv::cuda::GpuMat, inferencia DNN o procesamiento de video en tiempo real) no se beneficiarán de la GPU del Jetson.

Al compilar OpenCV desde el código fuente con soporte CUDA, puede aprovechar la GPU para muchas tareas de visión artificial, lo que mejora significativamente el rendimiento para:

  • Procesamiento de video en tiempo real (por ejemplo, transmisiones de cámara de alta resolución)
  • Inferencia de aprendizaje profundo usando el módulo DNN de OpenCV
  • Transformaciones de imagen y filtros que pueden paralelizarse en la GPU
  • Pipelines de visión artificial en robótica o sistemas autónomos, donde la baja latencia y el alto rendimiento son críticos

Por lo tanto, compilar OpenCV con CUDA en Jetson le permite utilizar completamente la GPU para cargas de trabajo de visión artificial aceleradas, haciendo que las aplicaciones sean más rápidas y eficientes.

Este tutorial le guiará paso a paso sobre cómo instalar la versión de OpenCV que soporta CUDA.

image-20250918172500287

Nota:El entorno de demostración es Jetpack 6.2

Compilar OpenCV con CUDA

Paso 1. Desinstale los paquetes de Python y los archivos de biblioteca

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

Paso 2. Instale las bibliotecas de dependencias requeridas para el proceso de compilación posterior.

Nota:¡Las siguientes dependencias son para el sistema Jetpack 6.2 Ubuntu 22.04. ¡Los nombres de las dependencias en otros entornos pueden ser diferentes!

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

Paso 3. Descargue el código fuente oficial.

Aquí, estamos usando la versión 4.10.0 de OpenCV y 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

Paso 4. Compile e instale 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 Habilitar el soporte de FFMPEG permite a OpenCV leer y escribir varios formatos de video (avi, mp4, mkv). Si está desactivado, solo se puede acceder a transmisiones de video MJPEG/RAW.

-DWITH_CUDA=ON Habilitar aceleración CUDA

-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda Especificar la ruta de instalación de CUDA

-DCUDA_ARCH_BIN=8.7 Especificar la capacidad de cómputo de la GPU objetivo designada. Diferentes módulos se enumeran en la tabla a continuación.

Modelo JetsonArquitectura GPUSM CountCapacidad de Cómputo (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

Especifique la ruta de Python3, archivos de encabezado y bibliotecas dinámicas. Si hay un entorno virtual instalado, necesita modificarlo a la ruta del compilador de su propio entorno virtual.

Durante el proceso de CMake, se muestra cierta información de configuración.

image-20250919151723696

Paso 5. Compile el proyecto e instale.

bash
#¡El proceso de compilación puede llevar un tiempo! ¡Por favor espere con paciencia!
make -j4

5f2e3b7cb50af1e7c09fa111170bfd0d

bash
sudo make install

545c9f009141bf2d99fd8f37942328b4

Paso 6. Verificar la instalación.

Después de completar la instalación, abra jtop. Verá que "opencv with cuda" ha cambiado a "yes".

bash
jtop

image-20250920135806440

Pruebe si Python puede importar OpenCV exitosamente. Use el siguiente script de prueba de Python:

python
#python
import cv2
import numpy as np

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

# Verificar si OpenCV tiene el módulo CUDA instalado
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")

    # Probar la función de aceleración GPU
    print("Creating test image...")
    img = (np.random.rand(1080, 1920, 3) * 255).astype("uint8")
    print("Test image shape:", img.shape)

    # Subir a GPU
    gpu_img = cv2.cuda_GpuMat()
    gpu_img.upload(img)
    print("Image uploaded to GPU successfully!")

    # Realizar desenfoque gaussiano en la 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)

    # Descargar resultado
    result = gpu_result.download()
    print("Gaussian blur completed on GPU!")
    print("Result shape:", result.shape)
    print("✅ ¡OpenCV 4.10.0 con soporte CUDA 12.6 está funcionando correctamente!")

else:
    print("❌ No se encontró dispositivo CUDA o OpenCV no fue compilado con CUDA.")

98c824a91fa3d3d677206575085f34dc

Recursos

https://github.com/opencv

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