一、背景:

  • 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 交叉编译时各个库的依赖关系如下:

crossenv交叉编译python库_arm


/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 进行配置。

crossenv交叉编译python库_opencv_02


(2)指定项目生成器,generator 为 Unix Makefiles,选择 Specify options for cross-compiling,然后点击 Next,继续配置。

crossenv交叉编译python库_arm_03


(3)设置操作系统与交叉工具链,其中 Compilers 的 C 与 C++指定为交叉工具链中的arm-linux-gcc 与 arm-linux-g++;Target Root是工具链安装路径,然后点击 Finish。

crossenv交叉编译python库_交叉编译_04


注意:Target Root工具链安装路径与图中路径有出入,应该是:/opt/fsl-linaro-toolchain/,需要根据个人的工具链安装路径配置(4)可能会出现如图错误弹窗,这是使用默认配置导致的错误,无需理会,点击 ok 即可。

crossenv交叉编译python库_crossenv交叉编译python库_05


(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。

crossenv交叉编译python库_crossenv交叉编译python库_06


crossenv交叉编译python库_linux_07


(6)配置完成再次点击 Configure,将会打印如下所示的配置信息。

crossenv交叉编译python库_交叉编译_08


crossenv交叉编译python库_交叉编译_09


crossenv交叉编译python库_交叉编译_10


(7)点击“Generate”按钮,配置完成,将会在配置目录 opencv-2.4.9-build 生成 Makefile文件。

进入配置目录把 CMakeCache.txt 文件中的“CMAKE_EXE_LINKER_FLAGS:STRING=”修改为如下内容:

CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt -ldl

crossenv交叉编译python库_crossenv交叉编译python库_11


(8)编译安装 OpenCV。

make -j8
make install

make过程比较长,看虚拟机配置,可以开大一点虚拟机处理器,会编译快一点。

编译安装完成的交叉编译opencv2.4.9库文件:

crossenv交叉编译python库_opencv_12


若是安装的库是绿色的或者没有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 动态库所在目录的绝对路径,修改结果如下所示:

crossenv交叉编译python库_opencv_13

七、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目录下。