zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    c++的输入流基础知识
    用英文加优先级来解读C的声明
    django 用imagefiled访问图片
    关于Django中的表单验证
    c#语言的一些复习
    IIS发布的网站用localhost可以访问,改成IP就无法访问的解决方案 .
    首次关于IIS配置遇到的一些问题
    常见dos操作
    vs2012中对于entity framework的使用
    几个知识点
  • 原文地址:https://www.cnblogs.com/zhangxingcomeon/p/15039284.html
Copyright © 2011-2022 走看看