Opencv4.1.0交叉编译----终端摄像头内算法嵌入,海思HISI、雄迈ARM编译链使用经验

引:

    项目需求,在终端摄像头里嵌入简单算法,进行图像预处理,考虑使用Opencv和dlib实现,本博客阿星记录Opencv在摄像头中arm开发板交叉编译与使用的经验

环境:

主机系统:Ubuntu16.04

Opencv版本: 4.1.0

交叉编译器:海思Hi3516C V500R001C02SPC010版本编译链,雄迈编译链

自动化编译工具: cmake version 3.5.1

一、交叉编译opencv

引:本文使用两种博主亲测方法进行opencv的交叉编译

下载Opencv

 https://opencv.org/releases/page/3/

安装cmake

sudo apt-get install cmake

sudo apt-get install cmake-gui

 

安装基础

# ubuntu16.04 默认自带安装

sudo apt-get install build-essential

# ubuntu16.04 除了git,其他默认自带安装

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

# libdc1394-22-dev 需要安装,其他默认自带安装

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

 

一 >1、方法一

确保已安装cmake,直接使用下述shell脚本进行一键交叉编译,项目后期博主采用的即本方式,交叉编译中会出现的问题,方法一二相同,记录在本博客编译方法之后

将opencv源码解压后,进入opencv目录,创建build文件夹。将下述build.sh放入该文件夹中,

更改脚本中的BuildDir 路径,更改脚本中的ToolChain路径,可自行增删cmake选项,用于增删opencv的各模块,

值得注意的是,下述shell中使用了ARM架构的neon加速,可关注flags选项,ENABLE_NEON, ENABLE_VFPV3等选项

#!/bin/bash
set -e # Exit immediately if a command exits with a non-zero status.
BuildDir=/home/7hisi/opencv-4.1.0/build
ToolChain=/opt/hisi-linux/x86-arm/arm-himix200-linux
if [ ! -d "$BuildDir" ]; then
  # Take action if $BuildDir doesn‘t exists. 
  echo "create ${BuildDir}..."
  mkdir -p ${BuildDir}
fi
cd ${BuildDir}

echo "building OpenCV4"

cmake -D CMAKE_BUILD_TYPE=RELEASE 
  -D BUILD_SHARED_LIBS=ON 
  -D CMAKE_FIND_ROOT_PATH=${ToolChain}/
  -D CMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake
  -D CMAKE_C_COMPILER=${ToolChain}/bin/arm-himix200-linux-gcc
  -D CMAKE_CXX_COMPILER=${ToolChain}/bin/arm-himix200-linux-g++
  -D CMAKE_CXX_FLAGS="-mfloat-abi=softfp -mfpu=neon"
  -D CMAKE_C_FLAGS="-mfloat-abi=softfp -mfpu=neon"
  -D CMAKE_INSTALL_PREFIX=${BuildDir}/my_install 
  -D WITH_TBB=ON 
  -D WITH_EIGEN=ON 
  -D BUILD_ZLIB=ON 
  -D BUILD_TIFF=ON 
  -D BUILD_JASPER=ON 
  -D BUILD_JPEG=ON 
  -D BUILD_PNG=ON 
  -D ENABLE_NEON=ON 
  -D ENABLE_VFPV3=ON 
  -D WITH_LIBV4L=ON 
  -D BUILD_opencv_python=OFF
  -D ENABLE_PRECOMPILED_HEADERS=OFF 
  -D BUILD_EXAMPLES=OFF 
  -D BUILD_TESTS=OFF 
  -D BUILD_PERF_TESTS=OFF 
  -D BUILD_WITH_DEBUG_INFO=OFF 
  -D BUILD_DOCS=OFF 
  -D WITH_OPENCL=OFF 
  -D WITH_1394=OFF 
  ../
make -j$(nproc)
本脚本执行成功后,执行make install,即可在上述shell中配置的CMAKE_INSTALL_PREFIX目录处,看到交叉编译生成的include、lib等文件夹
执行shell若出现报错,可参照下文的报错表进行解决
至此,opencv交叉编译完成

一 >2、方法二,使用cmake-gui可视化配置各选项

配置cmake-gui

解压opencv源码后,进入目录创建arm-build文件夹

在终端输入cmake-gui进入配置界面

 

