【OpenCV移植系列】02. OpenCV 1.0 在嵌入式Linux 上的移植

2019-07-12 14:28发布

1. OpenCV简介

OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
【详细介绍见我的上一篇博文:01.OpenCV简介】

2. OpenCV移植环境说明

  • 目标平台
    UP-TECH 2410
    系统:Linux 2.4
  • 宿主机
    系统:Ubuntu 10.04
    交叉编译链:gcc-3.4.6-glibc-2.3.6

3. 移植前期准备

3.1 一点点说明

在OpenCV移植之前需要先确认自己宿主机上边的交叉编译链符合编译目标OpenCV版本的要求。博主就曾尝试过很多版本的gcc和OpenCV,本来想编译高版本的OpenCV,但是由于ARM目标板上Linux版本过低,以至于太高版本的交叉编译链编译出来的可执行文件无法在上边运行,因为时间关系,没办法重新烧目标板的linux,只能选择低一点版本的交叉编译链:gcc-3.4.6-glibc-2.3.6(无奈脸) 。而gcc-3.4.6-glibc-2.3.6在交叉2.0以上版本的OpenCV时会出现各种各样的bug,最终被迫使用了低版本的OpenCV 1.0 。 由于OpenCV中对图像视频的处理需要使用libjpeg 、x264、xvid、ffmpeg 等第三方库,因此在进行OpenCV的正式移植之前需要对上述所述第三方库进行移植。

3.2 libjpeg 、x264、xvid、ffmpeg 等第三方库下载

4. OpenCV 1.0的移植步骤

总述: 1. 叉编译libjpeg 2. 下载安装yasm (x264需要用到的汇编编译器) 3. 交叉编译 x264,xvid,ffmpeg 4. 交叉编译OpenCV 注:交叉编译前保证交叉编译链已经成功安装并添加环境变量

4.1 叉编译libjpeg

解压jpegsrc.v6b.tar.gz并进入加压后的目录,配置: #./configure --prefix=/usr/opencv-depend/libjpeg-arm --exec-prefix=/usr/opencv-depend/libjpeg-arm --enable-shared --enable-static 修改生成的Makefile文件: # The name of your C compiler: CC= gcc 该成 CC= /usr/local/gcc-3.4.6-glibc-2.3.6/bin/arm-linux-gcc (根据你自己交叉编译器的位置修改) # library (.a) file creation command AR= ar rc 改成 AR= /usr/local/gcc-3.4.6-glibc-2.3.6/bin/arm-linux-ar rc (根据你自己交叉编译器的位置修改) # second step in .a creation (use "touch" if not needed) AR2= ranlib 改成 AR2= /usr/local/gcc-3.4.6-glibc-2.3.6/bin/arm-linux-ranlib (根据你自己交叉编译器的位置修改) 在/usr/opencv-depend/libjpeg-arm/ 目录下建立 man/man1,include,lib,bin四个目录 回到之前解压后的目录, # make # make install 将/usr/opencv-depend/libjpeg-arm/include/中(jconfig.h, jerror.h, jmorecfg.h, jpeglib.h)四个头文件拷贝到/usr/local/gcc-3.4.6-glibc-2.3.6/include (根据你自己交叉编译器的位置修改)(根据你自己交叉编译器的位置修改)中。 将/usr/opencv-depend/libjpeg-arm/lib中(libjpeg.la, libjpeg.so, libjpeg.so.62, libjpeg.so.62.0.0)四个库文件拷贝到/usr/local/gcc-3.4.6-glibc-2.3.6/lib(根据你自己交叉编译器的位置修改)中。 在/usr/opencv-depend/libjpeg-arm/lib目录执行以下命令检查生成的libjpeg.so是否为ARM版: # file libjpeg.so.62.0.0 若输出为:
libjpeg
则安装正确,否则检查交叉编译器路径以及Makefile并重新编译。
至此libjpeg交叉编译完成。

4.2 下载安装yasm

解压yasm0.7.2,进入解压后目录: # ./configure --enable-shared --prefix=/usr/opencv-depend/yasm --host=arm-linux # make # make install

4.3 交叉编译 x264,xvid,ffmpeg

  • 交叉编译 x264
    解压x264-snapshot-20060805-2245.tar.bz2,进入解压后目录,
