由于项目需要,自己在Ubuntu环境下使用交叉工具链对OpenCV进行了交叉编译,期间参照了网上一些前辈的博客:
点击打开链接
本人的操作环境:
注:所有操作均要先通过sudo su root从普通用户切换到root用户
一、安装依赖项
apt-get install libavcodec-dev libavformat-dev libswscale-dev
事先安装依赖项可以防止后续的一些问题
二、安装交叉编译工具链
这里提供一个4.3.2的下载地址:https://download.csdn.net/download/u014731484/10334632
然后将arm-linux-4.3.2.tar.gz解压到/usr/local/arm下
tar -zxvf arm-linux-gcc-4.3.2.tar.gz
接着执行
vim /root/.bashrc
在文件的最后添加环境变量
export PATH=$PATH:/usr/local/arm/usr/local/arm/4.3.2/bin
export OPENCV_DEPEND=/usr/local/arm/opencv-depend
export OPENCV_INSTALL=/usr/local/arm/opencv-install
其中,OPENCV_DEPEND为OpenCV的依赖库的安装路径,OPENCV_INSTALL为OpenCV的安装的路径。
然后重启电脑令设置生效。
三、安装依赖库
OpenCV交叉编译之前,首先需要对依赖库进行交叉编译。因为OpenCV依赖于很多库函数,如果在编译OpenCV之前没有编译依赖项,就会导致编译后的OpenCV无法使用。 OpenCV交叉编译时各个库的依赖关系如下所示:
使用的依赖库如下所示(后面为下载地址):
注:后面所有的配置过程都需要进到相应的解压后的目录后执行,解压命令在此不再赘述。
1.zlib的交叉编译
./configure --prefix=$OPENCV_DEPEND
修改Makefile
CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
LDSHARED=arm-linux-gcc -shared-Wl,-soname,libz.so.1,--version-script,zlib.map
然后执行命令
make
make install
2.libjped的交叉编译
./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install
3.libpng的交叉编译
./configure --host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
make install
4.yasm的交叉编译
CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install
5.libx264的交叉编译
CC=arm-linux-gcc ./configure --enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
make install
6.libxvid的交叉编译
libxvid编译时需要先进入子目录
cd build/generic
然后
./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
make
make install
7.ffmpeg的交叉编译
./configure --prefix=$OPENCV_DEPEND --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gcc --enable-swscale --extra-ldflags=-L$OPENCV_DEPEND/lib --extra-cflags=-I$OPENCV_DEPEND/include
make
make install
注:按照该流程安装时,下载ffmpeg 2.8版本,不要下载最新的ffmpeg 3.3版本!否则可能会像笔者编译OpenCV至21%时,显示make错误;
至此,依赖库编译安装完成。
此时,需要将路径/usr/local/arm/opencv-depend
下的lib和include中所有文件分别拷贝到路径/usr/local/arm/usr/local/arm/4.3.2/arm-non-linux-gnueabi/
下的lib和include下。命令如下:
cp -r /usr/local/arm/opencv-depend/include/ /usr/local/arm/usr/local/arm/4.3.2/arm-none-linux-gnueabi/
cp -r /usr/local/arm/opencv-depend/lib/ /usr/local/arm/usr/local/arm/4.3.2/arm-none-linux-gnueabi/
四、OpenCV的交叉编译
1.下载OpenCV源码
我在这里是用的是opencv2.4.9版本,附下载地址:https://download.csdn.net/download/u014731484/10334715
2.设置工具链toolchain.cmake
解压后进入opencv2.4.9的路径
cd opencv-2.4.9
mkdir build
cd ./build
在build文件夹中,用vim或gedit新建文件toolchain.cmake
:
gedit toolchain.cmake
在
toolchain.cmake
文件中填入如下内容:
###########user defined#############
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++ )
###########user defined#############
set( CMAKE_FIND_ROOT_PATH "/usr/local/arm/opencv-depend" )
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 -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ../
3、对OpenCV进行cmake配置
后面就会需要对OpenCV进行cmake操作,如果PC机没有安装cmake,则需要输入指令:
apt-get install cmake cmake-qt-gui
依旧在build
路径下,打开cmake
的界面程序,即输入指令:
cmake-gui
设置源代码地址为/opencv-2.4.9
,构建地址为/opencv-2.4.9/build
,并对如下选项进行修改:
cmake-gui下的界面如下:
将上述操作进行完毕后,先按下Configure,然后按下Generate。
此时修改在/opencv-2.4.9/build
文件夹中的CMakeCache.txt
: CMAKE_EXE_LINKER_FLAGS选项本来为空,此时在后面加上:-lpthread -lrt
在/opencv-2.4.9/build
路径下执行命令:
make
make install
等待较长时间后,OpenCV的交叉编译就完成了。
五、交叉编译后的OpenCV移植到arm中
1、配置pkg-config
大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接的时候,必须要指定这些头文件和库文件的位置。 对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。 平常都是这样用pkg-config的:
gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main
上面的编译命令中,`pkg-config --cflags --libs gtk+-2.0`
的作用就如前面所说的,把gtk的头文件路径和库文件列出来,让编译去获取。–cflags和–libs分别指定头文件和库文件。 PS:命令中的`不是引号,而是数字1左边那个键位的那个符号。
在前面的OpenCV配置过程中,pkg-config便已经生成。生成地址为/usr/local/arm/opencv-install/lib/pkgconfig/opencv.pc
2、配置shell
用vim或gedit编辑文件/etc/bash.bashrc
:
gedit /etc/bash.bashrc
在最后一行加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv-install/lib/pkgconfig
export PKG_CONFIG_PATH
然后输入指令:
source /etc/bash.bashrc
3.测试使用
创建并编辑一个test.cpp
文件:
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
IplImage* image = cvLoadImage("1.jpg");
if(image == NULL)
{
cout<<"loud image fail"<
保存退出后,输入如下编译指令:
arm-linux-g++ `pkg-config --cflags --libs opencv` test.cpp -lpthread -lrt -o test
最后将生成的test复制到板子上,不过默认情况下当程序运行到cvNamedWindow时是会出错的,这个时候可以选择Qt作为交互界面,后面应该会写一篇关于在ARM上移植Qt的博客。
注:必须要将 OPENCV_DEPEND下依赖库lib和OPENCV_INSTALL安装的库lib都拷贝到板子上lib目录下,Opencv才可在ARM板子上运行