OpenCV met CUDA

Introductie

OpenCV (Open Source Computer Vision Library) is een open-source softwarebibliotheek ontworpen voor computer vision en beeldverwerking. Het biedt honderden geoptimaliseerde algoritmen voor taken zoals beeld- en videoanalyse, objectdetectie, gezichtsherkenning, feature-extractie, camerakalibratie en 3D-reconstructie.

JetPack wordt geleverd met vooraf geïnstalleerd OpenCV op reComputer-apparaten, maar de standaardversie bevat geen CUDA-acceleratie. Dit betekent dat hoewel u OpenCV kunt gebruiken voor standaard beeldverwerking, GPU-versnelde functies (zoals cv::cuda::GpuMat-bewerkingen, DNN-inferentie of realtime videoverwerking) niet zullen profiteren van de GPU van de Jetson.

Door OpenCV vanaf de broncode te compileren met CUDA-ondersteuning, kunt u de GPU gebruiken voor veel computer vision-taken, wat de prestaties aanzienlijk verbetert voor:

  • Realtime videoverwerking (bijv. high-resolution camerastreams)
  • Deep learning-inferentie met behulp van de OpenCV DNN-module
  • Beeldtransformaties en filters die op de GPU kunnen worden geparalleliseerd
  • Computer vision-pipelines in robotica of autonome systemen, waar lage latentie en hoge doorvoer kritiek zijn

Dus, OpenCV compileren met CUDA op Jetson stelt u in staat om de GPU volledig te benutten voor versnelde computer vision-workloads, waardoor toepassingen sneller en efficiënter worden.

Deze tutorial begeleidt u stap voor stap bij het installeren van de versie van OpenCV die CUDA ondersteunt.

image-20250918172500287

Opmerking:De demo-omgeving is Jetpack 6.2

OpenCV compileren met CUDA

Stap 1. Verwijder de Python-pakketten en bibliotheekbestanden

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

Stap 2. Installeer de vereiste afhankelijkheidsbibliotheken voor het latere compilatieproces.

Opmerking:De volgende afhankelijkheden zijn voor het Jetpack 6.2 Ubuntu 22.04-systeem. De namen van afhankelijkheden in andere omgevingen kunnen anders zijn!

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

Stap 3. Download de officiële broncode.

Hier gebruiken we versie 4.10.0 van OpenCV en 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

Stap 4. OpenCV bouwen en installeren.

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 Het inschakelen van FFMPEG-ondersteuning stelt OpenCV in staat om verschillende videoformaten te lezen en schrijven (avi, mp4, mkv). Als het is uitgeschakeld, kunnen alleen MJPEG/RAW-videostreams worden geopend.

-DWITH_CUDA=ON CUDA-acceleratie inschakelen

-DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda Geef het CUDA-installatiepad op

-DCUDA_ARCH_BIN=8.7 Geef de rekencapaciteit van het aangewezen doel-GPU op. Verschillende modules worden hieronder in de tabel vermeld.

Jetson-modelGPU-architectuurSM-aantalRekencapaciteit (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

Geef het pad van Python3, headerbestanden en dynamische bibliotheken op. Als er een virtuele omgeving is geïnstalleerd, moet u dit wijzigen naar het pad van de compiler van uw eigen virtuele omgeving.

Tijdens het CMake-proces wordt wat configuratie-informatie weergegeven.

image-20250919151723696

Stap 5. Bouw het project en installeer.

bash
#Het compilatieproces kan even duren! Wacht alstublieft geduldig!
make -j4

5f2e3b7cb50af1e7c09fa111170bfd0d

bash
sudo make install

545c9f009141bf2d99fd8f37942328b4

Stap 6. Installatie verifiëren.

Nadat de installatie is voltooid, opent u jtop. U zult zien dat "opencv with cuda" is veranderd naar "yes".

bash
jtop

image-20250920135806440

Test of Python OpenCV succesvol kan importeren. Gebruik het volgende Python-testscript:

python
#python
import cv2
import numpy as np

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

# Controleren of OpenCV het CUDA-module heeft geïnstalleerd
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")

    # De GPU-versnellingsfunctie testen
    print("Creating test image...")
    img = (np.random.rand(1080, 1920, 3) * 255).astype("uint8")
    print("Test image shape:", img.shape)

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

    # Gaussiaanse vervaging op de GPU uitvoeren
    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)

    # Resultaat downloaden
    result = gpu_result.download()
    print("Gaussian blur completed on GPU!")
    print("Result shape:", result.shape)
    print("✅ OpenCV 4.10.0 met CUDA 12.6-ondersteuning werkt correct!")

else:
    print("❌ Geen CUDA-apparaat gevonden of OpenCV niet gebouwd met CUDA.")

98c824a91fa3d3d677206575085f34dc

Bronnen

https://github.com/opencv

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