转自http://blog.163.com/thinki_cao/blog/static/8394487520134209235258/
软件包地址:pan.baidu.com/......
主机平台(HOST):KUbuntu12.04
目标平台(TARGET):嵌入式Linux系统 3.x内核(Xilinx ZEDBoard)
由于OpenCV需要进行视频中的运动检测与分割,自然要用到相关函数打开AVI视频.如果只使用OpenCV进行交叉编译,那么默认情况下不支持AVI格式的打开与写入,这是因为少了很多解码库与编码库,如x264,ffmpeg等,因此首先要对这些库进行一次交叉编译后,再进行OpenCV库的交叉编译才能支持AVI格式的视频,这里首先给出OpenCV交叉编译时各个库的依赖关系:
OpenCV
|--------zlib
|--------jpeg
|--------libpng
|--------zlib
|--------tiff
|--------zlib
|--------ffmpeg
|--------x264
|--------xvidcore
其中各个源码包之间的依赖关系还是有一定的讲究的,否则很容易编译通不过,这里建议下载较新的稳定版进行交叉编译,下面列出本人已经成功编译通过的源码包版本:
ffmpeg-0.10.3
tiff-4.0.3
jpeg-8d
x264-snapshot-20120528-2245-stable
libpng-1.5.14
xvidcore-1.3.2
OpenCV-2.4.3
zlib-1.2.7
环境变量如下(最好在/etc/profile中添加):
export PATH=/opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH
#交叉编译工具链
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
#编译Xilinx ZEDBoard linux内核时需要的一个环境变量(根据需要设)
export ZYNQ_QT_BUILD=/zynq/qt/qt-everywhere-opensource-src-4.8.3
export ZYNQ_CV_INSTALL=/zynq/opencv/opencv-lib
#OpenCV交叉编译库的安装路径
————————————————————————————————————————————————
OpenCV-2.4.3
依赖库的配置以及注意事项如下:
(有的CFLAGS中会有一些默认选项,如果直接覆盖可能会与默认配置不太一样,大家可以先用默认的configure配置一遍查看一下默认的CFLAGS中还有哪些选项,然后加在configure的CFLAGS选项中)
zlib-1.2.7
export CC=arm-xilinx-linux-gnueabi-gcc
./configure --prefix=$ZYNQ_CV_INSTALL --shared
make
make install
注意:这里需要事先声明CC变量,zlib中没有配置--host之类的选项
(如果要开启ARM的NEON优化,需要修改Makefile中的CFLAGS,在最后加上
-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)
jpeg-8d
./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared
make
make install
(如果要开启ARM的NEON优化,需要修改Makefile中的CFLAGS,在最后加上
-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)
libpng 1.5.14
./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-arm-neon --enable-shared --with-pkgconfigdir=$ZYNQ_CV_INSTALL/lib/pkgconfig LDFLAGS=”-L$ZYNQ_CV_INSTALL/lib" CFLAGS="-I$ZYNQ_CV_INSTALL/include"
make
make install
注意:libpng编译过程中可能会用到zlib之类的库,因此我们需要添加额外的LDFLAGS和CFLAGS变量,更多的信息可以通过./configure --help进行参考
(如果要开启ARM的NEON优化,需要修改在configure中的CFLAGS最后加上
-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)
x264-snapshot-20120528-2245-stable
./configure --host=arm-linux --cross-prefix=arm-xilinx-linux-gnueabi- --enable-shared --prefix=$ZYNQ_CV_INSTALL
make
make install
(如果要开启ARM的NEON优化,需要在configure最后加上
--extra-cflags="-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp")
xvidcore-1.3.2
cd build/generic
./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi
make
make install
(如果要开启ARM的NEON优化,需要在当前目录下的config.status文件中的S["CFLAGS"]开头的那行最后加上
-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)
tiff-4.0.3
./configure --prefix=$ZYNQ_CV_INSTALL --host=arm-xilinx-linux-gnueabi --enable-shared LDFLAGS=-L$ZYNQ_CV_INSTALL/lib CFLAGS="-I$ZYNQ_CV_INSTALL/include -g -O2 -Wall -W"
CXXFLAGS="-I$ZYNQ_CV_INSTALL/include -g -O2"
make
make install
注意:tiff编译过程中可能会用到zlib之类的库,因此我们需要添加额外的LDFLAGS和CFLAGS变量,更多的信息可以通过./configure --help进行参考
(如果要开启ARM的NEON优化,需要在configure中的CFLAGS和CXXFLAGS最后都加上
-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)
ffmpeg-0.10.3
./configure --prefix=$ZYNQ_CV_INSTALL --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --cpu=armv7-a --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-xilinx-linux-gnueabi-gcc --enable-swscale --extra-cflags=-I$ZYNQ_CV_INSTALL/include --extra-ldflags=-L$ZYNQ_CV_INSTALL/lib --disable-asm
make
make install
注意:ffmpeg编译过程中可能会用到x264,xvid,zlib等之类的库,因此我们需要添加额外的LDFLAGS和CFLAGS变量,更多的信息可以通过./configure --help进行参考,ffmpeg的编译中可能会调用arm指令集,但是在ZEDBoard上的ARM v7指令集的CortexA9核心只能支持Thumb/Thumb2,因此这里需要禁用汇编选项--disable-assembly
(如果要开启ARM的NEON优化,需要删除原来的"disable-asm"并且在configure中的CFLAGS和CXXFLAGS最后都加上
-march=armv7-a -mfpu=neon -mfloat-abi=softfp,注意这里不能加-mcpu=cortex-a9,否则编译器会报bug,
然后检查config.h 里面 HAVE_NEON 是不是有被置成 1,并且成功的话,libavcodec/arm/ 会有 *neon* 的目标文件被生成
)
OpenCV2.4.3交叉编译过程:
由于OpenCV从2.0以后的版本开始都是使用Cmake进行配置管理的,因此我们需要安装相关的工具(对于PC机上OpenCV的本地编译,可以参考官方网站上的
Installation in Linux)
,交叉编译的情况下我们需要安装cmake以及cmake-gui(包含在cmake-qt-gui中):
首先解压OpenCV2.4.3:sudo apt-get install cmake cmake-qt-gui
tar xvf OpenCV-2.4.3.tar.bz2
然后进入源码目录再新建一个build文件夹并进入build文件夹目录:
cd OpenCV - 2.4 . 3mkdir buildcd build
在当前目录下新建toolchain.cmake文档,内容如下:
###########user defined#############
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-xilinx-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-xilinx-linux-gnueabi-g++ )
###########user defined#############
set( CMAKE_FIND_ROOT_PATH "/zynq/opencv/opencv-lib" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
######################################
注意:最后的四行是用于交叉编译情况下依赖库查找路径以及查找模式的,它对于cmake能否找到依赖库来说非常重要
然后进行cmake的配置:
cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../
注意:
1. cmake的配置过程会修改OpenCV源码中的内容,因此如果配置失败的话请从解压源码开始从头来过.
2. 配置过程开始之后会出现一堆的配置信息,如果出现问题请仔细参考配置信息.
3. 查找依赖库的过程中调用pkg-config工具进行查找,对应的cmake命令在OpenCV-2.4.3/cmake/OpenCVFindPkgConfig.cmake文件中,如果配置出现问题或者不能找到对应的库路径,可以在使用cmake重新配置之前在OpenCVFindPkgConfig.cmake找到#message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}"),将#删除,在配置过程中会输出pkg-config的查找过程,这是一个很不错的查错方式
配置完成以后在当前目录下执行cmake-gui,设置好源码路径(OpenCV-2.4.3)与编译路径(OpenCV-2.4.3/build),将不要的东西全部勾掉,最后点击config之后出现如下配置信息:
(如果要开启ARM的NEON优化,需要在cmake-gui中的设置环境变量,即CMAKE_CFLAGS和CMAKE_CXXFLAGS最后都加上
-mcpu=cortex-a9 -march=armv7-a -mfpu=neon -mfloat-abi=softfp)
General configuration for OpenCV 2.4.3 =====================================
Version control: exported
Platform:
Host: Linux 3.2.0-37-generic-pae i686
Target: Linux arm
CMake: 2.8.7
CMake generator: Unix Makefiles
CMake build tool: /usr/bin/make
Configuration: Release
C/C++:
Built as dynamic libs?: YES
C++ Compiler: /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-g++ (ver 4.6.1)
C++ flags (Release): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG -DNDEBUG
C++ flags (Debug): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g -O0 -DDEBUG -D_DEBUG -ggdb3
C Compiler: /opt/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-gcc
C flags (Release): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -O3 -DNDEBUG -DNDEBUG
C flags (Debug): -W -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -g -O0 -DDEBUG -D_DEBUG -ggdb3
Linker flags (Release):
Linker flags (Debug):
Precompiled headers: YES
OpenCV modules:
To be built: core imgproc flann highgui features2d calib3d ml video objdetect contrib nonfree photo legacy gpu stitching ts videostab
Disabled: python world
Disabled by dependency: -
Unavailable: androidcamera java ocl
GUI:
QT 4.x: NO
GTK+ 2.x: NO
GThread : NO
GtkGlExt: NO
OpenGL support: NO
Media I/O:
ZLib: zlib (ver 1.2.7)
JPEG: libjpeg (ver 62)
PNG: build (ver 1.5.12)
TIFF: build (ver 42 - 4.0.2)
JPEG 2000: build (ver 1.900.1)
OpenEXR: build (ver 1.7.1)
Video I/O:
DC1394 1.x: NO
DC1394 2.x: NO
FFMPEG: YES
codec: YES (ver 53.61.100)
format: YES (ver 53.32.100)
util: YES (ver 51.35.100)
swscale: YES (ver 2.1.100)
gentoo-style: YES
GStreamer: NO
OpenNI: NO
OpenNI PrimeSensor Modules: NO
PvAPI: NO
GigEVisionSDK: NO
UniCap: NO
UniCap ucil: NO
V4L/V4L2: NO/YES
XIMEA: NO
Xine: NO
Other third-party libraries:
Use TBB: NO
Use Cuda: NO
Use OpenCL: NO
Use Eigen: NO
Python:
Interpreter: /usr/bin/python (ver 2.7.3)
Tests and samples:
Tests: NO
Performance tests: NO
Examples: NO
Install path: /zynq/opencv/OpenCV-2.4.3-cross/OpenCV-2.4.3/build/install
cvconfig.h is in: /zynq/opencv/OpenCV-2.4.3-cross/OpenCV-2.4.3/build
-----------------------------------------------------------------
Configuring done
最后点击generate,生成makefile,之后就是我们熟悉的:
make
make install
PS:不要忘了在cmake-gui中配置安装路径,对应的环境变量是CMAKE_INSTALL_PREFIX
到此OpenCV-2.4.3的编译与安装就已经完成了。