./configure --prefix=/usr/opencv-depend/x264 --enable-shared - 修改配置参数 - 修改config.mak: prefix==/usr/opencv-depend/x264 exec_prefix=${prefix} bindir=${exec_prefix}/bin libdir=${exec_prefix}/lib includedir=${prefix}/include # 这里改为ARM ARCH=ARM SYS=LINUX # 这里改为arm-linux-gcc CC=arm-linux-gcc # 这里去掉-DHAVE_MMXEXT -DHAVE_SSE2 -DARCH_X86 CFLAGS=-Wall -I. -O4 -ffast-math -D__X264__ -DHAVE_MALLOC_H -DSYS_LINUX -DHAVE_PTHREAD -s -fomit-frame-pointer LDFLAGS= -lm -lpthread -s AS=nasm ASFLAGS=-O2 -f elf VFW=no GTK=no EXE= VIS=no HAVE_GETOPT_LONG=1 DEVNULL=/dev/null CONFIGURE_ARGS= '--enable-shared' '--prefix=/usr/opencv-depend/x264' SONAME=libx264.so.49 default: $(SONAME) 修改Makefile,将66~68行的ar和ranlib改为arm下的: libx264.a: .depend $(OBJS) $(OBJASM) arm-linux-ar rc libx264.a $(OBJS) $(OBJASM) arm-linux-ranlib libx264.a 编译安装 # make # make install 这样将在/usr/opencv-depend/x264下生成libx264.so
  • 交叉编译xvid
    解压xvidcore-1.1.3.tar.gz,进入解压后目录,
./configure --prefix=/usr/opencv-depend/xvid --disable-assembly [解释]–disable-assembly :因为xvid没有针对ARM的汇编优化,所以编译时必须关掉汇编 修改Makefile引用的platform.inc文件,将CC=gcc改为CC=arm-linux-gcc
成功后进入example文件夹测试,输入 arm-linux-gcc -o xvid_encraw xvid_encraw.c -lc -lm -I../src/ -L../build/generic/=build -lxvidcore 即可生成xvid_encraw
  • 交叉编译ffmpeg
解压ffmpeg-0.4.9-p20051120.tar.bz2,进入解压后目录, 修改configure文件,由于cc、ar、ranlib、strip都是交叉编译环境中的执行文件,可以这样配置: prefix="/usr/opencv-depend/ffmpeg" cross_prefix="/usr/local/gcc-3.4.6-glibc-2.3.6/bin/arm-linux-" cpu="arm" 配置: # ./configure --cpu=arm --cc=/usr/local/gcc-3.4.6-glibc-2.3.6/bin/arm-linux-gcc --enable-shared --disable-ffserver --enablexvid --enable-x264 --enable-gpl --enable-pthreads --disable-strip # make # make install OpenCV所依赖的库都交叉编译完成 # cd /usr/opencv-depend # ls 能看到之前安装的ffmpeg、x264 …目录:
dir 分别将这5个目录下的:
/include
/lib
下的所有文件复制交叉编译链的目录的/include和/lib目录,例如,我的是:
/usr/local/gcc-3.4.6-glibc-2.3.6/include
/usr/local/gcc-3.4.6-glibc-2.3.6/lib 至此,前期工作完成!

4.4 交叉编译OpenCV

解压opencv-1.0.0.tar.gz,进入解压之后的目录,配置
./configure –host=arm-linux –without-gtk –without-carbon –without-v4l –without-v4l2 –without-quicktime –without-1394libs –without-ffmpeg –without-python –without-swig –enable-static –enable-shared –disable-apps CC=arm-linux-gcc CXX=arm-linux-g++ –prefix=/usr/opencv-depend/opencv-1.0.0
# make # make install

5. 拷贝库文件到开发板

cd /usr/opencv-depend/opencv-1.0.0 能看到
ffmpeg opencv-1.0.0 x264 yasm
libjpeg-arm xvid
这6个目录,将opencv-1.0.0/lib下的
libcvaux.so.1.0.0
libcv.so.1.0.0
libcxcore.so.1.0.0
libhighgui.so.1.0.0
libml.so.1.0.0
全部重命名
*.so.1 然后将ffmpeg、opencv-1.0.0 、 x264 、 libjpeg-arm、 xvid这5个目录下的 /lib下边的所有文件拷贝到开发板的某个目录,如:/usr/lib, 或是其它目录,如/usr/dir, 然后在开发板终端上添加环境变量(假如上一步是拷贝到/udr/lib的话,这步不用): #export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/dir/

6. OpenCV移植所需要的库总表

OpenCV移植需要的库 至此,OpenCV 1.0在嵌入式Linux 上的移植完成!
转载请注明出处!