前一篇写了如安在移植OpenCV库到ARM渠道上,原本我仅仅用到OpenCV的翻开USB摄像头获取图画到IplImage结构中,这用到了V4L2的底层函数。然后进行视频图画的帧处理。
那么怎么用OpenCV读写ARM板上的视频文件,并进行视频处理呢?这该又将怎么移植呢?
这个就有必要要装x264,xvid和ffmpeg,和上一篇中讲的经过V4L2底层函数获取摄像头视频就有点不一样了。
下面就介绍一种办法。
测验环境:Ubuntu 12.04 LTS
OpenCV版别:1.0
穿插编译器:arm-none-linux-gnueabi-4.3.2
过程如下:
一 穿插编译libjpeg
为了使OpenCV能处理jpeg图画,咱们有必要事前穿插编译好libjpeg
这儿运用的版别是jpegsrc.v6b
1 下载libjpeg源码:ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz
2 解压进入目录
3 装备
#./configure –prefix=/root/libjpeg-arm –exec-prefix=/root/libjpeg-arm –enable-shared
–enable-static
下面别离介绍这几个参数的效果:
–prefix=/root/libjpeg-arm : 履行make install 后,会将与系统无关的文件复制到此目录下,具
体如下:
/root/libjpeg-arm……………………………….
|
+—include………………………………….
|
—jconfig.h
|
—jerror.h
|
—jmorecfg.h
|
—jpeglib.h
+—man……………………………………..
|
+—man1…………………………………
|
—cjeg.1
|
—djpeg.1
|
—jpegtran.1
|
—rdjpgcom.1
|
—wrjpgcom.1
–exec-prefix=/root/libjpeg-arm : 履行make install 后,会将与系统无关的文件复制到此目录
下,行将一些可履行程序、动态链接库和静态链接库复制到此目录的相应目录下,详细如下:
/root/libjpeg-arm………………………………….
|
+—bin……………………………………..
|
—cjeg
|
—djpeg
|
—jpegtran
|
—rdjpgcom
|
—wrjpgcom
+—lib…………………………………….
|
—libjpeg.la
|
—libjpeg.so
|
—libjpeg.so.62
|
—libjpeg.so.62.0.0
–enable-shared : 用GNU libtool编译成动态链接库 。
4 修正生成的Makefile文件:
# The name of your C compiler:
CC= gcc 该成 CC= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc
(依据你自己穿插编译器的方位修正)
# library (.a) file creation command
AR= ar rc 该成 AR= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ar rc
(同上)
# second step in .a creation (use “touch” if not needed)
AR2= ranlib 该成 AR2= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabiranlib
(同上)
5 在/root/libjpeg-arm目录下树立 man/man1,include,lib,bin四个目录
6 # make
# make install
7 将/root/libjpeg-arm/include/中(jconfig.h, jerror.h, jmorecfg.h, jpeglib.h)四个头文件拷
贝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include中。
将/root/libjpeg-arm/lib中(libjpeg.la, libjpeg.so, libjpeg.so.62, libjpeg.so.62.0.0)四个库
文件复制到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib中
留意:履行以下指令查看生成的libjpeg.so是否为ARM版:
# file libjpeg.so
以下为正确输出,不然查看穿插编译器途径以及Makefile偏重新编译。
留意:履行完以上操作后履行以下指令查看库文件是否已正确装置:
# arm-linux-gcc -print-file-name=libjpeg.so
假如输出为”libjpeg.so”则阐明没有正确装置,重复7过程。
假如输出为”DIR/libjpeg.so”则阐明装置正确。
至此libjpeg穿插编译完结。
二 穿插编译 x264,xvid,ffmpeg
为了使OpenCV能处理视频,咱们要事前穿插编译ffmpeg,而ffmpeg又是依靠x264和
xvid的。
1 下载yasm:
到 http://www.tortall.net/projects/yasm/wiki/Download 下载yasm0.7.2(x264需要用
到的汇编编译器)
# ./configure –enable-shared –prefix=/root/arm-none-linux-gnueabi/arm-none-linuxgnueabi/
–host=arm-linux
# make
# make install
2 穿插编译x264
到 ftp://ftp.videolan.org/pub/videolan/x264/snapshots/ 下载x264-snapshot-20060805-
2245.tar.bz2,解压进入目录
(1).装备
# ./configure –prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ –enableshared
(2).修正装备参数
修正config.mak:
prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
includedir=${prefix}/include
# 这儿改为ARM
ARCH=ARM
SYS=LINUX
# 这儿改为arm-linux-gcc
CC=arm-linux-gcc
# 这儿去掉-DHAVE_MMXEXT -DHAVE_SSE2 -DARCH_X86
CFLAGS=-Wall -I. -O4 -ffast-math -D__X264__ -DHAVE_MALLOC_H -DSYS_LINUX
-DHAVE_PTHREAD -s -fomit-frame-pointer
LDFLAGS= -lm -lpthread -s
AS=nasm
ASFLAGS=-O2 -f elf
VFW=no
GTK=no
EXE=
VIS=no
HAVE_GETOPT_LONG=1
DEVNULL=/dev/null
CONFIGURE_ARGS= –enable-shared –prefix=/root/arm-none-linux-gnueabi/armnone-
linux-gnueabi/
SONAME=libx264.so.49
default: $(SONAME)
修正Makefile,将66~68行的ar和ranlib改为arm下的:
libx264.a: .depend $(OBJS) $(OBJASM)
arm-linux-ar rc libx264.a $(OBJS) $(OBJASM)
arm-linux-ranlib libx264.a
(3).编译装置
# make
# make install
这儿能够在穿插编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的
lib下生成libx264.so
3 穿插编译xvid
到 http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz 下载xvid
下载xvid解压并进入build/generic
装备
# ./configure –prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ –disableassembly
[解说]–disable-assembly :因为xvid没有针对ARM的汇编优化,所以编译时有必要关掉汇
编
修正Makefile引证的platform.inc文件,将CC=gcc改为CC=arm-linux-gcc
# make
# make install
成功后进入example文件夹
测验,输入
arm-linux-gcc -o xvid_encraw xvid_encraw.c -lc -lm -I../src/ -L../build/generic/=build
-lxvidcore
即可生成xvid_encraw
这儿能够在穿插编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的
include,lib下生成相应的头文件和库文件
4 穿插编译ffmpeg
到http://download.chinaunix.net/download.php?id=5532&ResourceID=2990在这个网址
上下载ffmpeg-0.4.9-p20051120.tar.bz2,然后解压。
修正configure文件,要修正的如下
因为cc、ar、ranlib、strip都是穿插编译环境中的履行文件,能够这样装备
prefix=”/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/”
cross_prefix=”root/arm-none-linux-gnueabi/bin/arm-linux-“
cpu=”arm”
装备
# ./configure –cpu=arm –cc=arm-linux-gcc –enable-shared –disable-ffserver –enablexvid
–enable-x264 –enable-gpl –enable-pthreads –disable-strip
# make
# make install
这儿能够在穿插编译链目录/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/的
include,lib下生成相应的头文件和库文件
至此,OpenCV所依靠的库都穿插编译完结,并在穿插编译链中的include,bin,share,lib下
有相应的文件
三 穿插编译OpenCV
下载OpenCV-1.0.0源码 http://www.opencv.org.cn/download/opencv-1.0.0.tar.gz
解压进入目录装备
# ./configure –host=arm-none-linux-gnueabi –without-gtk –without-carbon –withoutquicktime
–without-1394libs –with-ffmpeg –without-python –without-swig –enable-static
–enable-shared –disable-apps CXX=arm-none-linux-gnueabi-g++ CPPFLAGS=-
I/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include LDFLAGS=-L/root/arm-
none-linux-gnueabi/arm-none-linux-gnueabi/lib –with-v4l –prefix=/root/opencv-arm
–libdir=/root/opencv-arm/lib –includedir=/root/opencv-arm/include
阐明:
–host=arm-none-linux-gnueabi :指出穿插编译arm渠道
–without-gtk:疏忽gtk+2.0 windows
–without-carbon: 不运用Mac OS上的X库
–without-quicktime
–without-1394libs
–without-ffmpeg
–without-python
–without-swig
–enable-static :生成静态库
–enable-shared :生成动态库
CXX=arm-none-linux-gnueabi-g++ : 指定编译东西
CPPFLAGS=-I/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include :
OpenCV会用到一些dev的包,如png.h,jpeglib.h,大部分头文件在/usr/include下
–prefix=/root/opencv-arm :指定装置目录
-libdir=/root/opencv-arm/lib: 指定库文件装置方位
–includedir=/root/opencv-arm/include:指定包括文件装置方位
假如装备正确,会有下面信息
General configuration ================================================
Compiler: arm-none-linux-gnueabi-g++
CXXFLAGS: -Wall -fno-rtti -pipe -O3 -fomit-frame-pointer
Install path: /root/opencv-arm
HighGUI configuration ================================================
Windowing system ————–
Use Carbon / Mac OS X: no
Use gtk+ 2.x: no
Use gthread: no
Image I/O ——————–
Use libjpeg: yes
Use zlib: yes
Use libpng: yes
Use libtiff: no
Use libjasper: no
Use libIlmImf: no
Video I/O ———————
Use QuickTime / Mac OS X: no
Use xine: no
Use ffmpeg: yes
Use dc1394 & raw1394: no
Use v4l: yes
Use v4l2: yes
Wrappers for other languages =========================================
SWIG
Python no
Additional build settings ============================================
Build demo apps no
Now run make …
===================================================================
===
# make
# make install
arm上运转OpenCV所需库:
1 将/root/opencv-arm/lib下生成的库文件
libcvaux.so.1.0.0
libcv.so.1.0.0
libcxcore.so.1.0.0
libhighgui.so.1.0.0
libml.so.1.0.0
拷出来悉数重命名
*.so.1
2 加上之前的库文件,将/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib下的
libjpeg,xvid,x264,ffmpeg库都拷出来放去板子的/usr/lib或许/lib下,也能够到板子上一
个文件夹,然后#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR/lib/DIR
3 OpenCV所需库总表:
编译源文件办法
arm-none-linux-gnueabi-g++ demo.c -o demo -I/root/opencv-arm/include/opencv
-L/root/opencv-arm/lib -lcv -lcxcore -lpthread -lrt -lcvaux -lm -lpng -ljpeg -lz -lml -lhighgui
-ldl
最终,将生成的二进制文件拷到板子上就可运转