Opencv2.0移植ARM(Cortex A8)全过程

来源:互联网 发布:淘宝otc药品怎么购买 编辑:程序博客网 时间:2024/09/21 06:32

 

http://download.csdn.net/detail/liu448077268/7889317 可以去此网址下载所有本文章

Opencv2.0移植ARM(Cortex A8)全过程byHDU刘秀14年9月10日

前言

      本人在移植OpencvARM-linux系统上经历坎坷的路程,由当初师兄手把手教如何交叉编译移植一个不成功的Opencv1.0的交叉编译库(ffmpeg一直移植不成功)。到之后在项目中需要ffmpeg解码,想方设法曾经利用v4l2进行camrea数据的读取,奈何mjpeg解码迟迟没有成功;项目上问题不得不解决,心想Opencv已经是很成熟肯定能配置成功ffmpeg的,就不断地百度经过半个月的编译终于成功了。于是写下这篇文档帮助那些和我一样遇到这样困难的人,如有错误请联系我将改正。

准备工作

      首先得选择一个linux系统,比如FedoraRedhatubuntu等等。讲讲我采用的环境,我也是属于windows这种手残党的,不肯舍弃windows系统。

PC主机:VMware+Ubuntu11.04上进行交叉编译

目标的ARM板:Smart210 with Linux3.0.8

交叉编译器:友善之臂官方提供的 toolchains 4.5.1

      我所有的交叉编译库文件都将生成在opencv-arm文件夹中

 

 

 

Opencv2.0移植ARM(Cortex A8)全过程byHDU刘秀14年9月10日

一、交叉编译链的安装

      根据友善之臂提供的文件有个arm-linux-gcc的文件夹拷贝到ubuntu中。

1.解压:采用terminal的输入代码的形式比较烦琐,我都是直接手动点解压到当前用户主文件夹(/home/liuxiu/)中,接下来的库文件都是解压到这主文件夹下进行配置安装的。

2.配置环境变量:为了使用方便,在terminal不用输入绝对路径,编辑/etc/bash.bashrc文件添加交叉编译链的路径到环境变量Path中,只要在这个文件中添加下面这 2个语句即可:

PATH=/home/liuxiu/opt/FriendlyARM/toolschain/4.5.1/bin$PATH

export PATH

3.编辑完毕后使用 source /etc/bash.bashrc命令执行以下这个文件,让设置生效,之后再输入:

$ arm-none-linux-gnueabi-gcc -v

如果输出下面的信息则表面设置成功:

Using built-in specs.

COLLECT_GCC=arm-none-linux-gnueabi-gcc

COLLECT_LTO_WRAPPER=/home/liuxiu/opt/FriendlyARM/toolschain/4.5.1/bin/../libexec/gcc/arm-none-linux-gnueabi/4.5.1/lto-wrapper

Target: arm-none-linux-gnueabi

Configured with: /work/toolchain/build/src/gcc-4.5.1/configure--build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu--target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/toolschain/4.5.1--with-sysroot=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root--enable-languages=c,c++ --disable-multilib --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s--with-fpu=vfp --with-float=softfp --with-pkgversion=ctng-1.8.1-FA--with-bugurl=http://www.arm9.net/ --disable-sjlj-exceptions--enable-__cxa_atexit --disable-libmudflap--with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm'--with-gmp=/work/toolchain/build/arm-none-linux-gnueabi/build/static--with-mpfr=/work/toolchain/build/arm-none-linux-gnueabi/build/static--with-ppl=/work/toolchain/build/arm-none-linux-gnueabi/build/static--with-cloog=/work/toolchain/build/arm-none-linux-gnueabi/build/static--with-mpc=/work/toolchain/build/arm-none-linux-gnueabi/build/static--with-libelf=/work/toolchain/build/arm-none-linux-gnueabi/build/static--enable-threads=posix--with-local-prefix=/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root--disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long

Thread model: posix

gcc version 4.5.1 (ctng-1.8.1-FA)

至此交叉编译链安装完成。

注意:配置环境变量的时候需要在root用户下进行操作,在ubuntu11.04之前都不能用root用户直接登录,可采用terminal下登录root进行环境变量的修改。

二、交叉编译libjpeg

版本jpegsrc.v6b,这些库都可以从官网上下载的。

1.解压进入目录

2.配置选项:

$./configure –prefix=/home/liuxiu/opencv-arm–exec-prefix=/home/liuxiu/opencv-arm –-enable-shared --enable-static

