Ubuntu 14.04交叉编译OpenCV 2.4.9

由于项目需要,自己在Ubuntu环境下使用交叉工具链对OpenCV进行了交叉编译,期间参照了网上一些前辈的博客:

点击打开链接

本人的操作环境:

  • PC操作系统:Ubuntu 14.04 LTS
  • OpenCV 2.4.9
  • 编译器:arm-linux-gcc 4.3.2
  • CMake版本:2.8.10.2
  • 开发板:九鼎S5PV210

注:所有操作均要先通过sudo su root从普通用户切换到root用户

一、安装依赖项

    apt-get install libavcodec-dev libavformat-dev libswscale-dev

    事先安装依赖项可以防止后续的一些问题

二、安装交叉编译工具链

这里提供一个4.3.2的下载地址:https://download.csdn.net/download/u014731484/10334632

然后将arm-linux-4.3.2.tar.gz解压到/usr/local/arm下

tar -zxvf arm-linux-gcc-4.3.2.tar.gz

接着执行

vim /root/.bashrc

在文件的最后添加环境变量

export PATH=$PATH:/usr/local/arm/usr/local/arm/4.3.2/bin 
export OPENCV_DEPEND=/usr/local/arm/opencv-depend 
export OPENCV_INSTALL=/usr/local/arm/opencv-install 

其中,OPENCV_DEPEND为OpenCV的依赖库的安装路径,OPENCV_INSTALL为OpenCV的安装的路径。

然后重启电脑令设置生效。

三、安装依赖库

    OpenCV交叉编译之前,首先需要对依赖库进行交叉编译。因为OpenCV依赖于很多库函数,如果在编译OpenCV之前没有编译依赖项,就会导致编译后的OpenCV无法使用。 OpenCV交叉编译时各个库的依赖关系如下所示:

  • zlib
  • jpeg
  • libpng 
    • zlib
  • tiff 
    • zlib
  • ffmpeg 
    • x264
    • xvidcore

使用的依赖库如下所示(后面为下载地址):

  • zlib-1.2.11:https://download.csdn.net/download/u014731484/10334664
  • jpegsrc.v9b:https://download.csdn.net/download/u014731484/10334666
  • libpng-1.6.29:https://download.csdn.net/download/u014731484/10334671
  • yasm-1.3.0:https://download.csdn.net/download/u014731484/10334675
  • x264-snapshot-20170415-2245:https://download.csdn.net/download/u014731484/10334679
  • xvidcore_1.3.3.orig:https://download.csdn.net/download/u014731484/10334682
  • ffmpeg-2.8.14:https://download.csdn.net/download/u014731484/10334691

注:后面所有的配置过程都需要进到相应的解压后的目录后执行,解压命令在此不再赘述。

1.zlib的交叉编译

./configure --prefix=$OPENCV_DEPEND

修改Makefile

CC=arm-linux-gcc 
AR=arm-linux-ar 
RANLIB=arm-linux-ranlib 
LDSHARED=arm-linux-gcc -shared-Wl,-soname,libz.so.1,--version-script,zlib.map 

然后执行命令

make
make install

2.libjped的交叉编译

./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install

3.libpng的交叉编译

./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install

4.yasm的交叉编译

CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install

5.libx264的交叉编译

CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install

6.libxvid的交叉编译

libxvid编译时需要先进入子目录

cd build/generic

然后

./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
make
make install

7.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
make
make install

注:按照该流程安装时,下载ffmpeg 2.8版本,不要下载最新的ffmpeg 3.3版本!否则可能会像笔者编译OpenCV至21%时,显示make错误;

至此,依赖库编译安装完成。

    此时,需要将路径/usr/local/arm/opencv-depend下的lib和include中所有文件分别拷贝到路径/usr/local/arm/usr/local/arm/4.3.2/arm-non-linux-gnueabi/下的lib和include下。命令如下:

