跳转到主要内容

编译安装opencv with cuda

JetPack预装的opencv没有启用cuda,需要自行编译安装。

image.png

一、脚本一键安装


#!/bin/bash
#



version="4.10.0"
folder="workspace"


set -e



for arg in "$@"; do
    case $arg in
        --version=*)
            version="${arg#*=}"
            ;;
        --folder=*)
            folder="${arg#*=}"
            ;;
        --help|-h)
            echo "用法: $0 [--version=4.x.x] [--folder=dir]"
            exit 0
            ;;
        *)
            echo "未知参数: $arg"
            echo "用法: $0 [--version=4.x.x] [--folder=dir]"
            exit 1
            ;;
    esac
done


# 交互式移除旧 OpenCV
while true; do
    echo "Do you want to remove the default OpenCV (yes/no)?"
    read rm_old
    if [ "$rm_old" = "yes" ]; then
        echo "** Remove other OpenCV first"
        sudo apt -y purge *libopencv*
        break
    elif [ "$rm_old" = "no" ]; then
        break
    fi
done



echo "------------------------------------"
echo "** Install requirement (1/4)"
echo "------------------------------------"
sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev python3.10-dev python3-numpy
sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libv4l-dev v4l-utils qv4l2
sudo apt-get install -y curl



echo "------------------------------------"
echo "** Download opencv "${version}" (2/4)"
echo "------------------------------------"
mkdir $folder
cd ${folder}


wget -O opencv-${version}.zip https://github.com/opencv/opencv/archive/${version}.zip
wget -O opencv_contrib-${version}.zip https://github.com/opencv/opencv_contrib/archive/${version}.zip
unzip opencv-${version}.zip
unzip opencv_contrib-${version}.zip
rm opencv-${version}.zip opencv_contrib-${version}.zip
cd opencv-${version}/



echo "------------------------------------"
echo "** Build opencv "${version}" (3/4)"
echo "------------------------------------"
mkdir release
cd release/
cmake -D WITH_CUDA=ON -D WITH_CUDNN=ON -D CUDA_ARCH_BIN="8.7" -D CUDA_ARCH_PTX="" -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${version}/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j$(nproc)



echo "------------------------------------"
echo "** Install opencv "${version}" (4/4)"
echo "------------------------------------"
sudo make install
echo 'export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PYTHONPATH=/usr/local/lib/python3.10/site-packages/:$PYTHONPATH' >> ~/.bashrc
source ~/.bashrc



echo "** Install opencv "${version}" successfully"
echo "** Bye :)"

二、手动安装

卸载自带opencv

sudo apt-get purge libopencv*
sudo apt autoremove
sudo apt-get update


三、验证测试

#

#--test_cuda.cpp

Install#include minimal<opencv2/opencv.hpp>
prerequisites#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
#include <iostream>
#include <chrono>

// CPU 矩阵乘法
void cpu_matrix_mult(cv::Mat& a, cv::Mat& b, cv::Mat& result) {
    for (Ubuntuint 18.04i as= reference)
sudo0; apti update< &50; i++) {         result = a * b;     } } // GPU 矩阵乘法 void gpu_matrix_mult(cv::cuda::GpuMat& sudod_a, apt install -y cmake g++ wget unzip

# Download and unpack sources
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.x.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.x.zip
unzip opencv.zip
unzip opencv_contrib.zip

# Create build directory and switch into it
mkdir -p build &cv::cuda::GpuMat& cdd_b, build

cv::cuda::GpuMat&

#d_result) Configure
cmake{     cv::cuda::Stream stream;          for (int i = 0; i < 50; i++) {         cv::cuda::gemm(d_a, d_b, 1.0, cv::cuda::GpuMat(), 0, d_result, 0, stream);         stream.waitForCompletion();     } } int main() {     try {         std::cout << "-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.x/modules-- ../opencv-4.x

OpenCV

#CUDA Build
cmakeMatrix Multiplication Test --build-\n";                  // 创建两个 1000x1000 的随机矩阵         cv::Mat mat_a(1000, 1000, CV_32FC1);         cv::Mat mat_b(1000, 1000, CV_32FC1);         cv::randu(mat_a, 0.0f, 1.0f);         cv::randu(mat_b, 0.0f, 1.0f);                  cv::Mat cpu_result;                  // CPU 测试         auto start_cpu = std::chrono::high_resolution_clock::now();         cpu_matrix_mult(mat_a, mat_b, cpu_result);         auto end_cpu = std::chrono::high_resolution_clock::now();         double cpu_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_cpu - start_cpu).

count();                  // GPU 测试         cv::cuda::GpuMat d_mat_a, d_mat_b, d_result;         d_mat_a.upload(mat_a);         d_mat_b.upload(mat_b);                  auto start_gpu = std::chrono::high_resolution_clock::now();         gpu_matrix_mult(d_mat_a, d_mat_b, d_result);         auto end_gpu = std::chrono::high_resolution_clock::now();         double gpu_time = std::chrono::duration_cast<std::chrono::milliseconds>(end_gpu - start_gpu).count();                  // 下载结果进行验证         cv::Mat gpu_result;         d_result.download(gpu_result);                  // 计算误差(一般为空)         double diff = cv::norm(cpu_result, gpu_result, cv::NORM_L2);         std::cout << "Result difference: " << diff << "\n";                  std::cout << "Performance Results:\n"                   << " - CPU time: " << cpu_time << " ms\n"                   << " - GPU time: " << gpu_time << " ms\n"                   << " - Speedup: " << cpu_time / gpu_time << "x\n";                  std::cout << "\n✅ CUDA matrix multiplication test completed\n";         return 0;              } catch (const cv::Exception& e) {         std::cerr << "OpenCV Error (" << e.err << "): " << e.what() << "\n";         return -1;     } catch (const std::exception& e) {         std::cerr << "Standard Error: " << e.what() << "\n";         return -2;     } }

编译安装opencv运行

测试

g++ 

test_cuda.cpp -o test_cuda `pkg-config --cflags --libs opencv4` ./test_cuda