下面分别介绍这几个参数的作用:

--prefix=/home/liuxiu/opencv-arm :执行 make install,会将与体系无关的文件拷贝到此目录下,体如下:

/home/liuxiu/opencv-arm ....................................

      |

      +---include........................................

             |

             ---jconfig.h

             |

             ---jerror.h

             |

             ---jmorecfg.h

             |

             ---jpeglib.h

      +---man............................................

             |

            +---man1.......................................

             |

             ---cjeg.1

             |

             ---djpeg.1

             |

             ---jpegtran.1

             |

             ---rdjpgcom.1

             |

             ---wrjpgcom.1

--exec-prefix=/home/liuxiu/opencv-arm :执行 make install,会将与体系无关的文件拷贝到此目录,即将一些可执行程序、动态链接库和静态链接库拷贝到此目录的相应目录下,具体如下:

/home/liuxiu/opencv-arm .......................................

      |

      +---bin............................................

             |

             ---cjeg

             |

             ---djpeg

             |

             ---jpegtran

             |

             ---rdjpgcom

             |

             ---wrjpgcom

      +---lib...........................................

             |

             ---libjpeg.la

             |

             ---libjpeg.so

             |

             ---libjpeg.so.62

             |

             ---libjpeg.so.62.0.0

修改生成的 Makefile文件:

# The name of your C compiler:

CC= gcc该成CC= arm-linux-gcc

# library (.a) file creation command

AR= ar rc该成AR= arm-linux-ar rc

# second step in .a creation (use "touch" if not needed)

AR2= ranlib该成AR2= arm-linux-ranlib

/home/liuxiu/opencv-arm 目录下建立 man/man1,include,lib,bin四个目录(好像是jpegMakefile不能创建这些目录)

3.编译安装

$ make

$ make install

注意:编译成功后可到opencv-arm文件中查看相应的文件

三、交叉编译 yasmx264xvidffmpeg

交叉编译 yasm

版本:yasm-0.7.2

1.解压进入当前目录

2.配置选项:

$ ./configure --enable-shared --prefix=/home/liuxiu/opencv-arm--host=arm-linux

3.编译安装

$ make

$ make install

交叉编译x264

版本:x264-snapshot-20100211-2245

1.解压进入当前目录

2.配置选项:

$ ./configure --prefix=/home/liuxiu/opencv-arm --enable-pic–enable-shared --cross-prefix=arm-linux- --host=arm-linux--extra-cflags=-I/home/liuxiu/opencv-arm/include--extra-ldflags=-L/home/liuxiu/opencv-arm/lib --enable-shared --enable-pthread–disable-asm

出现

./version.sh:2: git:未找到命令

Platform:  ARM

System:    LINUX

asm:       no

avs input: no

lavf input: no

ffms input: no

mp4 output: no

pthread:   yes

debug:     no

gprof:     no

PIC:       yes

shared:    yes

visualize: no

3.编译安装

$ make

$ make install

交叉编译 xvid

版本:xvidcore-1.1.3

1.解压并进入build/generic

2.配置选项:

$ ./configure --prefix=/home/liuxiu/opencv-arm –disable-assembly

3.编译安装

$ make

$ make install

Opencv2.0移植ARM(Cortex A8)全过程byHDU刘秀14年9月10日

交叉编译 ffmpeg

版本:ffmpeg-0.5_p20601

1.解压并进入目录

2.配置选项:

$ ./configure --cross-prefix=arm-linux- --enable-cross-compile--target-os=linux --cc=arm-linux-gcc --arch=arm--prefix=/home/liuxiu/opencv-arm --enable-shared --enable-static --enable-gpl--enable-ffmpeg --disable-ffplay --enable-pthreads --disable-yasm --cpu=armv6--enable-libx264 --enable-libxvid--extra-cflags=-I/home/liuxiu/opencv-arm/include–extra-ldflags=-L/home/liuxiu/opencv-arm/lib

出现

install prefix           /home/liuxiu/opencv-arm

source path              /home/liuxiu/ffmpeg-0.5_p20601

C compiler               arm-linux-gcc

.align is power-of-two   yes

ARCH                     arm(armv6)

big-endian               no

runtime cpu detection    no

ARMv5TE enabled          yes

ARMv6 enabled            yes

ARMv6T2 enabled          no

ARM VFP enabled          yes

IWMMXT enabled           no

NEON enabled             no

gprof enabled            no

