引言必看
video sdk目前不支持jetson,我也不知道为啥官方给了aarch64的so占位符,到底为了证明什么,搞jetson且想用硬解码解析视频的下伙伴可以不用看了

https://github.com/NVIDIA/VideoProcessingFramework/pull/515

在这里插入图片描述

https://github.com/opencv/opencv_contrib/issues/3840

在这里插入图片描述

opencv安装包下载地址:

https://github.com/opencv/opencv/

扩展库下载地址:

https://github.com/opencv/opencv_contrib

以下是我的目录结构:

/home/jetson/nvidia-codec/
├── nv-codec-headers/
├── Video_Codec_SDK_12.0.16/
│   ├── Doc/
│   ├── Interface/
│   │   ├── cuviddec.h
│   │   ├── nvcuvid.h
│   │   └── nvEncodeAPI.h
│   └── Lib/
│       ├── linux/
│       │   ├── stubs/
│       │   │   ├── aarch64/
│       │   │   │   ├── libnvcuvid.so
│       │   │   │   └── libnvidia-encode.so
│       │   │   ├── ppc64le/
│       │   │   │   ├── libnvcuvid.so
│       │   │   │   └── libnvidia-encode.so
│       │   │   └── x86_64/
│       │   │       ├── libnvcuvid.so
│       │   │       └── libnvidia-encode.so
│       │   ├── Win32/
│       │   └── x64/
├── ffmpeg/
├── opencv-4.10.0/
│   ├── build/
│   └── install/
│       ├── bin/
│       ├── include/
│       ├── lib/
│       └── share/
└── opencv_contrib-4.10.0/
    └── modules/

**注意
经过实测,发现可以不用安装ffmpeg的video cuda sdk版本也可以使用opencv的video cuda sdk的,但是不安装的话,直接使用ffmpeg就使用不了cuda,ffmpeg版本的cuda video sdk依赖于valkan0

0.软件安装

0.1安装ffmpeg(参考官方文档)

sudo  apt  -y remove ffmpeg

Clone ffnvcodec

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

Install ffnvcodec

cd nv-codec-headers && sudo make install && cd  ..

Clone FFmpeg’s public GIT repository.

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/

Install necessary packages.

sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev

Configure

./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared

Compile

make -j8

Install the libraries.

sudo make install
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

0.2 安装nvidia-video-codec-sdk

(1) 查看当前 JetPack 版本对应的驱动版本

JetPack 是 NVIDIA 提供的 SDK,包含了操作系统、驱动、库和开发工具。每个 JetPack 版本都固定包含一组驱动程序。

以下是部分 JetPack 版本与 NVIDIA 驱动版本的对应关系:

JetPack Version Driver Version L4T Version
JetPack 5.1.2 525.x L4T 35.4.1
JetPack 5.1.1 525.x L4T 35.3.1
JetPack 5.1 525.x L4T 35.2.1
JetPack 5.0.2 515.x L4T 35.1.0
JetPack 4.6.4 32.x L4T 32.7.4
JetPack 4.6 32.x L4T 32.6.1

说明

驱动版本 470.57.02 属于 JetPack 4.x 系列的范畴。
如果你需要更高版本的驱动(例如 525.x),需要升级到 JetPack 5.x 系列。

我的设备的截图如下

在这里插入图片描述

可以看到我的设备是jetpack-5.1.2的,对应525.x的英伟达显卡驱动

(2) Video_Codec_SDK下载以及安装

nvidia-video-codec-sdk下载链接如下:

https://developer.nvidia.com/nvidia-video-codec-sdk/download

我下载的是Video_Codec_SDK_12.0.16,根据文件夹里面的Read_Me.pdf描述如下:
在这里插入图片描述

可以看到

‣ Linux: Driver version 520.56.06 or higher
‣ CUDA 11.0 or higher Toolkit

这样的系统要求就符合我们刚jtop看到的

