文章目录

  • 环境
  • 移植过程
  • 1、安装arm-himix200-linux-gcc\g++编译器,下载opencv2.4.10源码
  • 2、安装cmake,设置编译参数
  • 3、编译、安装opencv2.4.10
  • 4、在海思平台上运行opencv例程
  • 问题及解决方案


环境

  1. 交叉编译器:arm-himix200-linux-gcc\g++(海思SDK中提供的交叉编译器)
  2. opencv版本:opencv2.4.10,点击进入下载链接
  3. 编译环境:ubuntu18.04,Linux 4.15.0
  4. 目标平台:Hi3516AV100,Linux 4.9.37
  5. 语言:C/C++

移植过程

1、安装arm-himix200-linux-gcc\g++编译器,下载opencv2.4.10源码

在海思ISP芯片官方SDK中获取arm-himix200-linux编译工具链压缩包,解压并安装。

tar -xvf arm-himix200-linux.tar.gz
cd arm-himix200-linux/
./arm-himix200-linux.install

安装编译器时间较长,安装完成后重启。

去opencv官网下载opecv2.4.10源码压缩包,解压并建立文件夹。

tar -xvf opencv-2.4.10.tar.gz
cd opencv-2.4.10/
mkdir build install # build目录是放置cmake等编译文件的目录,install文件用来存放编译、安装出的opencv库、可执行文件等

2、安装cmake,设置编译参数

安装cmake编译工具。

sudo apt-get install cmake cmake-gui

在刚刚建好的build文件夹中建立一个脚本文件,用来执行cmake的编译参数设置。

#myCmake.sh
#CMAKE_INSTALL_PREFIX 设置的编译出来的库文件、可执行文件存放的位置
#最后两个点是opencv源代码的位置,..就相当于是opencv-2.4.10的根目录
#!/bin/bash
cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=../install \ 
 -D CMAKE_C_COMPILER=arm-himix200-linux-gcc \
 -D CMAKE_CXX_COMPILER=arm-himix200-linux-g++ \
 -D BUILD_SHARED_LIBS=ON \
 ..

然后执行myCmake.sh,生成Cmake编译需要的文件。

chmod 777 myCmake.sh
sudo ./myCmake.sh

脚本执行完成后,build文件夹中内容如下图。





生成这些文件也可以使用cmake-gui的方式,但是我在使用cmake-gui时,相同的设置总是会出现许多错误,所以改用了命令行的方式。

3、编译、安装opencv2.4.10

在build目录下,运行make命令和安装命令,完成opencv2.4.10的编译和安装。整个编译的时间较长,请耐心等待,有进度条可以参考。

make
make install

如果这个步骤你没有遇到一点错误,那么祝贺你,你挺幸运的。如果遇到错误了,请跳转第三部分查看相关问题及解决方案,希望我遇到的问题和解决经验可以帮助你。

4、在海思平台上运行opencv例程

opencv2.4.10编译、安装完成后,进入刚刚设置的install目录,install文件夹内容如下图所示。




可以见到有bin、include、lib、share四个文件夹,bin目录下存放了编译出的可执行文件,include目录下存放了编写含opencv代码需要引用的头文件,lib目录下存放编译出的opencv共享库。

将include、lib目录下的文件分别拷贝到海思交叉编译器对应的include和lib目录下。

海思交叉编译器对应的两个目录路径为:

include目录:/opt/hisi-linux/x86-arm/arm-himix200-linux/arm-linux-gnueabi/include
lib目录:/opt/hisi-linux/x86-arm/arm-himix200-linux/arm-linux-gnueabi/lib

将lib目录下的库文件拷贝到海思开发板的lib目录下。海思开发板的lib目录路径为:/lib

注意在拷贝库文件的过程中,cp命令要加入参数选项-d,以保留软链接。

进入opencv的sample目录,尝试编译一个opencv例程。

cd ~/opencv-2.4.10/samples/cpp
arm-himix200-g++ opencv_version.cpp -o opencv_version -lopencv_core -lopencv_highgui -lopencv_imgproc -O2

编译命令后面-l代表链接相应的opencv库,如果不知道自己编写的opencv程序需要使用哪些库,可以把lib目录下所有涉及的库文件全链接上,以免编译的时候报未定义错误。

另外,为了提高opencv程序的运行效率,可以考虑打开编译优化开关。

将编译出来的opencv_version程序拷贝到开发板上并运行,程序运行效果如下 。




至此,opencv2.4.10向Hi3519AV100平台移植完成。

问题及解决方案

**【问题一】:**cmake-gui生成cmake文件中报错。

如果是system is unknow to…类似的错误,可以忽略,只要不影响生成cmake文件就可以。如果一直生成不了cmake文件,建议尝试命令行的方式。

**【问题二】:**编译太慢,使用了make -j4或make -j8等命令加快编译速度后出错。

使用多核进行编译时,可能会影响有依赖关系的代码的编译顺序,所以一般遇到这种情况,降低编译速度,或不使用-j选项,可以解决。

**【问题三】:**海思目录下stdlib.h中__BEGIN_NAMESPACE_STD does not name a type问题。

这个问题我查了许多资料,大意说可能跟glibc库有关系,多半是环境问题,所以我换了一个编译环境。不在本地ubuntu机器上进行编译,而是使用一个非常干净的云服务器进行编译,解决了这个问题。引起该问题的具体原因还没有深究,先留一个**【坑】**。

**【问题四】:**error: the compiler can assume that the address of ‘annotate_img’。

引起这个问题的原因是编译选项中打开了-Werror=address,导致编译器把这类警告认为成是错误,解决方法是找到opencv-2.4.10/build/modules/contrib/CMakeFiles/opencv_contrib.dir/flags.make文件,删掉-Werror=address,然后重新make。

**【问题五】:**ffmpeg/avformat.h: No such file or directory。

自己判断是由于缺少ffmpeg相关文件造成的,于是安装了一下ffmpeg,成功解决。

sudo apt-get install ffmpeg