前一篇写了如何在移植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=nasmASFLAGS=-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所需库总表:

opencv移植qt opencv移植到arm板_opencv移植qt

编译源文件方法

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


最后,将生成的二进制文件拷到板子上就可运行