where is the source code处选择opencv文件夹,

where to build the binaries选择刚刚创建的arm-build文件夹,(注意该目录,之后我们cmake完成,在此文件夹下执行make) 

然后点击左下角的configure。

点击configure后,在弹出的界面按下图选择,即选择交叉编译配置。然后点击next。

 

点击next后进行交叉编译配置,

在compilers下的c和c++处,选择你的交叉编译链的gcc和g++,

并在Target root处填写你的交叉编译工具链的安装位置。

之后点击finish。

 

点击finishi后软件会配置一段时间,右下角会有进度条 

配置完成后在search栏中输入flags,并在勾选advanced,

然后按下图进行配置。 

将CMAKE_CXX_FLAGS和CMAKE_C_FLAGS -mfloat-abi=softfp -mfpu=neon,  以开启Arm下的neon等加速计算

(本步骤其实就是配置了编译、链接选项,需要进一步了解其含义可以百度gcc g++ 后的-参数的含义。)

 

然后在search框搜索zlib,
BUILD_ZLIB后打勾,
并选择ZLIB_INCLUDE_DIR路径,为你的opencv源码路径中的3rdparty/zlib

选中编译输出目录CMAKE_INSTALL_PREFIX (注意该目录,之后我们编译完成的包库等在此目录寻找)

 

搜索下列选项并选中

选中BUILD_JPEG

选中WITH_TIFF

选中WITH_PNG

选中BUILD_SHARED_LIBS

选中WITH_TBB

选中WITH_EIGEN

选中ENABLE_NEON

选中ENABLE_VFPV3

取消下列勾选

 

取消BUILD_TESTS 的勾选

取消BUILD_PERF_TESTS的勾选

取消OPENCV_ENABLE_ALLOCATOR_STATS的勾选(无该选项可忽略)

 

配置完成后再次点击configure,
读条结束后后点击generate。
之后在arm-build文件夹内就获得了根据以上步骤配置好的待编译的交叉编译源码。

编译安装

arm-build目录下进行make

make(若欲开启并行编译加速编译过程,可用 make -j{i},i小于cpu核心数的2倍为宜)

make install
之后我们可以在预设的编译输出目录CMAKE_INSTALL_PREFIX选项目录下,找到我们的输出结果

至此。opencv交叉编译完成

二、编译错误记录

问题

解决方案

致命错误: dc1394/dc1394.h:没有那个文件或目录

cmake  WITH_1394 不勾选

opencv_annotation

修改3rdparty/libpng/pngpriv.h 

128 /* 注释掉 该行 #  if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && */

129 #  改为 if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) &&

error while loading shared libraries:  libmpc.so.3: cannot  open  shared  object file :  No such file  or directory

 

export LD_LIBRARY_PATH=<编译链中的lib路径(存放libmpc.so.3的文件夹路径)>

 

common.cc:52:2: error: #error "No suitable threading library available." #error "No suitable threading library available.

 

.../opencv-3.4.5/3rdparty/protobuf/src/google/protobuf/stubs/common.cc 中添加下面这一行

#define HAVE_PTHREAD

arm-xm-linux-gcc -v 报没有这个文件

apt-get install lib32stdc++6 lib32z1 lib32z1-dev

 

popd: not found

 

sudo dpkg-reconfigure dash 选no

'round'/rint' is not a member of 'std;

 

recipe for target 'modules/gapi/CMakeFiles/opencv_gapi.dir/src/api/gapi_priv.cpp.o' failed

gapi模块的错误,可选择不勾选BUILD_opencv_gapi来解决

opencv_annotation模块,大量的"未定义的引用"

CMAKE_CXX_FLAGS和 CMAKE_C_FLAGS均改为下面值:

(可在cmake-gui中改,或者修改生成的CmakeCache.txt文件中的对应两行CMAKE_CXX_FLAGS:STRING= 和CMAKE_C_FLAGS:STRING= 的路径)

-Wl,-rpath-link=/opt/opt/xm_toolchain/arm-xm-linux/usr/lib

......./libjpeg.so: file not recognized: File not recognized不可识别的文件格式

 

 

libtiff和libpng报错同上

    已有的jpeg包libpng包libtiff包,为x86_64,,重新下载 jpeg的包,

