OpenCV ffmpeg移植到ARM平臺(tái)
那么如何用OpenCV讀寫(xiě)ARM板上的視頻文件,并進(jìn)行視頻處理呢?這該又將如何移植呢?
本文引用地址:http://m.butianyuan.cn/article/201611/317669.htm這個(gè)就必須要裝x264,xvid和ffmpeg,和上一篇中講的通過(guò)V4L2底層函數(shù)獲取攝像頭視頻就有點(diǎn)不一樣了。
下面就介紹一種方法。
測(cè)試環(huán)境: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 解壓進(jìn)入目錄
3 配置
#./configure --prefix=/root/libjpeg-arm --exec-prefix=/root/libjpeg-arm --enable-shared
--enable-static
下面分別介紹這幾個(gè)參數(shù)的作用:
--prefix=/root/libjpeg-arm : 執(zhí)行make install 后,會(huì)將與體系無(wú)關(guān)的文件拷貝到此目錄下,具
體如下:
/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 : 執(zhí)行make install 后,會(huì)將與體系無(wú)關(guān)的文件拷貝到此目錄
下,即將一些可執(zhí)行程序、動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)拷貝到此目錄的相應(yīng)目錄下,具體如下:
/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編譯成動(dòng)態(tài)鏈接庫(kù) 。
4 修改生成的Makefile文件:
# The name of your C compiler:
CC= gcc 該成 CC= /root/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc
(根據(jù)你自己交叉編譯器的位置修改)
# 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四個(gè)目錄
6 # make
# make install
7 將/root/libjpeg-arm/include/中(jconfig.h, jerror.h, jmorecfg.h, jpeglib.h)四個(gè)頭文件拷
貝到:/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)四個(gè)庫(kù)
文件拷貝到:/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib中
注意:執(zhí)行以下命令檢查生成的libjpeg.so是否為ARM版:
# file libjpeg.so
以下為正確輸出,否則檢查交叉編譯器路徑以及Makefile并重新編譯。
注意:執(zhí)行完以上操作后執(zhí)行以下命令檢查庫(kù)文件是否已正確安裝:
# arm-linux-gcc -print-file-name=libjpeg.so
如果輸出為"libjpeg.so"則說(shuō)明沒(méi)有正確安裝,重復(fù)7步驟。
如果輸出為"DIR/libjpeg.so"則說(shuō)明安裝正確。
至此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,解壓進(jìn)入目錄
(1).配置
# ./configure --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --enableshared
(2).修改配置參數(shù)
修改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解壓并進(jìn)入build/generic
配置
# ./configure --prefix=/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/ --disableassembly
[解釋]--disable-assembly :因?yàn)閤vid沒(méi)有針對(duì)ARM的匯編優(yōu)化,所以編譯時(shí)必須關(guān)掉匯
編
修改Makefile引用的platform.inc文件,將CC=gcc改為CC=arm-linux-gcc
# make
# make install
成功后進(jìn)入example文件夾
測(cè)試,輸入
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下生成相應(yīng)的頭文件和庫(kù)文件
4 交叉編譯ffmpeg
到http://download.chinaunix.net/download.php?id=5532&ResourceID=2990在這個(gè)網(wǎng)址
上下載ffmpeg-0.4.9-p20051120.tar.bz2,然后解壓。
修改configure文件,要修改的如下
由于cc、ar、ranlib、strip都是交叉編譯環(huán)境中的執(zhí)行文件,可以這樣配置
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下生成相應(yīng)的頭文件和庫(kù)文件
至此,OpenCV所依賴的庫(kù)都交叉編譯完成,并在交叉編譯鏈中的include,bin,share,lib下
有相應(yīng)的文件
三 交叉編譯OpenCV
下載OpenCV-1.0.0源碼 http://www.opencv.org.cn/download/opencv-1.0.0.tar.gz
解壓進(jìn)入目錄配置
# ./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
說(shuō)明:
--host=arm-none-linux-gnueabi :指出交叉編譯arm平臺(tái)
--without-gtk:忽略gtk+2.0 windows
--without-carbon: 不使用Mac OS上的X庫(kù)
--without-quicktime
--without-1394libs
--without-ffmpeg
--without-python
--without-swig
--enable-static :生成靜態(tài)庫(kù)
--enable-shared :生成動(dòng)態(tài)庫(kù)
CXX=arm-none-linux-gnueabi-g++ : 指定編譯工具
CPPFLAGS=-I/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/include :
OpenCV會(huì)用到一些dev的包,如png.h,jpeglib.h,大部分頭文件在/usr/include下
--prefix=/root/opencv-arm :指定安裝目錄
-libdir=/root/opencv-arm/lib: 指定庫(kù)文件安裝位置
--includedir=/root/opencv-arm/include:指定包含文件安裝位置
如果配置正確,會(huì)有下面信息
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上運(yùn)行OpenCV所需庫(kù):
1 將/root/opencv-arm/lib下生成的庫(kù)文件
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
拷出來(lái)全部重命名
*.so.1
2 加上之前的庫(kù)文件,將/root/arm-none-linux-gnueabi/arm-none-linux-gnueabi/lib下的
libjpeg,xvid,x264,ffmpeg庫(kù)都拷出來(lái)放去板子的/usr/lib或者/lib下,也可以到板子上一
個(gè)文件夾,然后#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/YOUR/lib/DIR
3 OpenCV所需庫(kù)總表:
編譯源文件方法
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
最后,將生成的二進(jìn)制文件拷到板子上就可運(yùn)行
評(píng)論