debug symbols            yes

strip symbols            yes

optimizations            yes

static                   yes

shared                   yes

postprocessing support   no

new filter support       no

filters using lavformat  no

network support          yes

IPv6 support             yes

threading support        pthreads

SDL support              no

Sun medialib support     no

AVISynth enabled         no

libdc1394 support        no

libdirac enabled         no

libfaac enabled          no

libfaad enabled          no

libfaad dlopened         no

libgsm enabled           no

libmp3lame enabled       no

libnut enabled           no

libopencore-amrnb support no

libopencore-amrwb support no

libopenjpeg enabled      no

libschroedinger enabled  no

libspeex enabled         no

libtheora enabled        no

libvorbis enabled        no

libx264 enabled          yes

libxvid enabled          yes

zlib enabled             yes

bzlib enabled            no

3.编译安装

$ make

$ make install(如果不能成功的话,转到root用户下执行)

 

四、交叉编译 OpenCV

版本:Opencv-2.0.0

1. 解压并进入目录

2. 配置选项:./configure --host=arm-none-linux-gnueabi --without-gtk--with-carbon --without-quicktime --without-1394libs --with-ffmpeg--with-python --without-swig --enable-static --enable-shared --disable-aposCXX=arm-none-linux-gnueabi-g++ CPPFLAGS=-I/home/liuxiu/opencv-arm/includeLDFLAGS=-L/home/liuxiu/opencv-arm/lib --with-v4l --with-v4l2--prefix=/home/liuxiu/opencv-arm --libdir=/home/liuxiu/opencv-arm/lib--includedir=/home/liuxiu/opencv-arm/include CXXFLAGS=-D__STDC_CONSTANT_MACROSLIBS="-lavutil -lx264"

出现

General configuration================================================

 

    CXX:                      arm-none-linux-gnueabi-g++

    CXXCPP:                   arm-none-linux-gnueabi-g++-E

    CPPFLAGS:                -I/home/liuxiu/opencv-arm/include

    CXXFLAGS:                 -D__STDC_CONSTANT_MACROS

    LDFLAGS:                  -L/home/liuxiu/opencv-arm/lib

 

    Install path:             /home/liuxiu/opencv-arm

 

    Debug flags               

    Optimization flags        -DNDEBUG -O2 -fomit-frame-pointer

    MMX/SSE/SSE2/SSE3:       

    OpenMP support:           -fopenmp

    External BLAS &LAPACK:   no

 

HighGUI configuration================================================

 

    Windowing system--------------

    Use Carbon / Mac OSX:    no

    Use gtk+ 2.x:             no

    Use gthread:              no

 

    Image I/O---------------------

    Use ImageIO / Mac OSX:   no

    Use libjpeg:              yes

    Use zlib:                 yes

    Use libpng:               no

    Use libtiff:              no

    Use libjasper:            no

    UselibIlmImf/OpenEXR:    no

 

    Video I/O ---------------------

    Use QuickTime / Mac OS X:no

    Use xine:                 no

    Use gstreamer:            no

    Use ffmpeg:               yes

    Use dc1394 &raw1394:     no

    Use dc1394_v2 &raw1394:  no

    Use v4l:                  yes

    Use v4l2:                 yes

    Use unicap:               no

 

Wrappers for other languages=========================================

 

    SWIG                     

    Python                    no

    Octave                    no

 

Additional build settings============================================

 

    Build demo apps           yes

 

Now run make ...

注意我一直在ffmpeg配置上不成功就是由于没有加上CXXFLAGS=-D__STDC_CONSTANT_MACROSLIBS="-lavutil -lx264" 会出现Use ffmpeg选项上是No,当时我就是查看config.log上会出现

configure:17992: checking for libavformat/avformat.h

configure:17992: result: yes

configure:18005: checking for library containingavcodec_decode_video

configure:18036: arm-none-linux-gnueabi-g++ -o conftest  -I/home/liuxiu/opencv-arm/include-L/home/liuxiu/opencv-arm/lib conftest.cpp -lrt -lz -lpthread -ldl -lm  >&5

/tmp/ccAI35bH.o: In function `main':

conftest.cpp:(.text+0x8): undefined reference to`avcodec_decode_video'

collect2: ld returned 1 exit status

configure:18036: $? = 1

configure: failed program was:

| /* confdefs.h */

| #define PACKAGE_NAME "opencv"

| #define PACKAGE_TARNAME "opencv"

