Opencv在Crotex-A8的移植(pcduino)
也是前几个月就移植完了的,一直没机会写一个总结文档。后来想想,总结文档还是很有必要写写的,提高自己方便他人。Opencv的移植要比QT的移植难一些,我移植的时候也是参考了很多网上的文章,但是最后还是靠推断,才解决问题。Opencv这个库还是很强大的,我还是比较看好这个库在ARM平台上的运行的,现在ARM平台的速度,也不比PC差到哪里去了,移动的角度来说,还是很有优势的。我也做过DSP下的图像处理一段时间,但是DSP的话,通用性要差些,不同的芯片系类有不同的优化指令,底层算法往往改动性很大。但是同级别的DSP运算速度确实很快。
硬件:Pcduino(Cortex-a8, 1GHZ);
软件:Linux linaro-developer 3.4.29+;(无界面板,没有安装X Server图形接口)
编译环境:Ubuntu12.04 (32位),交叉编译器arm-linux-gnueabihf-g++
Opencv版本:opencv-2.4.5
Cmak版本:CMake-gui 2.8.7
在编译Opencv时候,要用到很多第三方的库,所以我们要把这些第三方的库都编译好之后,才可以编译Opencv。这里我所用到的第三方库有:zlib127.zip,jpegsrc.v8d.tar.gz,libpng-1.5.17, x264-snapshot-20120528-2245-stable.tar.bz2,xvidcore-1.3.2.tar.gz,
tiff-4.0.3.tar.gz,ffmpeg-0.10.3.tar.bz2,一共7个库。
考虑到要编译的库较多,我们采用设置环境变量和用shell脚本的方式来编译这些库。
首先下载这些库。这些库比较难找我在这里给出下载路径:http://pan.baidu.com/share/link?shareid=2450342524&uk=487907638
一, 设置环境变量
在opencv源码目录下:
export COMPILE_PREFIX=arm-linux-gnueabihf-
export INSTALL_PREFIX=`pwd`/crosscompile_root
export DL_FOLDER=`pwd`/dl
export BUILD_FOLDER=`pwd`/buildpool
export CC=${COMPILE_PREFIX}gcc
同时建立opencv源码目录下建立 crosscompile_root,dl, buildpool三个编译目录。把下载到的库源码复制到dl目录下。
这些库有相互依赖关系,所以编译的时候请按照一下顺序来。在这些库目录dl下:
1.编译zlib127.zip库
pushd $BUILD_FOLDER
unzip $DL_FOLDER/zlib127.zip
pushd zlib-1.2.7
./configure --prefix=$INSTALL_PREFIX
make
make install
popd
以上可以写作一个脚本zlib.sh,书写注意格式不该有的空格不要有。
可以看出这个库已经编译成功了。
2.编译jpeg-8d,脚本如下:
tar xf $DL_FOLDER/jpegsrc.v8d.tar.gz
pushd jpeg-8d
./configure --host=arm-linux-gnueabihf --prefix=$INSTALL_PREFIX
mkdir -p $INSTALL_PREFIX/bin
mkdir -p $INSTALL_PREFIX/man/man1
make
make install
popd
3 编译png ,脚本如下:
tar xf $DL_FOLDER/libpng-1.5.14.tar.gz
pushd libpng-1.5.14
./configure --host=arm-linux-gnueabihf --prefix=$INSTALL_PREFIX CPPFLAGS=-I$INSTALL_PREFIX/include LDFLAGS=-L$INSTALL_PREFIX/lib
make
make install
popd
4编译x264-snapshot-20120528-2245-stable,脚本如下:
tar xjf $DL_FOLDER/x264-snapshot-20120528-2245-stable.tar.bz2
pushd x264-snapshot-20120528-2245-stable
./configure --host=arm-linux --cross-prefix=arm-linux-gnueabihf- --enable-shared --prefix=$INSTALL_PREFIX
make
make install
popd
5.编译xvidcore-1.3.2
注意此处一定要禁止汇编。脚本如下:
tar xf $DL_FOLDER/xvidcore-1.3.2.tar.gz
pushd xvidcore/build/generic
./configure --prefix=$INSTALL_PREFIX --host=arm-linux-gnueabihf --disable-assembly
make
make install
popd
如图所示这个库安装成功。
6 tiff-4.0.3
需要添加zlib支持,因此需要声明LDFLAGS和CFLAGS变量。脚本如下:
tar xf $DL_FOLDER/tiff-4.0.3.tar.gz
pushd tiff-4.0.3
./configure --prefix=$INSTALL_PREFIX --host=arm-linux-gnueabihf --enable-shared
CPPFLAGS=-I$INSTALL_PREFIX/include LDFLAGS=-L$INSTALL_PREFIX/lib
make
make install
popd
7. ffmpeg-0.10.3
ffmpeg的配置选项较多,因此需要声明LDFLAGS和CFLAGS变量。脚本如下:
tar -xjf ffmpeg-0.10.3.tar.bz2
pushd ffmpeg-0.10.3
./configure --prefix=$INSTALL_PREFIX --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gnueabihf-gcc --enable-swscale --extra-cflags=-I$INSTALL_PREFIX/include --extra-ldflags=-L$INSTALL_PREFIX/lib --disable-asm
make
make install
popd
这个库编译了较长时间,而且编译选项很多,很容易出错。
如果出错请大家对照截图。编译成功截图如下:
至此这七个库就交叉编译完成了,虽然我都以一个一个在PC机上验证的。但是shell还是很注重格式的,在网络传播过程中有些格式难免会有误。所以编译不成功的时候,自己推断一下。
二, 配置编译opencv
完成上面的几步应该已经在crosscompile_root/lib目录下有相应的库了
cd ~/OpenCV-2.4.5/
mkdir build
这build目录里建立toolchain.cmake文件,输入以下内容
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-linux-gnueabihf-gcc )
set( CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++ )
set( CMAKE_LIBRARY_PATH ~/crosscompile_root/lib ${CMAKE_LIBRARY_PATH})
set( CMAKE_INCLUDE_PATH ~/crosscompile_root/include ${CMAKE_INCLUDE_PATH})
然后执行命令:
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX -DZLIB_INCLUDE_DIR=$INSTALL_PREFIX/lib -DPNG_INCLUDE_DIR=$INSTALL_PREFIX/lib -DJPEG_INCLUDE_DIR=$INSTALL_PREFIX/lib -DOPENCV_EXTRA_C_FLAGS="-mfpu=neon -I$INSTALL_PREFIX/include -L$INSTALL_PREFIX/lib -Wl, -rpath,$INSTALL_PREFIX/lib" -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
这是初步设置编译选项,然后我们执行cmake-gui细调,主要加上ffmpeg这个选项。去掉python,gtk,cuba,1394lib等,因为没有对应的库。
界面如下:
以上可以做一些相应调整,决定哪些模块可以添加。可以在CMAKE_INSTALL_PREFIX这个选项里指定make install的库安装路径,比如我的是/newOpencv2.4.5/opencv-2.4.5_lib。 Where is the source code里面是源码路径。Where to build the binaries里面是build路径。调整完了之后按Configure键来配置,和按Generate键来产生Makefile文件。这样可以再/build文件夹下make和make install,但是其实这个配置还是有问题,至少在我的机子上编译不过。在/build文件夹下的有个CMakeCache.txt文件,这就是我们上面调整得到编译配置文件,我们要修改如下两个地方在145行:
//Flags used by the compiler during all build types.
CMAKE_CXX_FLAGS:STRING= -mfpu=neon -I/opencv_arm/crosscompile_root/include -L/opencv_arm/crosscompile_root/lib -L/usr/arm-linux-gnueabihf/,-Wl,-rpath,/lib
可以看出来是指定编译用到的库文件,这些库文件就是我们前面编译好的。
在188行:
//Flags used by the linker during debug builds.
CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=-lpthread –lrt
这两处修改完了之后,我们make和make intall。如果顺利应该就没什么问题了。至此OPENCV的库就交叉编译好了。把你得到crosscompile_root/里的库文件和opencv的库文件复制如ARM板子上即可。在PC平台交叉编译的时候在QT项目里在pro文件里面指定opencv的库路径即可,比如我们的库路径是/newOpencv2.4.5/opencv-2.4.5_lib。这时Opencv在ARM平台的编译就算完成了!最后说明我用QT是QWS模式所以Opencv的GUI函数不能用,同样OpenGL相关的也不能使用。如果想使用就去安装X11图形接口软件。当然PC机上就是用X11的图形接口,所以可以使用。
By 潇齐 2014-4-25
转载请注明出处!