下载安装包解压后分别把头文件和动态库copy到你的cuda目录,比如:/usr/local/cuda/include , /usr/local/cuda/lib64
如果include目录下存在dynlink_cuviddec.h dynlink_loader.h dynlink_nvcuvid.h等头文件,则一定要删除;

进入下载的Video_Codec_SDK目录,执行以下代码:

sudo cp -r ./Interface/cuviddec.h /usr/local/cuda/include
sudo cp -r ./Interface/nvcuvid.h /usr/local/cuda/include
sudo cp -r ./Interface/nvEncodeAPI.h /usr/local/cuda/include
sudo cp -r ./Lib/linux/stubs/aarch64/libnvcuvid.so   /usr/local/cuda/lib64
sudo cp -r ./Lib/linux/stubs/aarch64/libnvidia-encode.so   /usr/local/cuda/lib64
sudo rm -rf /usr/local/cuda/lib64/libnvcuvid.so.1
sudo ln -sf /usr/local/cuda/lib64/libnvcuvid.so /usr/local/cuda/lib64/libnvcuvid.so.1
sudo rm -rf /usr/local/cuda/lib64/libnvidia-encode.so.1
sudo ln -sf /usr/local/cuda/lib64/libnvidia-encode.so /usr/local/cuda/lib64/libnvidia-encode.so.1

1. 删除jetpack包中的opencv版本

原先的opencv库安装在目录/usr/lib/aarch64-linux-gnu/下(一般其他的第三方库也都安装在该目录下),首先将该目录下所有的libopencv*库删除:

sudo rm /usr/lib/aarch64-linux-gnu/libopencv*

再删除/usr/lib/aarch64-linux-gnu/pkgconfig/目录下的opencv.pc文件,如果是opencv4.X版本的,则为opencv4.pc,使用命令删除该文件:

sudo rm /usr/lib/aarch64-linux-gnu/pkgconfig/opencv*

再删除/usr/share/目录下的opencv文件夹

sudo rm -r /usr/share/opencv*

再删除/usr/include/目录下的头文件文件夹opencv

sudo rm -r /usr/include/opencv*

再删除/usr/bin/目录下的应用程序

sudo rm /usr/bin/opencv*

至此,jetpack包中的opencv已全部删除。

2. 删除手动安装包中的opencv版本

sudo apt-get remove --purge libopencv* python3-opencv
sudo rm -rf /usr/local/lib/libopencv_*
sudo rm -rf /usr/local/lib/pkgconfig/opencv4.pc
sudo rm -rf /usr/local/include/opencv*
sudo rm -rf /usr/local/bin/opencv_*

3. 安装依赖以及编译

CUDA_ARCH_BIN是GPU的算力等级,根据自己的显卡型号在NVIDIA官网查看。

https://developer.nvidia.com/cuda-gpus

jetson orin nano

我的设备是jetson orin nano,所以我选的是8.7。

一键编译脚本build-opencv.sh,将这个脚本放在下载的opencv同级目录:

#!/bin/bash

sudo apt-get update

sudo apt install -y \
    build-essential \
    pkg-config \
    libgtk2.0-dev \
    libavcodec-dev \
    libavformat-dev \
    libswscale-dev \
    libv4l-dev \
    libxvidcore-dev \
    libx264-dev \
    libjpeg-dev \
    libtiff5-dev \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    libvtk7-dev \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev \
    libjpeg8-dev \
    libpng-dev \
    libdc1394-22-dev \
    libxine2-dev \
    libtbb-dev \
    libatlas-base-dev \
    libfaac-dev \
    libmp3lame-dev \
    libtheora-dev \
    libvorbis-dev \
    libopencore-amrnb-dev \
    libopencore-amrwb-dev \
    x264 \
    v4l-utils \
    libtbb2

