OpenCV加FFmpeg ARM交叉编译

OpenCV加FFmpeg ARM交叉编译

项目需要在zedboard上使用OpenCV对视频进行处理,所以需要FFmpeg的支持。
FFmpeg是一种开源的软件,可以对视频和音频进行录制,转换和流功能,它包含libavcodec(音频和视频的解码库),和libavformat,libavutils和其他辅助性的库。这些库在OpenCV的highgui模块调用来处理音视频。

对OpenCV交叉编译有点麻烦,特将编译过程及遇到的问题和解决办法记录一下
s首先说下编译环境及所用库的版本号

项目 版本号 链接
操作系统 Ubuntu 14.04
OpenCV 2.4.13 opencv-2.4.13.zip
FFmpeg 3.1.4 ffmpeg-3.1.4.tar.bz2
x264 20161020 x264-snapshot-20161019-2245-stable.tar.bz2
libjpeg 9.0.0 jpegsrc.v9.tar.gz
libpng 1.6.25 libpng-1.6.25.tar.gz
xvidcore 1.3.4 xvidcore-1.3.4.tar.gz

一.安装过程

1.1 安装交叉编译工具

因为要在zedboard上运行,所以安装xilinx的交叉编译工具,可以从github上下载也可以从这里下载我用的,因为这个工具是32位系统设计的,64位系统需要先安装部分32位的库

sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 libgtk2.0-0:i386

然后将dash更改为bash

sudo dpkg-reconfigure dash

在弹出的对话框中选择NO,将dash更改为bash,然后修改下安装程序的权限

sudo chmod u+x xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

执行安装程序

(sudo)./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

可以选择用管理员权限安装,此时安装后的执行文件的路径为

/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/

不使用管理员权限安装的执行文件路径为:

/home//CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/

最后需要修改一下环境变量,将install path更改为上述交叉编译工具的执行文件安装路径

export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export PATH=:$PATH

1.2 其他依赖库安装

1.2.1 libjpeg交叉编译

这个以后面的依赖库编译和安装都需要首先进行配置

tar -xzvf jpegsrc.v9.tar.gz
cd jpeg-9
./configure --host=arm-xilinx-linux CC=arm-xilinx-linux-gnueabi-gcc --prefix=<dependency install path>
make
make install

可以在配置的时候指定将编译好的库安装的位置,或者使用”sudo make install”直接安装在”/usr/local/lib”里,以下安装方式类似。
可以切换到安装的文件夹下查看是否交叉编译成功

file libjpeg.so.9.0.0

如果输出信息为

libjpeg.so.9.0.0: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, not stripped

说明交叉编译成功

1.2.2 zlib交叉编译

zlib需要预先指定CC选项

export CC=arm-xilinx-linux-gnueabi-gcc
./configure --shared --prefix=<dependency install path>
make
make install

1.2.3 libpng交叉编译

因为libpng交叉编译需要用到zlib,所以需要在编译该库之前交叉编译好zlib

export LDFLAGS="-L/lib"
export CPPFLAGS="-I/inclue"
./configure --host=arm-xilinx-linux CC=arm-xilinx-linux-gnueabi-gcc --prefix=<dependency install path>

在编译之前,需要指定zlib的库的安装路径和头文件位置,如果是用管理员权限安装的上述路径分别为

export LDFLAGS="-L/usr/local/lib"
export CPPFLAGS="-I/usr/local/include"

1.2.4 x264交叉编译

tar -xvf x264-snapshot-20161019-2245-stable.tar
cd x264-snapshot-20161019-2245-stable/
./configure --host=arm-xilinx-linux --cross-prefix=arm-xilinx-linux-gnueabi- --disable-asm --enable-shared --prefix=<dependency install path>
make
make install

1.2.5 xvidcore交叉编译

xvidcore的配置文件在/build/generic里

cd build/generic
./configure --host=arm-xilinx-linux-gnueabi --disable-assembly --enable-shared --prefix=<dependency install path>
make
make install

1.3 FFmpeg 交叉编译

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
./configure --enable-shared --disable-static --cross-prefix=arm-xilinx-linux-gnueabi- 
--arch=arm --target-os=linux --disable-stripping --enable-cross-compile --disable-asm 
--enable-libxvid --enable-libx264 --enable-gpl 
--extra-cflags=-I<dependency install path>/include --extra-ldflags=-L<dependency install path>/lib --prefix=<dependency install path>
make
make install

1.4 OpenCV 交叉编译

首先写一个toolchain.make文件,将下面内容复制进去

set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++ )
set( CMAKE_FIND_ROOT_PATH "/usr/local/lib" )
set( CMAKE_C_FLAGS "-Wl,-rpath-link=/usr/local/lib")
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

上面的CMAKE_FIND_ROOT_PATH和CMAKE_C_FLAGS里的路径要修改为前面那些依赖和FFmpeg的安装路径
解压OpenCV源码,并生成Makefile文件

mkdir build
cd build
cmake -D CMAKE_TOOLCHAIN_FILE=../toolchain.make -D BUILD_opencv_nonfree=OFF ../opencv-2.4.13

如果系统内没有安装cmake需要先安装和下面用到的cmake图形工具

