背景:
由于手上有一块rk3568的开发板,需要运行yolov5跑深度学习模型,但是原有的opencv不能对x264格式的视频进行解码,这里就需要将ffmpeg+x264编译进opencv。
但是开发板算力有限,所以这里采用在windows下,安装ubuntu的虚拟机,在虚拟机上进行交叉编译,得到arm 版的opencv。
pc主机:windows10
虚拟机:ubuntu-18.04
目标机: armv8
目标芯片:rk3568
目标编译环境: aarch64-linux-gnu-gcc/aarch64-linux-gnu-g++
注:以下所有的环境安装都是在虚拟机上运行的,目标ARM平台需要另外安装运行环境
目录
1、安装交叉编译器和编译工具
2、下载+编译依赖的第三方软件
3、设定第三方软件统一的安装路径和编译安装软件
4、编译opencv
1、安装交叉编译器和编译工具
sudo apt-get install g++-aarch64-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install cmake-gui cmake
sudo apt-get install build-essential
sudo apt-get install vim
sudo apt install pkg-config
2、下载+编译依赖的第三方软件
zlib官网:http://www.zlib.net/
libjpeg下载地址:http://www.ijg.org/files/
libpng下载地址:http://www.libpng.org/pub/png/libpng.html
yasm下载地址:http://yasm.tortall.net/Download.html
x264下载地址:http://www.videolan.org/developers/x264.html
libxvid下载地址:http://ftp.br.debian.org/debian-multimedia/pool/main/x/xvidcore/
ffmpeg下载地址:http://ffmpeg.org/download.html
这里将对应的软件下载下来就行,软件版本的话,我这边选的稍微稳定的版本
软件版本我这边的截图如下:
3、设定第三方软件统一的安装路径和编译安装软件
为什么要设定安装路径?一是方便管理,当依赖的第三方软件都编译成功后,可以统一将所有的lib库文件和include
头文件复制到目标文件夹
为什么要交叉编译安装软件?因为我们要编译arm版本的opencv,该opencv依赖的第三方软件也需要是arm版本的,由于宿主主机是x86架构的,所以只能交叉编译安装
注:编译安装的命令行参数配置
--host: 指明目标平台
--prefix: 指明编译安装的位置
--enable-shared 生成动态库
--enable-static 生成静态库
声明软件的安装位置,以及目标平台使用的 c 语言编译软件平台
vim ~/.bashrc
export OPENCV_DEPEND=/usr/local/arm/opencv-depend
export OPENCV_INSTALL=/usr/local/arm/opencv-install
export CC=aarch64-linux-gnu-gcc
source ~/.bashrc
这里我将CC=aarch64-linux-gnu,这样的话,后续采用configure编译得到的Makefile文件里面的CC都会由gcc改成aarch64-linux-gnu,就不用每次都去Makefile文件里面去改相应的字段了
编译安装zlib
cd zlib-1.3.1/
./configure --prefix=$OPENCV_DEPEND --host=aarch64-linux-gnu
sudo maks && sudo make install
编译安装libjpeg
cd jpeg-8
./configure --host=aarch64-linux-gnu --prefix=$OPENCV_DEPEND --enable-shared --enable-static
sudo make && sudo make install
虽然指令写的没问题,编译也没有问题,但是我后面编译Opencv时,却找不到 ljpeg , 就算我指明了对应的库位置,也不行,所以这一步就当失败了。后面我会有解决方案解决这个问题:那就是将
编译安装libpng
cd libpng-1.4.21/
./configure --host=aarch64-linux-gnu --prefix=$OPENCV_DEPEND --enable-shared --enable-static
sudo make && sudo make install
编译安装x264
cd x264-master/
./configure --enable-shared --host=aarch64-linux-gnu --disable-asm --prefix=$OPENCV_DEPEND
sudo make && sudo make install
x264 是一个很重要的依赖,用于对 x264 编码格式的码流进行解码,我们需要将x264编译进Opencv
编译libxvid
./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
make
make install
编译ffmpeg
./configure --prefix=$OPENCV_DEPEND --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gcc --enable-swscale --extra-ldflags=-L$OPENCV_DEPEND/lib --extra-cflags=-I$OPENCV_DEPEND/include
前面已经将一些依赖的第三方软件都安装完成,现在需要将这些依赖包含的头文件include和库文件 lib,都复制到aarch64-gcc的指定路径下,方便编译opencv时能找到
sudo cp -r /usr/local/arm/$OPENCV_DEPEND/include/ /usr/aarch64-linux-gnu/include/
sudo cp -r /usr/local/arm/$OPENCV_DEPEND/lib/ /usr/aarch64-linux-gnu/lib
4、编译opencv
1、获取opencv源码,我这里的源代码版本是opencv-3.4.5
mkdir mybudild
cd mybuild
vim toolchain.cmake
将以下内容填进去
###########user defined#############
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++ )
###########user defined#############
set( CMAKE_FIND_ROOT_PATH "/usr/local/arm/opencv-depend" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
######################################
在新建的mybuild文件夹下键入命令cmake-gui
我的路径是 /home/rock/src/opencv-3.4.5/mybuild2
cmake-gui通过Add Entry按钮添加OPENCV_ENABLE_PKG_CONFIG,选择类型为bool并打钩
将以下内容填进去去掉 WITH_CUDA
去掉 WITH_GTK
去掉 WITH_1394
去掉 WITH_GSTREAMER
去掉 WITH_LIBV4L
去掉 WITH_TIFF
去掉 BUILD_OPENEXR
去掉 WITH_OPENEXR
去掉 BUILD_opencv_ocl
去掉 WITH_OPENCL
勾选BUILD_JPEG
这里增加勾选BUILD_JPEG刚好解决我前面编译ljpeg后,CMAKE链接不到的问题
完成后
vim CMakeCache.txt
将该行改成
CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=-lpthread -lrt
sudo make && make install
大功告成