文章目录
- 环境
- 移植过程
- 1、安装arm-himix200-linux-gcc\g++编译器,下载opencv2.4.10源码
- 2、安装cmake,设置编译参数
- 3、编译、安装opencv2.4.10
- 4、在海思平台上运行opencv例程
- 问题及解决方案
环境
- 交叉编译器:arm-himix200-linux-gcc\g++(海思SDK中提供的交叉编译器)
- opencv版本:opencv2.4.10,点击进入下载链接
- 编译环境:ubuntu18.04,Linux 4.15.0
- 目标平台:Hi3516AV100,Linux 4.9.37
- 语言: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