sudo apt-get install cmake cmake-curses-gui

然后配置OpenCV的编译选项

ccmake .

会出现如下的配置界面,
OpenCV加FFmpeg ARM交叉编译_第1张图片

使用上下方向键可以翻页,至少以下几个选项为ON,

  • WITH_FFMPEG
  • WITH_JPEG
  • WITH_PNG
  • WITH_V4L

按’c’然后按’g’来生成Makefile
然后运行

make
make install

编译过程要花费一段时间,编译成功之后就能生成相应的*.so文件

二.遇到的错误及解决方案

1.编译libpng时提示zlib:not found

在编译libpng时需要指定zlib的库文件和头文件的位置,可以按照上面说的配置方法或者直接在配置时指定位置

./configure --host=arm-xilinx-linux CC=arm-xilinx-linux-gnueabi-gcc --prefix=<dependency install path> LDFLAGS=−L<dependency install path>/lib CFLAGS=-I<dependency install path>/include

2.编译FFmpeg时提示:ERROR: libx264 not found

主要是编译FFmpeg时没有找到x264.h这个头文件,所以需要在配置FFmpeg时增加编译选项

--extra-cflags=-Iinstall path>/include --extra-ldflags=-Linstall path>/lib

“dependency install path”为x264的安装路径

3.编译FFmpeg时提示

/tmp/ccwOsjxB.s: Assembler messages:
/tmp/ccwOsjxB.s:20222: Error: selected processor does not support ARM mode `ubfx sl,r2,#0,#4'
/tmp/ccwOsjxB.s:20223: Error: selected processor does not support ARM mode `ubfx fp,r2,#4,#4'
/tmp/ccwOsjxB.s:20390: Error: selected processor does not support ARM mode `ubfx r0,r3,#0,#4'
/tmp/ccwOsjxB.s:20391: Error: selected processor does not support ARM mode `ubfx sl,r3,#4,#4'
/tmp/ccwOsjxB.s:20546: Error: selected processor does not support ARM mode `ubfx r8,r2,#0,#2'
/tmp/ccwOsjxB.s:20547: Error: selected processor does not support ARM mode `ubfx r9,r2,#2,#2'
/tmp/ccwOsjxB.s:20549: Error: selected processor does not support ARM mode `ubfx sl,r2,#4,#2'
/tmp/ccwOsjxB.s:20551: Error: selected processor does not support ARM mode `ubfx fp,r2,#6,#2'
/tmp/ccwOsjxB.s:20707: Error: selected processor does not support ARM mode `ubfx r9,r7,#0,#2'
/tmp/ccwOsjxB.s:20708: Error: selected processor does not support ARM mode `ubfx sl,r7,#2,#2'
/tmp/ccwOsjxB.s:20710: Error: selected processor does not support ARM mode `ubfx fp,r7,#4,#2'
/tmp/ccwOsjxB.s:20712: Error: selected processor does not support ARM mode `ubfx ip,r7,#6,#2'
/tmp/ccwOsjxB.s:20717: Error: selected processor does not support ARM mode `rbit r2,r2'
make: *** [libavcodec/aacdec.o] Error 1

在配置FFmpeg时加上–disable-asm选项

4.编译OpenCV时提示

bin/ld:warning: libz.so.1, needed by .../libopencv_core.so, not found (try using -rpath or -rpath-link)
bin/ld:warning: libavcodec.so.57, needed by .../libopencv_core.so, not found (try using -rpath or -rpath-link)

后面会有一系列的undefined reference to `xxx’
可以在环境变量中添加

export LDFLAGS=-Wl,-rpath-link,/usr/local/lib

并且修改toolchain.make文件,添加下列内容

set( CMAKE_FIND_ROOT_PATH "/usr/local/lib" )#此路径为安装后的依赖库的路径
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

最开始时我编写的toolchain.make配置文件只有CMAKE_SYSTEM_NAME,CMAKE_SYSTEM_PROCESSOR,CMAKE_C_COMPILER,CMAKE_CXX_COMPILER这几个选项,在更改好环境变量后还是会报上述错误,直到参考[2]添加了上述几个选项后顺利编译通过


参考文献:

  1. OpenCV Installation:
    http://www.wiki.xilinx.com/OpenCV+Installation
  2. 【原创】基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结(一):
    http://www.cnblogs.com/bombe1013/p/3294301.html
  3. FIXING -RPATH-LINK ISSUES WITH CROSS-COMPILERS:
    https://sysprogs.com/w/fixing-rpath-link-issues-with-cross-compilers/
  4. ffmpeg 在arm下的移植编译:
    http://www.voidcn.com/blog/wejoncy/article/p-3605142.html
  5. 集成ffmpeg/x264:ERROR:libx264 not found的问题:
    http://blog.sina.com.cn/s/blog_54b5ea250100r53o.html
  6. Jetson/Installing OpenCV:
    http://elinux.org/Jetson/Installing_OpenCV
  7. Cross compilation for ARM based Linux systems:
    http://docs.opencv.org/2.4/doc/tutorials/introduction/crosscompilation/arm_crosscompile_with_cmake.html

你可能感兴趣的:(OpenCV)