| #define PACKAGE_VERSION "2.0.0"

| #define PACKAGE_STRING "opencv 2.0.0"

| #define PACKAGE_BUGREPORT"opencvlibrary-devel@lists.sourceforge.net"

| #define PACKAGE_URL ""

| #define PACKAGE "opencv"

| #define VERSION "2.0.0"

| #define STDC_HEADERS 1

| #define HAVE_SYS_TYPES_H 1

| #define HAVE_SYS_STAT_H 1

| #define HAVE_STDLIB_H 1

| #define HAVE_STRING_H 1

| #define HAVE_MEMORY_H 1

| #define HAVE_STRINGS_H 1

| #define HAVE_INTTYPES_H 1

| #define HAVE_STDINT_H 1

| #define HAVE_UNISTD_H 1

| #define HAVE_DLFCN_H 1

| #define LT_OBJDIR ".libs/"

| #define HAVE_LIBM 1

| #define HAVE_LIBDL 1

| #define HAVE_LIBPTHREAD 1

| #define HAVE_LIBZ 1

| #define HAVE_ALLOCA_H 1

| #define HAVE_ALLOCA 1

| #define HAVE_MALLOC_H 1

| #define HAVE_ASSERT_H 1

| #define HAVE_LRINT 1

| #define HAVE_FFMPEG_AVCODEC_H 1

| #define HAVE_LIBAVCODEC_AVCODEC_H 1

| #define HAVE_FFMPEG_AVFORMAT_H 1

| #define HAVE_LIBAVFORMAT_AVFORMAT_H 1

| /* end confdefs.h.  */

|

| /* Override any GCC internal prototype to avoid an error.

|    Use char because intmight match the return type of a GCC

|    builtin and then itsargument prototype would still apply.  */

| #ifdef __cplusplus

| extern "C"

| #endif

| char avcodec_decode_video ();

| int

| main ()

| {

| return avcodec_decode_video ();

|   ;

|   return 0;

| }

configure:18036: arm-none-linux-gnueabi-g++ -o conftest  -I/home/liuxiu/opencv-arm/include-L/home/liuxiu/opencv-arm/lib conftest.cpp -lavcodec_pic  -lrt -lz -lpthread -ldl -lm  >&5

/home/liuxiu/opt/FriendlyARM/toolschain/4.5.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.5.1/../../../../arm-none-linux-gnueabi/bin/ld:cannot find -lavcodec_pic

collect2: ld returned 1 exit status

经过不断查看帖子,我认为是Opencv的进行编译测试的时候没有将ffmpeg依赖的x264的库文件包含进去。

3. 编译安装

$ make

$ make install

五、移植arm板上所需要库(opencv+jpeg+xvid+x264+ffmpeg):

1. 将/home/liuxiu/opencv-arm/lib下生成的库文件

libavcodec.so.52.42.0

libavdevice.so.52.2.0

libavutil.so.50.4.0

libcv.so.4.0.0

libcvaux.so.4.0.0

libcxcore.so.4.0.0

libhighgui.so.4.0.0

libjpeg.so.62.0.0

libml.so.4.0.0

libswscale.so.0.7.1

libx264.so.84

libxvidcore.so.4.1

拷出来全部重命名

lib*.so.加后面一位数字,然后拷贝到arm板上/lib的目录下面,(或者也可以复制到板子上一个文件夹,然后#exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR/lib/DIR )

2. 拷贝完,我后面在arm板运行的时候,提示缺少一种libgomp.so.4的文件,我就在友善之臂的arm-linux-gcc压缩包里面的lib目录下找到,拷贝进去,实现运行成功。

六、编译源文件方法

arm-none-linux-gnueabi-g++ test.cpp -o test-L/home/liuxiu/opencv-arm/lib -I/home/liuxiu/opencv-arm/include/opencv  -lcv -lcxcore -lpthread -lrt -lcvaux -lm-lavformat -lavutil -ljpeg -lz -lml -lhighgui -ldl -lswscale -lx264 -lxvidcore-lavcodec

七、最后,将生成的二进制文件拷到板子上,chmod一下就可运行。

 

后记

在opencv交叉编译过程中会遇到各种问题,需要耐心去分析各种错误,上面介绍的全过程只是把一些我所要的常用的配置成功,可以根据自己的需要另行配置其他的opencv所支持的库。

 

Opencv2.0移植ARM(Cortex A8)全过程byHDU刘秀14年9月10日

 

0 0
原创粉丝点击