# 设置工作目录
BASE_DIR=$(pwd)
OPENCV_DIR="${BASE_DIR}/opencv-4.10.0"
INSTALL_DIR="${OPENCV_DIR}/install"
BUILD_DIR="${OPENCV_DIR}/build"
CONTRIB_DIR="${BASE_DIR}/opencv_contrib-4.10.0"

# 创建安装和构建目录
mkdir -p "${INSTALL_DIR}"
mkdir -p "${BUILD_DIR}"

# 进入构建目录
cd "${BUILD_DIR}"

# 运行 CMake
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX="${INSTALL_DIR}" \
-D OPENCV_EXTRA_MODULES_PATH="${CONTRIB_DIR}/modules" \
-D WITH_LIBV4L=ON \
-D CUDA_ARCH_BIN=8.7 \
-D WITH_CUDA=ON \
-D WITH_CUDACODEC=ON \
-D BUILD_opencv_cudacodec=ON \
-D OPENCV_DNN_CUDA=ON \
-D WITH_CUFFT=ON \
-D WITH_IPP=ON \
-D WITH_EIGEN=ON \
-D CUDA_SDK_ROOT_DIR=/usr/local/cuda \
-D CUDNN_LIBRARY=/usr/lib/aarch64-linux-gnu/libcudnn.so.8 \
-D CUDNN_INCLUDE_DIR=/usr/include \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=ON \
-D WITH_NVCUVID=ON \
-D WITH_TBB=ON \
-D WITH_OPENMP=ON \
-D WITH_OPENGL=ON \
-D ENABLE_CXX11=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D CUDA_nppi_LIBRARY=true \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D ENABLE_PRECOMPILED_HEADERS=OFF \
-D WITH_GSTREAMER=ON \
-D WITH_FFMPEG=ON ..

# 编译
make -j$(nproc)  # 调整为根据实际CPU核心数选择合适的线程数
make install

3.1 更新系统依赖库

sudo apt-get update
sudo apt-get install -y \
    build-essential \
    pkg-config \
    libgtk2.0-dev \
    libavcodec-dev \
    libavformat-dev \
    libswscale-dev \
    libv4l-dev \
    libxvidcore-dev \
    libx264-dev \
    libjpeg-dev \
    libtiff5-dev \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    libvtk7-dev \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev \
    libjpeg8-dev \
    libpng-dev \
    libdc1394-22-dev \
    libxine2-dev \
    libtbb-dev \
    libatlas-base-dev \
    libfaac-dev \
    libmp3lame-dev \
    libtheora-dev \
    libvorbis-dev \
    libopencore-amrnb-dev \
    libopencore-amrwb-dev \
    x264 \
    v4l-utils \
    libtbb2

3.2 创建编译build目录以及运行 CMake

cd  opencv-4.10.0 && mkdir build && mkdir install && cd build
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/home/jetson/opencv-4.10.0/install \
-D OPENCV_EXTRA_MODULES_PATH=/home/jetson/opencv_contrib-4.10.0/modules \
-D WITH_LIBV4L=ON \
-D CUDA_ARCH_BIN=8.7 \
-D WITH_CUDA=ON \
-D WITH_CUDACODEC=ON \
-D BUILD_opencv_cudacodec=ON \
-D OPENCV_DNN_CUDA=ON \
-D WITH_CUFFT=ON \
-D WITH_IPP=ON \
-D WITH_EIGEN=ON \
-D CUDA_SDK_ROOT_DIR=/usr/local/cuda \
-D CUDNN_LIBRARY=/usr/lib/aarch64-linux-gnu/libcudnn.so.8 \
-D CUDNN_INCLUDE_DIR=/usr/include \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=ON \
-D WITH_NVCUVID=ON \
-D WITH_TBB=ON \
-D WITH_OPENMP=ON \
-D WITH_OPENGL=ON \
-D ENABLE_CXX11=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D CUDA_nppi_LIBRARY=true \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D ENABLE_PRECOMPILED_HEADERS=OFF \
-D WITH_GSTREAMER=ON \
-D WITH_FFMPEG=ON ..

