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日
前言
本人在移植Opencv到ARM-linux系统上经历坎坷的路程,由当初师兄手把手教如何交叉编译移植一个不成功的Opencv1.0的交叉编译库(ffmpeg一直移植不成功)。到之后在项目中需要ffmpeg解码,想方设法曾经利用v4l2进行camrea数据的读取,奈何mjpeg解码迟迟没有成功;项目上问题不得不解决,心想Opencv已经是很成熟肯定能配置成功ffmpeg的,就不断地百度经过半个月的编译终于成功了。于是写下这篇文档帮助那些和我一样遇到这样困难的人,如有错误请联系我将改正。
准备工作
首先得选择一个linux系统,比如Fedora、Redhat、ubuntu等等。讲讲我采用的环境,我也是属于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四个目录(好像是jpeg中Makefile不能创建这些目录)
3.编译安装
$ make
$ make install
注意:编译成功后可到opencv-arm文件中查看相应的文件
三、交叉编译 yasm,x264,xvid,ffmpeg
交叉编译 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日
- Opencv2.0移植ARM(Cortex A8)全过程
- 移植Qt-5.5.0到ARM Cortex-A8
- ubuntu上移植Qt-5.6.0到ARM Cortex-A8
- cortex-A8 ARM核 opencv程序移植 (2)
- cortex-A8 ARM核 opencv程序移植 (3)
- cortex-A8 ARM核 opencv程序移植 (4)
- cortex-A8 ARM核 opencv程序移植
- ARM Cortex-A8 介绍
- ARM Cortex-A8体系结构基础
- ARM Cortex A8之S5PV210
- [嵌入式]ARM Cortex-A8体系结构
- ubuntu 12.0.4环境下crosstool-ng 1.18.0编译ARM交叉编译器(Cortex-A8)
- ubuntu 12.0.4环境下crosstool-ng 1.18.0编译ARM交叉编译器(Cortex-A8)
- (转)三星ARM Cortex-A8 S5PV210(蜂鸟)简介
- 三星S5PV210(ARM-Cortex A8)中断过程图解
- 三星S5PV210(ARM Cortex-A8)的时钟分频系统
- 三星S5PV210(ARM-Cortex A8)中断过程图解
- opencv2.0移植到ARM
- COREDATA
- 标准C++中的string类的用法总结
- 【OC学习-32】KVO-用一个对象监控另一个对象的属性,如有变化,则输出需要的结果
- 正则表达式匹配任意字符串(包括换行符)
- GoF设计模式概览
- Opencv2.0移植ARM(Cortex A8)全过程
- 使用SecureCRT上传和下载文件
- Linux Shell脚本中点号和source命令
- 代码生成器 CodeSmith 的使用(二)
- Emmet:HTML/CSS代码快速编写神器
- Opencv2 computer vision application programming cookbook<一>
- 美好的生活
- dbcp 数据库缓冲池
- 面向对象编程