环境:
ubuntu20.04 opencv=3.4.12 ffmpeg=4.2.*
安装交叉编译链,
如x3m的交叉编译链aarch64-linux-gnu- 安装见链接:https://developer.horizon.ai/forumDetail/112555549341653662
rk3399的交叉编译链aarch64-linux-gnu- 安装:
git clone https://github.com/rockchip-toybrick/linux-x86.git -b master
RK1808 rk3399平台,使用aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu
RV1109 RV1126 平台,使用
arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/
将相应的交叉编译链*/bin 路径加入到环境变量中,
如: sudo gedit ~/.bashrc
export PATH=$PATH:{自己的路径}/.../arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin
source ~/.bashrc
注:依赖包都安装在/home/gz/opencv_x3m中
依赖库:
Libx264: 下载地址 x264, the best H.264/AVC encoder - VideoLANhttp://www.videolan.org/developers/x264.html
Libxvid: 下载地址 https://labs.xvid.com/source/https://labs.xvid.com/source/
Ffmpeg: 下载地址 Download FFmpeghttp://ffmpeg.org/download.html
一、安装 依赖项
sudo apt-get install pkg-config libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev
二、交叉编译Libz
将下载的Libz压缩包,解压:
tar -xvf 压缩包名
cd {自己的路径}/zlib-1.2.11 #这里是1.2.11版本的zlib
./configure --prefix=/home/gz/opencv_x3m --shared #prefix参数指定了临时安装目录
配置完成后会生成makefile文件,需要对makefile文件进行修改,适配交叉编译工具链。
gedit Makefile #用编辑器打开Makefile文件并进行以下对应部分的修改
CC = aarch64-linux-gnu-gcc #交叉编译工具链
AR = aarch64-linux-gnu-ar
RANLIB = aarch64-linux-gnu-ranlib
LDSHARED = aarch64-linux-gnu-gcc -shared -wl, -soname,libz.so.1,--version-script,zlib.map
修改完成后,保存,下一步进行编译和安装:
make
make install
三、交叉编译libx264
将下载的libx264压缩包,解压:
tar -xvf 压缩包名
cd {自己的路径}/x264_master #按自己的实际路径来即可
CC=aarch64-linux-gnu-gcc ./configure --enable-shared --host=aarch64-linux-gnu --disable-asm --prefix=/home/gz/opencv_x3m
make
make install
四、交叉编译libxvid
将下载的libxvid 压缩包,解压:
tar -xvf 压缩包名
cd {自己的路径}/xvidcore #按自己的实际路径来即可
cd build/generic #切换到编译脚本所在的目录
/configure --prefix=/home/gz/opencv_x3m --host=aarch64-linux-gnu-gcc --disable-assembly
make
make install
五、交叉编译ffmpeg
将下载的ffmpeg压缩包,解压:
tar -xvf 压缩包名
cd {自己的路径}/ffmpeg #按自己的实际路径来即可
./configure --prefix=/home/gz/opencv_x3m --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm64 --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=aarch64-linux-gnu-gcc --enable-swscale --extra-cflags=-I/home/gz/opencv_x3m/include/ --extra-ldflags=-L/home/gz/opencv_x3m/lib/
注意:
最后两句是前面三个依赖库的安装目录,如果不加上可能会报libx264 not found错误;
如果是地平线的编译链后面还得加上,--extra-libs="-lpthread -ldl -lm"
如果是arm-linux-gnueabi-gcc的编译链,--arch=arm64 要改为 --arch=arm
make
make install
六、交叉编译opencv
1、设置工具链toolchain.cmake
在用cmake编译之前首先要构建工具链cmake文件,在终端执行:
cd {自己的路径}/opencv-3.4.12/
mkdir arm-build
cd ./arm-build
gedit toolchain.cmake
在打开的toolchain.cmake文件中添加以下内容:
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm64 )
set( CMAKE_C_COMPILER aarch64-linux-gnu-gcc )
set( CMAKE_CXX_COMPILER aarch64-linux-gnu-g++ )
set( CMAKE_FIND_ROOT_PATH "/home/gz/opencv_x3m" ) #这里要和上面编译安装的目录对应
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
set(CMAKE_C_FLAGS -Wl,-rpath-link=/home/gz/opencv_x3m/lib)
set(CMAKE_CXX_FLAGS -Wl,-rpath-link=/home/gz/opencv_x3m/lib)
保存关闭后,在终端执行:
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../
完成后,打印信息中,FFMPEG对应部分都显示为no......
注:aarch64的编译器 CMAKE_SYSTEM_PROCESSOR 设为arm64或aarch64
arm的编译器 CMAKE_SYSTEM_PROCESSOR 设为arm
2、cmake-gui
如果没有安装cmake-gui,则sudo apt-get install cmake cmake-qt-gui
cmake的使用请上网查找,配置好后,在cmake-gui界面中,点击Add_Entry,添加PKG-CONFIG支持项,OPENCV_ENABLE_PKG_CONFIG 并设为ture
去掉 WITH_CUDA
去掉 WITH_GTK
去掉 WITH_1394
去掉 WITH_GSTREAMER
点击Advanced ,在CMAKE_EXE_LINKER_FLAGS 选项中设为-lpthread -lrt -ldl -lm
CMAKE_INSTALL_PREFIX 设置为/home/gz/opencv_x3m
点击Configure,查看FFMPEG对应部分是否yes,
如果为no, 添加环境变量,
sudo gedit /etc/profile
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/gz/opencv_x3m/lib
/pkgconfig
source /etc/profile
再点击configure,直到FFMPEG对应部分为yes(这一块需要多尝试,我根据别人的文档,改过源码,还是没有用,后面莫名其妙的就好了,没去探查具体原因,建议多尝试几次,或者改一个设置就configure一次)
依次点击Configure和Generate,生成makefile文件
3、 编译opencv
make
make install
如果是opencv3.4.12的版本,编译过程中,应该不会出错,如果是其他版本的opencv,编译过程中的报错信息,网上都有解决方法,请参考网上的解决方法!
至此,opencv+ffmpeg的交叉编译已完成,将/home/gz/opencv_x3m整个文件夹放入板端,添加环境变量PATH和LD_LIBRARY_PATH即可使用
参考博客:arm平台的opencv+ffmpeg交叉编译_ffmpeg交叉编译arm_超级乐乐gogogo的博客-优快云博客