编译平台:Ubuntu16.04LTS

目标板:ARM A9(三星的Exynos4412)

目录 

OpenCV移植到ARM-Linux之一:交叉编译第三方依赖库

OpenCV移植到ARM-Linux之二:交叉编译opencv库

 

详细过程:

一、交叉编译第三方依赖库

1.下载所需要的第三方库源码包(可自行下载,也可在这下载)

opencv arm开发板 opencv在arm上的移植_opencv arm开发板

添加环境变量,指定第三方依赖库安装路径

vim /etc/profile

末尾添加:

#opencv_3thparty_lib
 export OPENCV_3THPARTY_LIB=/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/
  (注:该路径我选择的是交叉编译链下的子目录,编译时会自动检索到该路径,若为其它普通路径,需自行添加该路径到系统链接环境变量LD_LIBRARY_PATH中)2.在opencv目录(我的是opencv/)创建源码包文件夹3thparty_package
cd  /home/jiangyu/opencv
mkdir 3thparty_package
3.交叉编译zlib
1)解压:
tar xvf zlib-1.2.8.tar.gz
2)编译
cd zlib-1.2.8
CC=arm-none-linux-gnueabi-gcc ./configure  --prefix=$OPENCV_3THPARTY_LIB   --shared
vim Makefile   将AR=ar改成AR=arm-none-linux-gnueabi-ar,RANLIB改成arm-none-linux-gnueabi-ranlib
make -j6
make install
4.交叉编译libjpeg
tar vxf jpegsrc.v9b.tar.gz 
 cd jpeg-9b/
./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared 
make 
make install
5.交叉编译libpng
xz -d libpng-1.6.32.tar.xz
tar -xvf libpng-1.6.32.tar
cd libpng-1.6.32/
./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared
出现错误(原因在于libpng依赖zlib库):configure: error: ZLib not installed
解决办法(添加zlib库到临时环境变量):
export  LDFLAGS="-L/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/lib/"
 export CPPFLAGS="-I/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/include/"make
make install
6.交叉编译yasm
tar xvf yasm-1.3.0.tar.gz 
cd yasm-1.3.0/
CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared 
出现错误:
checking build system type... Invalid configuration ` ': machine ` ' not recognized
 configure: error: /bin/bash config/config.sub   failed
 解决办法:sudo apt-get install libtool
cp /usr/share/libtool/build-aux/config.sub .
cp /usr/share/libtool/build-aux/config.guess .
make
make install
7.交叉编译libx264
 tar xvf  last_x264.tar.bz2 
 cd x264-snapshot-20171114-2245/CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB --enable-shared 
make 
make install
8.交叉编译libxvid
tar xvf xvidcore_1.3.3.orig.tar.gz 
 cd xvidcore-1.3.3/cd build/generic
 ./configure --host=arm-none-linux-gnueabi --prefix=$OPENCV_3THPARTY_LIB  --disable-assemblymake
make install
9.交叉编译ffmpeg
tar xvf  jpegsrc.v9b.tar.gz
cd ffmpeg-3.4/
./configure --prefix=$OPENCV_3THPARTY_LIB --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-none-linux-gnueabi-gcc --enable-swscale --extra-ldflags=-L/home/jiangyu/opencv/3thparty_package/opencv_3thparty_lib/lib --extra-cflags=-I/home/jiangyu/opencv/3thparty_package/opencv_3thparty_lib/include
make
make install

至此,opencv的第三方依赖库编译完成。

二、交叉编译opencv库

1.在opencv源码目录(/.../opencv/opencv-3.2.0/)下创建两个文件夹build和output,进入build目录。

cd build

cmake-gui

如图配置:

opencv arm开发板 opencv在arm上的移植_linux_02

在弹出的窗口按如下配置,点击Next。

opencv arm开发板 opencv在arm上的移植_依赖库_03

按照如下配置,Openrating System要写成Linux,不能写成arm-linux或者其他,因为cmake不能识别系统arm-linux,你可以试一下写成其他,这样在配置好的输出信息中会提示无法识别XXX系统。Compilers选择arm-linux-gcc和arm-linux-g++的绝对路径即可,Target Root选择第三方库的路径即/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/,其他的按照如下以下配置即可。

opencv arm开发板 opencv在arm上的移植_交叉编译_04

根据个人需求修改编译模块选项:

我的配置如下:

必选项:
BUILD ZLIB
BUILD_JPEG
BUILD_PNG
BUILD_JASPER
去除项:
WITH_TIFF
WITH_GTK
WITH_CUDA
WITH_1394
WITH_GSTREAMER
WITH_OPENEXR
WITH_OPENCL
修改项:
CMAKE_BUILD_TYPE    键值改成Release
CMAKE_INSTALL_PREFIX   键值改成源码目录下的output文件夹(即opencv库安装路径)

 如下图所示: 

opencv arm开发板 opencv在arm上的移植_opencv arm开发板_05

 

opencv arm开发板 opencv在arm上的移植_opencv arm开发板_06

opencv arm开发板 opencv在arm上的移植_依赖库_07

然后点击Generate生成Makefile。

opencv arm开发板 opencv在arm上的移植_交叉编译_08

到此已经生成了初步配置的Makefile,关闭cmake。

2.编译: make

报如下类似错误:

In file included from /home/dyjun/opencv/git_opencv/opencv/3rdparty/libpng/pngpriv.h:904:0,
                 from /home/dyjun/opencv/git_opencv/opencv/3rdparty/libpng/png.c:14:
/home/dyjun/opencv/git_opencv/opencv/3rdparty/libpng/pngstruct.h:30:18: fatal error: zlib.h: No such file or directory
 #include "zlib.h"
                  ^
compilation terminated.
make[2]: *** [3rdparty/libpng/CMakeFiles/libpng.dir/png.c.o] Error 1
make[1]: *** [3rdparty/libpng/CMakeFiles/libpng.dir/all] Error 2

解决办法:

找到错误模块相关的CMakeLists.txt (如3rdparty/libpng/CMakeLists.txt )
在ocv_include_directories(含ZLIB_INCLUDE_DIRS)

set(ZLIB_INCLUDE_DIRS "/usr/local/arm/arm-2014.05/arm-none-linux-gnueabi/")

其它类似的错误也是如此解决。

继续make,出现错误:提示找不到pthread等系列函数

解决方案:在build目录下打开CMakeCache.txt文件,找到CMAKE_EXE_LINKER_FLAGS,在其后面加上-lpthread -lrt -ldl链接属性。

继续编译,未报错,编译成功。

3.安装:

make intall

安装完成后output目录内容如下,则表示成功。

opencv arm开发板 opencv在arm上的移植_opencv arm开发板_09

4.拷贝动态库到ARM板

5.测试

至此,移植完成。