https://jpegclub.org/reference/reference-sources/

http://www.libpng.org/pub/png/libpng.html

http://download.osgeo.org/libtiff/

    重新编译为arm格式,并将编译好的各so文件和软连接,拷贝如雄迈库的lib中

    交叉编译libjpeg  png  tiff 等包:  在包源码路径下:(自行进入各源码包,自行修改prefix生成输出路径,libjpeg和libpng包交叉编译方法类似,libtiff包交叉编译需要加上g++编译器)

./configure --host=arm-linux --prefix=/home/XiongMai/my_jpeg9d/install_armjpeg CC=/opt/opt/xm_toolchain/arm-xm-linux/usr/bin/arm-xm-linux-gcc

./configure --host=arm-linux --prefix=/home/XiongMai/my_jpeg9d/install_armjpeg CC=/opt/opt/xm_toolchain/arm-xm-linux/usr/bin/arm-xm-linux-gcc CXX=/opt/opt/xm_toolchain/arm-xm-linux/usr/bin/arm-xm-linux-g++

make

make install

之后将生成路径下lib的so拷贝至雄迈编译链lib中进行优先寻找

libpng、libjpeg、libtiff的'needed .....not found'错误

该错误与上面错误中的libpnglibjpeglibtiff为同源错误,均是这三个库未安装,或未安装本编译链平台(arm)的对应版本所致


确保已经勾选了BUILD_PNG、  BUILD_JPEG、BUILD_TIFF,

同时确保下三者的 XXX_LIBRARY_RELEASE路径为正确的库路径(可参照上述报错中的方法,交叉编译这三个库放入对应路径中)

/…/lib/libopencv_core.so:

‘pthread_spin_init’未定义的引用

‘pthread_spin_unlock’未定义的引用

‘pthread_key_create......

 

此错误为平台对于多线程库pthread的支持问题,有些unix平台无此库,我们改为lpthread:,具体操作为:

CMAKE_EXE_LINKER_FLAGS改为添加-lpthread -lrt -ldl

 三、连接设备

1、连接串口

windows机器为例:

本电脑右键 -> 管理 -> 设备管理器 -> 端口 -> USB Serial Port,记住是COM[x]

若设备管理器中无”端口”一项,而是显示”其他设备”,例如下图所示:
为缺少对应的串口驱动程序:

此情况下需要安装对应的驱动程序,可根据串口类型等,进行串口驱动下载:
如上述我们例子中使用的开发板串口为: CP2102,前往下载对应驱动并安装:
我们到海思官网中,找到对应的串口驱动进行下载:(内有相关使用文档,可根据文档进行串口驱动的下载和使用, windows下基本一直“下一步”即可)

https://www.hisilicon.com/cn/chip-academy/materiallist

2、配置连接串口

xshell为例,(putty等其他产品配置均如下类似)

打开xshell  ->  新建连接 ->  连接【协议】:SERIAL ->  串口【端口号】:COM[x];  【波特率】:115200

3、输入账号密码
4、配置网络

设置开发板网络,使其与欲连接的NFS服务器网络连通

ifconfig eth0 172.200.97.166 netmask 255.255.248.0 up

5、配置NFS,进行开发板外挂硬盘

5.1 搭建NFS服务器,以windows为例:

下载haneWIN程序,直接下一步安装即可,附操作参考链接:

https://blog.csdn.net/paladinzh/article/details/96162270

haneWIN程序中,“编辑输出表文件”里,配置d: ftp -public -name:nfs将我们windows中的某目录设置为nfs,以供开发版挂载,外挂调试程序,之后重启nfs服务器
windows的“服务”中,看到NFS Server正常运行状态,则我们nfs的目录已经设置好了,(亦可在haneWIN程序中的“挂载设备”看到)

5.2 在串口上挂载windows中的nfs目录

mount  -t  nfs  -o  nolock  172.200.97.173:/nfs  /mnt/mtd       

 (其中ip为开启nfs服务的windowsip和对应路径,第二个路径为本开发板上的路径)
挂载成功后进入开发板的对应路径中,即可看到windowsNFS服务器上的目录文件

取消挂载:umount  -f  /mnt/mtd

原文地址:https://www.cnblogs.com/zhangxingcomeon/p/15039284.html