cp -r /usr/local/arm/opencv-depend/include/ /usr/local/arm/usr/local/arm/4.3.2/arm-none-linux-gnueabi/
cp -r /usr/local/arm/opencv-depend/lib/ /usr/local/arm/usr/local/arm/4.3.2/arm-none-linux-gnueabi/

四、OpenCV的交叉编译

1.下载OpenCV源码

我在这里是用的是opencv2.4.9版本,附下载地址:https://download.csdn.net/download/u014731484/10334715

2.设置工具链toolchain.cmake

解压后进入opencv2.4.9的路径

cd opencv-2.4.9
mkdir build
cd ./build

在build文件夹中,用vim或gedit新建文件toolchain.cmake

gedit toolchain.cmake
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)
######################################

执行如下指令:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../

3、对OpenCV进行cmake配置

后面就会需要对OpenCV进行cmake操作,如果PC机没有安装cmake,则需要输入指令:

apt-get install cmake cmake-qt-gui

依旧在build路径下,打开cmake的界面程序,即输入指令:

cmake-gui

设置源代码地址为/opencv-2.4.9,构建地址为/opencv-2.4.9/build,并对如下选项进行修改:

  • CMAKE_INSTALL_PREFIX(安装目录),默认为/opencv-2.4.9/build/install,改为/usr/local/arm/opencv-install
  • 去掉 WITH_CUDA
  • 去掉 WITH_GTK
  • 去掉 WITH_1394
  • 去掉 WITH_GSTREAMER
  • 去掉 WITH_LIBV4L
  • 去掉 WITH_TIFF
  • 去掉 BUILD_OPENEXR
  • 去掉 WITH_OPENEXR
  • 去掉 BUILD_opencv_ocl
  • 去掉 WITH_OPENCL

cmake-gui下的界面如下:

Ubuntu 14.04交叉编译OpenCV 2.4.9_第1张图片

将上述操作进行完毕后,先按下Configure,然后按下Generate。

此时修改在/opencv-2.4.9/build文件夹中的CMakeCache.txt: CMAKE_EXE_LINKER_FLAGS选项本来为空,此时在后面加上:-lpthread -lrt

4、编译OpenCV

/opencv-2.4.9/build路径下执行命令:

make
make install

等待较长时间后,OpenCV的交叉编译就完成了。

五、交叉编译后的OpenCV移植到arm中

1、配置pkg-config

    大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接的时候,必须要指定这些头文件和库文件的位置。 对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。 平常都是这样用pkg-config的:

gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main

   上面的编译命令中,`pkg-config --cflags --libs gtk+-2.0`的作用就如前面所说的,把gtk的头文件路径和库文件列出来,让编译去获取。–cflags和–libs分别指定头文件和库文件。 PS:命令中的`不是引号,而是数字1左边那个键位的那个符号。

在前面的OpenCV配置过程中,pkg-config便已经生成。生成地址为/usr/local/arm/opencv-install/lib/pkgconfig/opencv.pc

2、配置shell

用vim或gedit编辑文件/etc/bash.bashrc

gedit /etc/bash.bashrc
在最后一行加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv-install/lib/pkgconfig 
export PKG_CONFIG_PATH 
然后输入指令:
source /etc/bash.bashrc

3.测试使用

创建并编辑一个test.cpp文件:

#include 
#include 
#include 

using namespace std;

int main(int argc, char *argv[])
{
    IplImage* image = cvLoadImage("1.jpg");
    if(image == NULL)
    {
        cout<<"loud image fail"<
保存退出后,输入如下编译指令:
arm-linux-g++ `pkg-config --cflags --libs opencv` test.cpp -lpthread -lrt -o test

最后将生成的test复制到板子上,不过默认情况下当程序运行到cvNamedWindow时是会出错的,这个时候可以选择Qt作为交互界面,后面应该会写一篇关于在ARM上移植Qt的博客。

注:必须要将 OPENCV_DEPEND下依赖库lib和OPENCV_INSTALL安装的库lib都拷贝到板子上lib目录下,Opencv才可在ARM板子上运行


你可能感兴趣的:(arm-opencv)