##编译环境:
- **编译:ubuntu16.04x86**
- **目标机:cortex-a8 linux3.0**
- **编译器:arm-linux-gcc**
前言:由于做项目的要求,我们需要将opencv移植到arm体系的开发板上,经过我的测试,在开发板:**cortex-a8等都可以运行正常的【当时我的开发板运行 的系统版本有linux3.0, linux2.6,测试都是正常的】**,整个过程耗时大概一周,我参考了网上很多的文章,在这里我总结一下。
## 使用文件清单
##编译依赖库
我相信,你在编译库的时候可能会遇到很多问题,我下面提供的编译方法可能在你的机器上会报上一些错误,这很正常,把你的库错误信息交给百度,bing,google去解决!我这里说的是主体思路。另外关于这些库的用处,应该在两处起到作用:一,ubuntu编译交叉编译opencv2.0的时候用到;二,这些库要在移植的时候移植到开发板的/lib文件夹【/lib 这是开发板的默认库搜索路径,就是说你把库丢在这个目录就好了,不用设置什么搜索路径了,省事。】,具体哪些移入,我待会说。最后,arm-linux-gcc这个交叉编译器,你肯定要装好吧,没装的百度装去吧。好了,开始了。
1, libz 的交叉编译:
./configure --prefix=$OPENCV_DEPEND –shared
修改 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, libjpeg的交叉编译:
./configure--host=arm-linux --prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
makeinstall
3, libpng 的交叉编译:
./configure --host=arm-linux--prefix=$OPENCV_DEPEND --enable-shared --enable-static
make
makeinstall
4, yasm 的交叉编译:
CC=arm-linux-gcc ./configure--enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
makeinstall
5, libx264 的交叉编译:
CC=arm-linux-gcc ./configure--enable-shared --host=arm-linux --disable-asm --prefix=$OPENCV_DEPEND
make
makeinstall
6, libxvid 的交叉编译
cd build/generic
./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
make
makeinstall
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
makeinstall
【上面的代码可能会因为排版问题出现一定问题】
如果你能正常的编译以上的库,那么最后你将可以编译opencv2.0了
8.opencv2.0 交叉编译:
进入opencv2.0.0目录:首先,修改configure文件:
gedit configure
搜索-lavcodec,定位到大概18182行的位置,在“FFMPEGLIBS="-lavcodec -lavformat” 后添加 “-lswscale”, 修改之后变为:“FFMPEGLIBS="-lavcodec -lavformat -lswscale $FFMPEG_SWSCALE_LIBS"”,然后保存退出。
在终端中输入:
./configure --host=arm-none-linux-gnueabi --without-gtk --without-carbon --without-quicktime --without-1394libs --with-ffmpeg --without-python --without-swig --enable-static --enable-shared --disable-apps CXX=arm-linux-g++ CPPFLAGS=-I/usr/local/arm/4.3.2/arm-none-linux-gnueabi/include/ LDFLAGS=-L/ usr/local /arm/4.3.2/arm-none-linux-gnueabi/lib --with-v4l --prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi CXXFLAGS=-O2
make
make install
【opencv-2.0.0移植算是成功了。接下来,需要把所有的库烧写到arm板子上去,如果烧写到根目录的lib目录下,那么不用指定LD-LIBRARY-PATH,反之亦然。】
这个有个问题,你要移植的库除了第八步之后产生lib文件下的库文件【以.a结尾的,.la结尾的通通不要移动,这不是动态库!移动的是后缀中有so这个字眼的,记住。】,还要移动的是之前第1-7中的某些库,为什么说某些库,你需要啥就用啥呗!比如,你要用cvloadimage这个函数加载png 和 jpeg的图片,那个你就把png还有jpeg相应的库也给复制到开发板的/lib文件夹下面。这点一定要注意,可怕的是个别开发板命名缺少库它却没有任何提示,唯独单单运行效果不对!如果遇到这个问题你要好好看看你的库了。
**小插曲:在你把库复制到开发板前,请事先到开发板看看时候有相应的库,这个相应的库可能是之前做的人留下的也可能其他原因,这不重要,重要的是这个遗留的东西可能对你的库造成干扰,让你百思不解,就是运行没效果!**
##检测程序
下面的程序就是我当时的检测程序,如果你能顺利产生一个新的图片,那么恭喜你成功了!
【**小插曲**:这个时候你不要用啥显示窗口的函数等,你确定你的开发板有类似qt这类的图形化工具!?我犯过这个错误,当时显示出错了,我以为库有问题,最后才知道如果想图形化显示还需要qt之类工具的支持。另外,我们一般也不需要在开发板里让图片显示出来,想看就复制出来看呗】
#include<stdio.h>
#include<stdlib.h>
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
int main(int argc, char** argv )
{
IplImage* in;
printf("%d\n",argc);
printf("in:%d,the1:%s\n",in,argv[1]);
if((in = cvLoadImage(argv[1], 0)))
{
printf("load\n");
IplImage* out = cvCreateImage(
cvGetSize(in),
IPL_DEPTH_8U,
1
);
printf("created\n");
cvCanny(in, out, 20 , 60, 3);
printf("down\n");
cvSaveImage(argv[2], out, 0);
return 0;
}
else
{
printf("LoadImage failed!\n");
}
return -1;
}
```
在pc机上编译此程序
arm-linux-gcc -I/usr/local/arm/4.4.1/arm-no-linux-gnueabi/include/opencv -I/usr/local/arm/4.4.1/arm-none-linux-gnueabi/include/ -L/usr/local/arm/4.4.1/arm-none-linux-gnueabi/lib -lcv -lcxcore -lhighgui -lpng -lpng12 -ljpeg -lz opencvTest.c -o opencvTest
【上面的路径你根据自己的情况改动一下】
将程序拷贝到开发板上,同时也拷贝一张图片到开发板上
我的源图片名为front.jpg 生成的图片名为front2.jpg
执行程序
./opencvTest front.jpg(原图片路径) front2.jpe(生成图片路径)
如果有front2.jpg生成,那么恭喜你成功了!