编译安装opencv with cuda
JetPack预装的opencv没有启用cuda,需要自行编译安装。
一、1. 脚本一键安装
#!/bin/bash
##opencv_install.sh
#修改自https://github.com/AastaNV/JEP/blob/master/script/install_opencv4.10.0_Jetpack6.1.sh
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 :)"
二、2. 手动安装
2.1 卸载自带opencv
sudo apt-get purge libopencv*
sudo apt autoremove
sudo apt-get update
2.2 安装前置软件包
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
2.3 获取opencv源码(以4.10.0版本为例)
version=4.10.0
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}/"
2.4 编译源码
此步骤至少需要半小时以上。
中途可能会下载第三方软件包,建议提前确认网络环境。
mkdir build
cd build/
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)
2.5 安装
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
三、验证测试
#--test_cuda.cpp
#include <opencv2/opencv.hpp>
#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 (int i = 0; i < 50; i++) {
result = a * b;
}
}
// GPU 矩阵乘法
void gpu_matrix_mult(cv::cuda::GpuMat& d_a, cv::cuda::GpuMat& d_b, cv::cuda::GpuMat& d_result) {
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 << "--- OpenCV CUDA Matrix Multiplication Test ---\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;
}
}
编译运行
jetson@jetson-desktop:~/work$ g++ test_cuda.cpp -o test_cuda `pkg-config --cflags --libs opencv4`
jetson@jetson-desktop:~/work$ ./test_cuda
--- OpenCV CUDA Performance Test ---
Performance Results:
- CPU time: 2451 ms
- GPU time: 918 ms
- Speedup: 2.66993x
✅ CUDA performance test completed