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'错误 |
该错误与上面错误中的libpng、libjpeg、libtiff为同源错误,均是这三个库未安装,或未安装本编译链平台(如arm)的对应版本所致
同时确保下三者的 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:\tftp -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服务的windows的ip和对应路径,第二个路径为本开发板上的路径)
挂载成功后进入开发板的对应路径中,即可看到windowsNFS服务器上的目录文件
取消挂载:umount -f /mnt/mtd