*注意
cmake之后一定要看到

--   NVIDIA CUDA:                   YES (ver 11.4, CUFFT CUBLAS NVCUVID NVCUVENC FAST_MATH)

里面要有NVCUVID 才行。不然就属于失败
NVCUVID

3.3 开始编译以及生成库

make -j4 && make install

3.4 opencv库的安装

命令执行结束,在install生成库文件,我的文件夹结构为:

/home/jetson/nvidia-codec/
├── opencv-4.10.0
│   ├── build
│   └── install
│       ├── bin
│       ├── include
│       ├── lib
│       └── share
└── opencv_contrib-4.10.0
    └── modules

下面开始将库文件拷贝到系统目录,在install目录下打开终端,分别执行以下命令:

(1)修改opencv-4.10.0/install/lib/pkgconfig/opencv4.pc

vim lib/pkgconfig/opencv4.pc

原始的:

# Package Information for pkg-config

prefix=/home/jetson/opencv-4.10.0/install
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.10.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cudabgsegm -lopencv_cudafeatures2d -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_signal -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_cudacodec -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_cudaoptflow -lopencv_optflow -lopencv_cudalegacy -lopencv_videoio -lopencv_cudawarping -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_imgproc -lopencv_cudaarithm -lopencv_core -lopencv_cudev
Libs.private: -lm -lpthread -lcudart_static -ldl -lrt -lnppc -lnppial -lnppicc -lnppidei -lnppif -lnppig -lnppim -lnppist -lnppisu -lnppitc -lnpps -lcublas -lcudnn -lcufft -L-L/usr/local/cuda-11.4 -llib64 -L-L/usr/lib -laarch64-linux-gnu
Cflags: -I${includedir}

新的:

# Package Information for pkg-config

prefix=prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.10.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cudabgsegm -lopencv_cudafeatures2d -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_signal -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_cudacodec -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_cudaoptflow -lopencv_optflow -lopencv_cudalegacy -lopencv_videoio -lopencv_cudawarping -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_imgproc -lopencv_cudaarithm -lopencv_core -lopencv_cudev
Libs.private: -lm -lpthread -lcudart_static -ldl -lrt -lnppc -lnppial -lnppicc -lnppidei -lnppif -lnppig -lnppim -lnppist -lnppisu -lnppitc -lnpps -lcublas -lcudnn -lcufft -L-L/usr/local/cuda-11.4 -llib64 -L-L/usr/lib -laarch64-linux-gnu
Cflags: -I${includedir}

(2)将 bin 文件夹复制到 /usr/local

