一、opencv的子库
0. 安装RKMPP
git clone https://github.com/rockchip-linux/mpp
cd mpp/build/linux/aarch64
./make-Makefiles.bash
make -j$(nproc)
sudo make install
RKMPP:用于编解码测试,支持RK3588平台。
1. 安装x264
git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --prefix=/usr/local/x264 --disable-opencl --enable-static --enable-shared
make -j$(nproc)
sudo make install
配置环境变量:
echo 'export PKG_CONFIG_PATH="/usr/local/x264/lib/pkgconfig:$PKG_CONFIG_PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/x264/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc
创建x264配置文件:
sudo nano /etc/ld.so.conf.d/x264.conf
# 添加以下内容
/usr/local/x264/lib
2. 安装x265
git clone https://bitbucket.org/multicoreware/x265_git.git
cd x265_git
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/x265 -DENABLE_SHARED=ON source
make -j$(nproc)
sudo make install
配置环境变量:
echo 'export PKG_CONFIG_PATH="/usr/local/x265/lib/pkgconfig:$PKG_CONFIG_PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/x265/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc
创建x265配置文件:
sudo vim /etc/ld.so.conf.d/x265.conf
# 添加以下内容
/usr/local/x265/lib
3. 安装libdrm
wget https://dri.freedesktop.org/libdrm/libdrm-2.4.89.tar.bz2
tar -jxvf libdrm-2.4.89.tar.bz2
cd libdrm-2.4.89
sed -i 's/drm_private uint32_t nouveau_debug;/drm_private extern uint32_t nouveau_debug;/' nouveau/private.h
./configure --prefix=/usr/local/libdrm --host=aarch64-linux-gnu
make -j$(nproc)
sudo make install
4. 安装FFmpeg
4.1 不同版本安装
4.1.1官方版本(没有h263_rkmpp、mpeg1_rkmpp、mpeg2_rkmpp、mpeg4_rkmpp、hevc_rkmpp)
git clone https://git.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure --prefix=/usr/local/ffmpeg --enable-version3 --enable-libdrm --enable-rkmpp --enable-libx264 --enable-nonfree --enable-gpl --enable-shared
make -j$(nproc)
sudo make install
4.1.2 特殊版本(h263_rkmpp、h264_rkmpp、mpeg1_rkmpp、mpeg2_rkmpp、mpeg4_rkmpp、hevc_rkmpp、vp8_rkmpp、vp9_rkmpp)
git clone --depth=1 https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
cd ffmpeg-rockchip
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-pthreads --extra-libs=-lpthread \
--disable-asm --disable-x86asm --disable-inline-asm \
--enable-decoder=aac --enable-decoder=aac_fixed --enable-decoder=aac_latm --enable-encoder=aac \
--enable-libx264 --enable-libx265 \
--enable-version3 --enable-libdrm --enable-rkmpp --enable-shared --pkg-config-flags='--static'
make -j$(nproc)
sudo make install
4.2 配置环境变量
为了让系统正确识别FFmpeg,设置路径和库路径:
echo 'export PATH="/usr/local/ffmpeg/bin:$PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/ffmpeg/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
source ~/.bashrc
4.3 配置系统库
更新系统库配置,确保新安装的库文件能被识别:
sudo vim /etc/ld.so.conf
# 添加以下内容
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
/usr/local/x264/lib
/usr/local/libdrm/lib
完成以上步骤后,你就能在RK3588平台上使用RKMPP加速的FFmpeg进行高效的视频编解码。
确保每个步骤都按照顺序完成,特别是环境变量和配置文件的修改,它们非常重要。
5. 跨系统移植
将/usr/local里面的x264、x265、libdrm、ffmpeg整体拷贝到一个文件夹,然后再需要移植的设备力执行以下脚本:
#!/bin/bash
sudo_with_password() {
echo "orangepi" | sudo -S "$@"
}
sudo_with_password apt-get remove --purge ffmpeg
sudo_with_password apt-get autoremove
sudo_with_password apt-get clean
sudo_with_password cp -r * /usr/local
sudo_with_password 'export PKG_CONFIG_PATH="/usr/local/x264/lib/pkgconfig:$PKG_CONFIG_PATH"' >> ~/.bashrc
sudo_with_password 'export LD_LIBRARY_PATH="/usr/local/x264/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
sudo_with_password 'export PKG_CONFIG_PATH="/usr/local/x265/lib/pkgconfig:$PKG_CONFIG_PATH"' >> ~/.bashrc
sudo_with_password 'export LD_LIBRARY_PATH="/usr/local/x265/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
sudo_with_password 'export PATH="/usr/local/ffmpeg/bin:$PATH"' >> ~/.bashrc
sudo_with_password 'export LD_LIBRARY_PATH="/usr/local/ffmpeg/lib:$LD_LIBRARY_PATH"' >> ~/.bashrc
sudo_with_password chmod +x /usr/local/ffmpeg/bin/ffmpeg
source ~/.bashrc
二、opencv的安装
0. 安装opencv
opencv安装包下载地址:
https://github.com/opencv/opencv/
扩展库下载地址:
https://github.com/opencv/opencv_contrib
一键编译脚本build-opencv.sh,将这个脚本放在下载的opencv同级目录:
#!/bin/bash
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 \
libvtk7-dev
# 设置工作目录
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 WITH_EIGEN=ON \
-D WITH_TBB=ON \
-D WITH_OPENMP=ON \
-D WITH_OPENCL=ON \
-D WITH_OPENGL=ON \
-D ENABLE_CXX11=ON \
-D WITH_FFMPEG=ON \
-D FFMPEG_INCLUDE_DIR="/usr/local/ffmpeg/include" \
-D FFMPEG_LIBRARIES="/usr/local/ffmpeg/lib/libavcodec.so;/usr/local/ffmpeg/lib/libavformat.so;/usr/local/ffmpeg/lib/libavutil.so" \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D ENABLE_PRECOMPILED_HEADERS=OFF \
"${OPENCV_DIR}" # 确保CMake指向正确的源代码目录
# 编译
make -j$(nproc) # 调整为根据实际CPU核心数选择合适的线程数
make install
1. 删除手动安装包中的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_*
2. 安装依赖以及编译
2.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 \
libvtk7-dev
2.2 创建编译build目录以及运行 CMake
cd opencv-4.10.0 && mkdir build && mkdir install && cd build
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 WITH_EIGEN=ON \
-D WITH_TBB=ON \
-D WITH_OPENMP=ON \
-D WITH_OPENCL=ON \
-D WITH_OPENGL=ON \
-D ENABLE_CXX11=ON \
-D WITH_FFMPEG=ON \
-D FFMPEG_INCLUDE_DIR="/usr/local/ffmpeg/include" \
-D FFMPEG_LIBRARIES="/usr/local/ffmpeg/lib/libavcodec.so;/usr/local/ffmpeg/lib/libavformat.so;/usr/local/ffmpeg/lib/libavutil.so" \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_GENERATE_PKGCONFIG=YES \
-D ENABLE_PRECOMPILED_HEADERS=OFF \
2.3 开始编译以及生成库
make -j$(nproc) && make install
2.4 opencv库的安装
命令执行结束,在install生成库文件,我的文件夹结构为:
/home/orangepi/
├── opencv-4.10.0
│ ├── build
│ └── install
│ ├── bin
│ ├── include
│ ├── lib
│ └── share
└── opencv_contrib-4.10.0
└── modules
下面开始将库文件拷贝到系统目录,在install目录下打开终端,分别执行以下命令:
一键安装脚本:
#!/bin/bash
# 定义一个函数来执行带有密码的sudo命令
sudo_with_password() {
echo "orangepi" | sudo -S "$@"
}
sudo_with_password apt-mark unhold libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
# 解锁被“held”的包
sudo_with_password apt-mark unhold gstreamer1.0-opencv libgstreamer-opencv1.0-0 libgstreamer-plugins-bad1.0-dev
pip uninstall -y opencv-python opencv-contrib-python
sudo_with_password apt-get purge -y gstreamer1.0-opencv libgstreamer-opencv1.0-0 libgstreamer-plugins-bad1.0-dev
sudo_with_password apt-get autoremove -y
sudo_with_password apt-get clean
# 删除系统中的 OpenSSL 目录(小心使用)
sudo_with_password rm -rf /usr/lib/python3/dist-packages/OpenSSL
# 安装指定版本的 Python 依赖项
echo "Installing Python dependencies..."
pip install numpy==1.24.2 -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
# 删除手动安装的 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."
# 安装编译 OpenCV 所需的依赖项
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 \
libvtk7-dev
# 假设接下来的操作是为了将新编译或下载的 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.10/site-packages" ]; then
echo "Moving site-packages to dist-packages..."
sudo_with_password mv lib/python3.10/site-packages lib/python3.10/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
# 更新环境变量
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
# 重新加载 bashrc 使环境变量生效
source ~/.bashrc
# 更新动态链接库缓存
sudo_with_password ldconfig
echo "OpenCV installation preparation complete."
(1)修改opencv-4.10.0/install/lib/pkgconfig/opencv4.pc
vim lib/pkgconfig/opencv4.pc
原始的:
# Package Information for pkg-config
prefix=/home/orangepi/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_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_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -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_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}
新的:
# Package Information for pkg-config
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_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_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -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_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
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/
2.5. 将OpenCV的库添加到系统路径
2.5.1 方法一:配置ld.so.conf文件
sudo vim /etc/ld.so.conf
在文件中加上一行
include /usr/local/lib
这个路径是cmake编译时填的动态库安装路径加上/lib
配置ld.so.conf文件
2.5.2 方法二:手动生成opencv.conf文件
sudo vim /etc/ld.so.conf.d/opencv.conf
是一个新建的空文件,直接添加路径,同理这个路径是cmake编译时填的动态库安装路径加上/lib
/usr/local/lib
2.5.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
3. 跨系统移植
使用本博客第二部分里面的 《3.4 opencv库的安装》里面的脚本以及install文件夹即可完成