opencv2.0 交叉编译


##编译环境:

- **编译:ubuntu16.04x86**

- **目标机:cortex-a8 linux3.0**

- **编译器:arm-linux-gcc**

前言:由于做项目的要求,我们需要将opencv移植到arm体系的开发板上,经过我的测试,在开发板:**cortex-a8等都可以运行正常的【当时我的开发板运行 的系统版本有linux3.0, linux2.6,测试都是正常的】**,整个过程耗时大概一周,我参考了网上很多的文章,在这里我总结一下。

## 使用文件清单


opencv2.0 交叉编译_第1张图片

##编译依赖库

我相信,你在编译库的时候可能会遇到很多问题,我下面提供的编译方法可能在你的机器上会报上一些错误,这很正常,把你的库错误信息交给百度,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

#include

#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生成,那么恭喜你成功了!

你可能感兴趣的:(opencv2.0 交叉编译)