sudo cp -r bin/* /usr/local/bin/

(3)将 include 文件夹复制到 /usr/local/include

sudo cp -r include/* /usr/local/include/

(4)将 lib 文件夹复制到 /usr/local/lib

sudo mv lib/python3.8/site-packages    lib/python3.8/dist-packages 
sudo cp -r lib/* /usr/local/lib/

(5)将 share 文件夹复制到 /usr/local/share

sudo cp -r share/* /usr/local/share/

4. 将OpenCV的库添加到系统路径

4.1 方法一:配置ld.so.conf文件

sudo vim /etc/ld.so.conf

在文件中加上一行

include /usr/local/lib

这个路径是cmake编译时填的动态库安装路径加上/lib

配置ld.so.conf文件

4.2 方法二:手动生成opencv.conf文件

sudo vim /etc/ld.so.conf.d/opencv.conf

是一个新建的空文件,直接添加路径,同理这个路径是cmake编译时填的动态库安装路径加上/lib

/usr/local/lib

4.3 应用配置更新

以上两种方法配置好后,执行如下命令使得配置的路径生效

sudo ldconfig

配置系统bash
因为在cmake时,选择了自动生成OpenCV的pkgconfig文件,在/usr/local/lib/pkgconfig路径可以看到文件opencv4.pc

确保文件存在,执行如下命令

sudo vim /etc/bash.bashrc

在文末添加

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

如下:

bash.bashrc

保存退出,然后执行如下命令使配置生效

source /etc/bash.bashrc
echo 'export CPLUS_INCLUDE_PATH=/usr/local/include/opencv:/usr/local/include/opencv4:$CPLUS_INCLUDE_PATH' >> ~/.bashrc
echo 'export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

至此,Linux\Ubuntu18.04环境下OpenCV的安装以及配置已经全部完成,可以使用以下命令查看是否安装和配置成功

pkg-config --modversion opencv4
pkg-config --cflags opencv4
pkg-config --libs opencv4

最后添加软链接,确保C++编译没问题:

sudo mv /usr/local/include/opencv4  /usr/local/include/opencv
sudo ln -s /usr/local/include/opencv/opencv2   /usr/local/include/opencv2
sudo ln -s /usr/local/include/opencv/opencv2   /usr/local/include/opencv4

安装jtop,也可查看:

sudo -H pip3 install -U jetson-stats

以下是我的jtop截图
jtop

我编译的install可以在这里下载:

https://download.csdn.net/download/weixin_43269994/90024750

下面是一键安装install.sh,将这个脚本放在install目录直接执行即可

#!/bin/bash

# 定义一个函数来执行带有密码的sudo命令
sudo_with_password() {
    echo "nvidia" | sudo -S "$@"
}


sudo_with_password rm -rf /usr/lib/python3/dist-packages/OpenSSL
# 安装 Python 依赖项
echo "Installing Python dependencies..."
pip install numpy==1.23.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
sudo_with_password  pip uninstall -y opencv-python
pip install pyOpenSSL -i https://pypi.tuna.tsinghua.edu.cn/simple
 


# 更新软件包列表
echo "Updating package list..."
sudo_with_password apt-get -y update


sudo_with_password -H pip3 install -U jetson-stats


# 删除JetPack中的OpenCV版本
echo "Deleting JetPack OpenCV version..."
sudo_with_password rm -f /usr/lib/aarch64-linux-gnu/libopencv*
sudo_with_password rm -f /usr/lib/aarch64-linux-gnu/pkgconfig/opencv*
sudo_with_password rm -rf /usr/share/opencv*
sudo_with_password rm -rf /usr/include/opencv*

# 删除手动安装的OpenCV版本
echo "Deleting manually installed OpenCV version..."
sudo_with_password apt-get remove --purge -y libopencv* python3-opencv
sudo_with_password rm -rf /usr/local/lib/libopencv_*
sudo_with_password rm -rf /usr/local/lib/pkgconfig/opencv4.pc
sudo_with_password rm -rf /usr/local/include/opencv*
sudo_with_password rm -rf /usr/local/bin/opencv_*

echo "OpenCV has been completely removed."

# 安装编译依赖项
echo "Installing dependencies for building OpenCV..."
sudo_with_password apt-get install -y \
    build-essential \
    pkg-config \
    libgtk2.0-dev \
    libavcodec-dev \
    libavformat-dev \
    libswscale-dev \
    libv4l-dev \
    libxvidcore-dev \
    libx264-dev \
    libjpeg-dev \
    libtiff5-dev \
    gstreamer1.0-plugins-base \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-bad \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    libvtk7-dev \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev \
    libjpeg8-dev \
    libpng-dev \
    libdc1394-22-dev \
    libxine2-dev \
    libtbb-dev \
    libatlas-base-dev \
    libfaac-dev \
    libmp3lame-dev \
    libtheora-dev \
    libvorbis-dev \
    libopencore-amrnb-dev \
    libopencore-amrwb-dev \
    x264 \
    v4l-utils \
    libtbb2




# 假设接下来的操作是为了将新编译或下载的OpenCV文件移动到正确的位置
# 注意:这里假设了 'bin', 'include' 和 'lib' 目录已经存在并包含了正确的文件
echo "Copying new OpenCV files to system directories..."
sudo_with_password cp -r bin/* /usr/local/bin/
sudo_with_password cp -r include/* /usr/local/include/
sudo_with_password cp -r lib/* /usr/local/lib/
sudo_with_password cp -r lib/*.so /usr/local/lib/

# 检查并移动 Python 包目录
if [ -d "lib/python3.8/site-packages" ]; then
    echo "Moving site-packages to dist-packages..."
    sudo_with_password mv lib/python3.8/site-packages lib/python3.8/dist-packages
fi

# 创建符号链接以便兼容性
sudo_with_password mv /usr/local/include/opencv4 /usr/local/include/opencv
sudo_with_password ln -s /usr/local/include/opencv/opencv2 /usr/local/include/opencv2
sudo_with_password ln -s /usr/local/include/opencv/opencv2 /usr/local/include/opencv4
sudo_with_password ldconfig
echo "OpenCV installation preparation complete."

4.4 cuda-opencv 样例

4.4.1 GPU读流的操作

具体读流函数如下所示:
opencv的gpu读取的视频

import cv2
def main(file_path):
    cap = cv2.cudacodec.createVideoReader(file_path) 
    while True:
        ret, frame = cap.nextFrame()
        if ret is False:
            break
        cv2.imshow('image', frame)
        cv2.waitKey(1)
    cap.release()
if __name__ == '__main__':
    file_path = 'test.mp4'
    main(file_path)

opencv的gpu读取的rtsp

import cv2

if __name__ == '__main__':
	rtsp_url = 'rtsp://admin:1aaaaa@192.168.1.12/'
	decoder = cv2.cudacodec.createVideoReader(rtsp_url)
	#不设置的化默认是BGRA,为了方便后续处理,指定为BGR
	decoder.set(cv2.cudacodec.COLOR_FORMAT_BGR)
	count = 0
	while True:
		ret,gpu_frame = decoder.nextFrame()
		if ret :
			frame = gpu_frame.download()
			if count == 0 :
				cv2.imwrite('test_img.bmp', frame)
			frame_queue.append(np.array(frame[:, :, ::-1]))
			count += 1

图片的格式位GpuMat格式,并且为BGRA的格式,需要用自带的颜色转换cv2.cvtColor转换为BGR的格式,该函数在GPU中也有相应的函数可以直接转换,就不用再下载打cpu端进行操作。并且如果需要下载到CPU进行操作的话,就需要download,例如frame.download。

4.4.2 GpuMat的图像的copyTo

在python端如果进行GpuMat的拼接覆盖操作的话,必须用到copyTo操作,这个操作需要从原图之中扣出来一块区域,并且和原图指向同一个地址,这样子区域的改变才能够影响的原图,如果直接用=或者GpuMat赋值操作的话,则和原图的地址不同了,不能进行相应的操作。
具体的代码如下

import cv2
import numpy as np

def main():
    # 创建两个GpuMat的矩阵
    gpu_frame1 = cv2.cuda_GpuMat()
    gpu_frame2 = cv2.cuda_GpuMat()
    # 将图片1上传到GPUGpuMat中
    image1 = cv2.imread('./1.png')
    image1 = cv2.resize(image1, (640, 640))
    gpu_frame1.upload(image1)
    # 从图片1左上角获得一个320×320
    src_roi = gpu_frame1.rowRange(0, 320).colRange(0, 320)
    # 将图片2上传到GPUGpuMat中
    image2 = cv2.imread('./2.png')
    image2 = cv2.resize(image2, (320, 320))
    gpu_frame2.upload(image2)
    # 将图片2覆盖到从图片1中获得的区域
    gpu_frame2.copyTo(src_roi)
    # 将两个图片下载到CPU端
    img1 = gpu_frame1.download()
    img2 = gpu_frame2.download()
    cv2.imwrite('1_1.jpg', img1)
    cv2.imwrite('1_2.jpg', img2)
if __name__ == '__main__':
    main()

更多推荐