一、背景:
- PC操作系统:Ubuntu 14.04 LTS
- 库版本:OpenCV 2.4.9
- 编译器:arm-linux-gcc 4.6.2
- CMake版本:3.5.1
- 本文所有操作都需要以root权限进行操作
二、安装依赖项:
先获得超级用户权限:
sudo su
需要安装几项与视频解码相关的依赖项:
apt-get install libavcodec-dev libavformat-dev libswscale-dev
三、安装交叉编译链:
参看:
四、交叉编译依赖包:
Opencv2.4.9:https://sourceforge.net/projects/opencvlibrary/files/opencv-unix/ zlib-1.2.8:http://www.zlib.net/ jpegsrc.v8d: http://www.ijg.org/files/ libpng-1.6.13: https://sourceforge.net/projects/libpng/files/ yasm-1.3.0 :http://www.tortall.net/projects/yasm/releases/ x264-snapshot-20170415-2245 : http://download.videolan.org/pub/videolan/x264/snapshots/ xvidcore-1.3.5 :https://labs.xvid.com/source/ ffmpeg-2.8.12 :http://ffmpeg.org/download.html
OpenCV 交叉编译时各个库的依赖关系如下:
/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/是交叉编译链安装路径,
在交叉编译过程中出现的/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr
目录会在使用交叉工具时编译器会到这个目录下搜索需要的库文件、头文件、与链接文件,
建议移植依赖包时安装目录也为此目录。
交叉编译配置命令中 prefix 参数为指定 安装目录, CC 为指定交叉编译器,参数 host 为指定目标平台,shared 参数为指定生成动态库文件,static 参数为指定生成静态库文件,extra-cflags 指定链接头文件所在目录的绝对路径,extra-ldflags 为指定链接库所在目录的绝对路径,target-os 指定目标运行为 linux 系统,对哪个依赖项交叉编译需要进入该依赖项安装包目录进行下面命令
1.交叉编译libz:
export CC=arm-linux-gcc CPP="arm-linux-gcc -E" AR=arm-linux-ar RANLIB=arm-linux-ranlib
./configure \
--prefix=/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/ \
--shared
make
make install
2.交叉编译libjpeg
./configure \
CC=arm-linux-gcc \
--host=arm-linux \
--prefix=/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/ \
--enable-static \
--enable-shared
make
make install
3.交叉编译 libpng
./configure \
CC=arm-linux-gcc \
--host=arm-linux \
--prefix=/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/ \
--enable-static \
--enable-shared
make
make install
4.交叉编译yasm
./configure \
CC=arm-linux-gcc \
--host=arm-linux \
--prefix=/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/ \
--enable-static \
--enable-shared
make
make install
5.交叉编译 libxvid
./configure \
--prefix=/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/ \
--host=arm-linux \
--disable-assembly
make
make install
6.交叉编译 libx264
CC=arm-linux-gcc ./configure \
--enable-shared \
--host=arm-linux \
--disable-asm \
--prefix=/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/
make
make install
7.交叉编译ffmpeg
在ffmpeg-2.8.1目录下新建build目录,然后cd build进行操作:
../configure \
--prefix=/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/ \
--enable-shared \
--disable-static \
--enable-gpl \
--enable-cross-compile \
--arch=arm \
--disable-stripping \
--target-os=linux \
--cc=/opt/fsl-linaro-toolchain/bin/arm-linux-gcc \
--enable-swscale \
--disable-ffserver \
--enable-pthreads \
--enable-yasm \
--enable-libx264 \
--extra-cflags=-I/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/include \
--extra-ldflags=-L/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/lib
注意:这里的CC编译器路径要指定绝对路径
make
make install
8.将OpenCV依赖库复制到ARM编译器路径下
完成上面的工作后,需要将上面指定的 prefix配置路径/opt/fsl-linaro-toolchain/arm-fsl-linux-gnueabi/multi-libs/default/usr/下的lib和include中所有文件分别拷贝到路径/opt/fsl-linaro-toolchain/下的lib和include下。
五、交叉编译OpenCV
交叉编译OpenCV需要进行cmake操作,如果没有安装cmake,则需要输入指令:
apt-get install cmake cmake-qt-gui
在源码同级目录下创建配置目录opencv-2.4.9-build和安装目录opencv-2.4.9-arm
mkdir opencv-2.4.9-build opencv-2.4.9-arm
进入源码目录cd opencv-2.4.9,进行命令操作:cmake-gui
(1) 设置源码目录与配置目录,然后点击 configure 进行配置。
(2)指定项目生成器,generator 为 Unix Makefiles,选择 Specify options for cross-compiling,然后点击 Next,继续配置。
(3)设置操作系统与交叉工具链,其中 Compilers 的 C 与 C++指定为交叉工具链中的arm-linux-gcc 与 arm-linux-g++;Target Root是工具链安装路径,然后点击 Finish。
注意:Target Root工具链安装路径与图中路径有出入,应该是:/opt/fsl-linaro-toolchain/,需要根据个人的工具链安装路径配置(4)可能会出现如图错误弹窗,这是使用默认配置导致的错误,无需理会,点击 ok 即可。
(5)配置 OpenCV,点击 Configure ,然后进行配置,注意以下选项:
1)选上 BUILD_JPEG、BUILD_PNG、WITH_OPENGL、WITH_V4L;
2)如果没有安装 tiff,则 WITH_GTK、 WITH_TIFF 不选;
3)arm 不支持 BUILD_PERF_TESTS 、WITH_1394、WITH_CUDA、WITH_LIBV4L;
4)如果移植了 ffmpeg 则 WITH_FFMPEG 勾选上;
5)修改 CMAKE_BUILD_TYPE 为 Release;
6)修改 CMAKE_INSTALL_PREFIX 为安装目录/home/he/src/opencv/opencv-2.4.9-arm。
(6)配置完成再次点击 Configure,将会打印如下所示的配置信息。
(7)点击“Generate”按钮,配置完成,将会在配置目录 opencv-2.4.9-build 生成 Makefile文件。
进入配置目录把 CMakeCache.txt 文件中的“CMAKE_EXE_LINKER_FLAGS:STRING=”修改为如下内容:
CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt -ldl
(8)编译安装 OpenCV。
make -j8
make install
make过程比较长,看虚拟机配置,可以开大一点虚拟机处理器,会编译快一点。
编译安装完成的交叉编译opencv2.4.9库文件:
若是安装的库是绿色的或者没有pkgconfig文件夹,应该是编译过程出问题了,重新来过吧。
六、ARM-OpenCV 应用编译环境搭建
在~/.bashrc 文件中添加 OpenCV 配置文件所在目录、库文件所在目录、头文件目录,添加内容如下所示:
export PKG_CONFIG_PATH=/home/he/src/opencv2.4.9-arm/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/he/src/opencv2.4.9-arm/
export CPLUS_INCLUDE_PATH=/home/he/src/opencv2.4.9-arm/include:$CPLUS_INCLUDE_PATH
进入用户主目录,输入. .bashrc 命令,执行~/.bashrc,或者重新开一个终端使设置生效。
注意:如果原来安装有Ubuntu下的OpenCV,需要将如下路径注释掉:
#export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
根据个人安装情况修改安装目录下的 lib/pkgconfig/opencv.pc 文件,把 prefix=/home/he/src/opencv2.4.9-arm/
修改为 OpenCV 动态库所在目录的绝对路径,修改结果如下所示:
七、ARM-OpenCV 交叉编译库测试
创建并编辑一个test.cpp文件:
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread( "./test.png" );//图片储存路径
imshow( "src", img );
waitKey(0);
return 0;
}
保存退出后,输入如下编译指令:
arm-linux-g++ `pkg-config --cflags --libs opencv` test.cpp -lpthread -lrt -o test
以后编译arm板的OpenCV代码时,要使用上面的编译指令。其中` 符号不是逗号,而是1 左边的那个符号。而把编译好的程序放到arm板时,在运行时,还要把OpenCV 安装目录/home/he/src/opencv/opencv-2.4.9-arm/lib目录下的所有.so文件都拷贝到arm的/usr/lib或者/lib目录下。