交叉编译树莓派 3B Qt 5.11 和 OpenCV 3.2.0

交叉编译树莓派 3B Qt 5.11 和 OpenCV 3.2.0

本文介绍如何交叉编译可以在树莓派 3b 上运行的 Qt 5.11,并实现 OpenGL 支持,以及实现支持 Qt 的 OpenCV 3.2.0

1. 交叉编译并部署 Qt 5.11

这部分主要参考了 Qt 的 Wiki – RaspberryPi2EGLFS

每个步骤的头部指定这是在树莓派还是主机的操作。树莓派的操作可以通过鼠标、键盘打开命令行实现命令输入,也可以通过串口直接输入命令

  1. (主机) 下载最新的 raspbian 镜像 官网地址: https://www.raspberrypi.org/downloads/raspbian/

  2. (主机) 解压镜像并烧写到 SD 卡,可以参考 官网步骤

Ubuntu 烧写镜像有两者方法: 工具烧写和命令行烧写

  • 工具烧写推荐 Etcher , 傻瓜无脑,很好用

  • 命令行烧写

    # 查看连接的 SD 卡设备,如果是直连,一般为 mmcblk,如果是通过 USB 读卡器,一般为 sdX, X 为 a,b,c,d 等字母,表示一个存储设备
    # 通过设备存储空间大小,可以判断 SD 卡对应的设备
    lsblk    
    
    # 烧写到 SD 卡, 'if' 设置要烧写的文件,'of' 设置要烧写的设备, 这里我的设备为 '/dev/sdc'
    sudo dd if=2018-06-27-raspbian-stretch.img of=/dev/sdc bs=4M
  1. (主机) 设置树莓派串口启动
    重新插拔 SD 卡连接到主机上,此时主机会显示找到两个分区,一个是 rootfs, 一个是 boot ,在 boot 分区找到 config.txt 文件
    在末尾加入如下内容:

    dtoverlay=pi3-disable-bt
    enable_uart=1

    前者表示设备树禁用蓝牙设备,后者表示启动串口

  2. (主机) 连接串口,树莓派的 pin14 和 pin15 分别是 Tx0 和 Rx0,串口默认配置为 115200 8N1 ,推荐使用 minicom

  3. 将 SD 卡插入树莓派,连接电源启动

  4. (树莓派) 树莓派通过 sudo raspi-config 命令配置一些参数

    • 修改用户密码 (1. change user password)
      树莓派默认账号是 username: pi, password: raspberry

    • 修改启动项 (2. boot options -> B1 Desktop / CLI),选择启动界面为控制台,而不是图形界面
      这里要说明的是,如果家里只有 WiFi 而没有以太网,建议这里先不设置,因为后面需要使用图形界面连接网络
      可以在后面运行 Qt 程序之前再设置

    • 修改显存大小 (7. advanced options -> A3 Memory Split),设置大小为 256M

    修改结束后重新启动

  5. (树莓派) 树莓派更新固件和驱动

    sudo rpi-update
    sudo reboot
  6. (树莓派) 树莓派更新程序并安装必要的文件
    1. 首先修改 /etc/apt/sources.list 文件 (注意要用管理员权限), 去掉 deb-src 所在这一行头部的 # 号,解开注释

    2. 更新必要的库

      sudo apt-get update
      sudo apt-get build-dep qt4-x11
      sudo apt-get build-dep libqt5gui5
      sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
  7. (树莓派) 在树莓派新建文件夹
    sudo mkdir /usr/local/qt5pi
    sudo chown pi:pi /usr/local/qt5pi
  8. (主机) 在主机安装 gcc 交叉工具链

注意: 这里没有采用树莓派 github 上提供的工具链,主要原因是那个工具链太老了,4.8 版本的 gcc。

这里推荐 linaro 的 gcc 工具链,版本为 6.3,32 位和 64 位主机请选择各自对应的工具链,下载好后解压到 ~/raspi 文件夹中

  1. (主机) 主机创建 sysroot ,这是 Qt5 之后官方推荐的一种编译方案,类似于在主机上提供编译 ARM 版本 Qt 所需要的库和头文件等环境,实现交叉编译
    mkdir sysroot sysroot/usr sysroot/opt
    rsync -avz pi@raspberrypi.local:/lib sysroot
    rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
    rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
    rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt

    请注意:

    • 下面的 raspberrypi.local 是 树莓派的 IP 地址,它必须和主机在同一个局域网下,可以直连,也可以通过路由器
    • rsync 命令将远程的树莓派的文件同步到主机,这里可能耗时比较长,取决于网络质量。需要说明的是,有些博客会将整个 rootfs 的所有文件都同步到主机,即 rsync -avz pi@raspberrypi.local:/ sysroot,这样要传输的文件实在是太多了,不推荐这么做。
    • 如果在传输时,出现 permission denied ,说明有些文件传输需要管理员权限,不用管它,一般这些文件不是很重要
    • 如果出现 connection refused 错误,说明需要在树莓派上开启 ssh 服务,可以去 google 找一下怎么开启
  2. (主机) 修复同步带来的路径问题
    wget https://raw.githubusercontent.com/riscv/riscv-poky/priv-1.10/scripts/sysroot-relativelinks.py
    chmod +x sysroot-relativelinks.py
    ./sysroot-relativelinks.py sysroot
  3. (主机) 主机上配置 Qt ,可以直接下载 Qt 源码或者去 Qt 的 Git 库下载对应版本的模块,我这里采用第一种方式
    源码地址如下: https://www1.qt.io/offline-installers/ ,选择下载 Linux/macOS 对应的 tar.xz 文件 ,解压,命令行切换到 Qt 源码根目录,输入如下配置命令:

    ./configure -release -opengl es2 -device linux-rasp-pi3-g++  -device-option CROSS_COMPILE=~/raspi/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -no-use-gold-linker -no-gbm -skip qtlocation -skip qtscript -v

    注意:

    1. 64 位主机采用 -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- ,32 位主机采用 -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
    2. 对于 5.9.1 或更高版本的 Qt,添加 -no-use-gold-linker 选项,我上面已经加了
    3. 这里有一个 Bug,所以需要加上 -no-gbm ,否则 Qt 编译会出错
    4. 不编译 qtlocationqtscript 模块,这两个模块编译时也会出错
    5. 注意,如果不是树莓派3, 则选择对应的 device 选项: inux-rasp-pi-g++ for RPi, linux-rasp-pi2-g++ for RPi2 and linux-rasp-pi3-g++ for RPi3.
    6. 上面的命令中,-extprefix ~/raspi/qt5pi 指定了 Qt 交叉编译库存放位置,-hostprefix ~/raspi/qt5 指定了Qt 编译的可执行工具存放的位置,比如 qmake

    配置结束后,显示可以编译的功能如下:

    Build options:
      Mode ................................... release
      Optimize release build for size ........ no
      Building shared libraries .............. yes
      Using C++ standard ..................... C++1z
      Using ccache ........................... no
      Using gold linker ...................... no
      Using new DTAGS ........................ yes
      Using precompiled headers .............. yes
      Using LTCG ............................. no
      Target compiler supports:
        NEON ................................. yes
      Build parts ............................ libs
    Qt modules and options:
      Qt Concurrent .......................... yes
      Qt D-Bus ............................... yes
      Qt D-Bus directly linked to libdbus .... yes
      Qt Gui ................................. yes
      Qt Network ............................. yes
      Qt Sql ................................. yes
      Qt Testlib ............................. yes
      Qt Widgets ............................. yes
      Qt Xml ................................. yes
    Support enabled for:
      Using pkg-config ....................... yes
      udev ................................... yes
      Using system zlib ...................... yes
    Qt Core:
      DoubleConversion ....................... yes
        Using system DoubleConversion ........ yes
      GLib ................................... yes
      iconv .................................. no
      ICU .................................... yes
      Tracing backend ........................ <none>
      Logging backends:
        journald ............................. no
        syslog ............................... no
        slog2 ................................ no
      Using system PCRE2 ..................... no
    Qt Network:
      getifaddrs() ........................... yes
      IPv6 ifname ............................ yes
      libproxy ............................... no
      Linux AF_NETLINK ....................... yes
      OpenSSL ................................ yes
        Qt directly linked to OpenSSL ........ no
      OpenSSL 1.1 ............................ no
      SCTP ................................... no
      Use system proxies ..................... yes
    Qt Gui:
      Accessibility .......................... yes
      FreeType ............................... yes
        Using system FreeType ................ yes
      HarfBuzz ............................... yes
        Using system HarfBuzz ................ no
      Fontconfig ............................. yes
      Image formats:
        GIF .................................. yes
        ICO .................................. yes
        JPEG ................................. yes
          Using system libjpeg ............... yes
        PNG .................................. yes
          Using system libpng ................ yes
      EGL .................................... yes
      OpenVG ................................. no
      OpenGL:
        Desktop OpenGL ....................... no
        OpenGL ES 2.0 ........................ yes
        OpenGL ES 3.0 ........................ yes
        OpenGL ES 3.1 ........................ yes
        OpenGL ES 3.2 ........................ yes
      Vulkan ................................. no
      Session Management ..................... yes
    Features used by QPA backends:
      evdev .................................. yes
      libinput ............................... yes
      INTEGRITY HID .......................... no
      mtdev .................................. yes
      tslib .................................. yes
      xkbcommon-evdev ........................ yes
    QPA backends:
      DirectFB ............................... no
      EGLFS .................................. yes
      EGLFS details:
        EGLFS OpenWFD ........................ no
        EGLFS i.Mx6 .......................... no
        EGLFS i.Mx6 Wayland .................. no
        EGLFS RCAR ........................... no
        EGLFS EGLDevice ...................... no
        EGLFS GBM ............................ no
        EGLFS VSP2 ........................... no
        EGLFS Mali ........................... no
        EGLFS Raspberry Pi ................... yes
        EGL on X11 ........................... no
      LinuxFB ................................ yes
      VNC .................................... yes
      Mir client ............................. no
      X11:
        Using system-provided XCB libraries .. yes
        EGL on X11 ........................... no
        Xinput2 .............................. yes
        XCB XKB .............................. yes
        XLib ................................. yes
        XCB render ........................... yes
        XCB GLX .............................. yes
        XCB Xlib ............................. yes
        Using system-provided xkbcommon ...... no
        Native painting (experimental) ....... yes
    Qt Widgets:
      GTK+ ................................... no
      Styles ................................. Fusion Windows
    Qt PrintSupport:
      CUPS ................................... yes
    Qt Sql:
      DB2 (IBM) .............................. no
      InterBase .............................. no
      MySql .................................. no
      OCI (Oracle) ........................... no
      ODBC ................................... yes
      PostgreSQL ............................. yes
      SQLite2 ................................ yes
      SQLite ................................. yes
        Using system provided SQLite ......... no
      TDS (Sybase) ........................... yes
    Qt Testlib:
      Tester for item models ................. yes
    Qt SerialBus:
      Socket CAN ............................. yes
      Socket CAN FD .......................... yes
    QtXmlPatterns:
      XML schema support ..................... yes
    Qt QML:
      QML network support .................... yes
      QML debugging and profiling support .... yes
      QML delegate model ..................... yes
    Qt Quick:
      Direct3D 12 ............................ no
      AnimatedImage item ..................... yes
      Canvas item ............................ yes
      Support for Qt Quick Designer .......... yes
      Flipable item .......................... yes
      GridView item .......................... yes
      ListView item .......................... yes
      Path support ........................... yes
      PathView item .......................... yes
      Positioner items ....................... yes
      Repeater item .......................... yes
      ShaderEffect item ...................... yes
      Sprite item ............................ yes
    Qt Gamepad:
      SDL2 ................................... no
    Qt 3D:
      Assimp ................................. yes
      System Assimp .......................... no
      Output Qt3D Job traces ................. no
      Output Qt3D GL traces .................. no
      Use SSE2 instructions .................. no
      Use AVX2 instructions .................. no
      Aspects:
        Render aspect ........................ yes
        Input aspect ......................... yes
        Logic aspect ......................... yes
        Animation aspect ..................... yes
        Extras aspect ........................ yes
    Qt 3D Renderers:
      OpenGL Renderer ........................ yes
    Qt 3D GeometryLoaders:
      Autodesk FBX ........................... no
    Qt Wayland Client ........................ no
    Qt Wayland Compositor .................... no
    Qt Bluetooth:
      BlueZ .................................. no
      BlueZ Low Energy ....................... no
      Linux Crypto API ....................... no
      WinRT Bluetooth API (desktop & UWP) .... no
    Qt Sensors:
      sensorfw ............................... no
    Qt Quick Controls 2:
      Styles ................................. Default Fusion Imagine Material Universal
    Qt Quick Templates 2:
      Hover support .......................... yes
      Multi-touch support .................... yes
    Qt Multimedia:
      ALSA ................................... yes
      GStreamer 1.0 .......................... yes
      GStreamer 0.10 ......................... no
      Video for Linux ........................ yes
      OpenAL ................................. no
      PulseAudio ............................. yes
      Resource Policy (libresourceqt5) ....... no
      Windows Audio Services ................. no
      DirectShow ............................. no
      Windows Media Foundation ............... no
    Qt WebEngine:
      Embedded build ......................... yes
      Pepper Plugins ......................... no
      Printing and PDF ....................... no
      Proprietary Codecs ..................... no
      Spellchecker ........................... yes
      Native Spellchecker .................... no
      WebRTC ................................. no
      Use System Ninja ....................... no
      Geolocation ............................ no
      Use v8 snapshot ........................ yes
      Building v8 snapshot supported ......... no
      Use ALSA ............................... yes
      Use PulseAudio ......................... yes
      Optional system libraries used:
        re2 .................................. no
        icu .................................. no
        libwebp, libwebpmux and libwebpdemux . no
        opus ................................. no
        ffmpeg ............................... no
        libvpx ............................... no
        snappy ............................... no
        libsrtp .............................. no
        glib ................................. yes
        zlib ................................. yes
        minizip .............................. no
        libevent ............................. no
        jsoncpp .............................. no
        protobuf ............................. no
        libxml2 and libxslt .................. no
        lcms2 ................................ no
        png .................................. yes
        JPEG ................................. yes
        harfbuzz ............................. no
        freetype ............................. yes
      Required system libraries:
        fontconfig ........................... yes
        dbus ................................. yes
        nss .................................. no
        khr .................................. yes
        glibc ................................ yes
      Required system libraries for qpa-xcb:
        libdrm ............................... yes
        xcomposite ........................... no
        xcursor .............................. no
        xi ................................... no
        xrandr ............................... no
        xtst ................................. no

    可以发现,opegl es 是可以编译的
    (主机) 编译并安装,命令如下:

    make -j4
    make install
  4. (主机) 部署 Qt 库到树莓派 ,同步 Qt 库到先前创建的文件夹
    rsync -avz qt5pi pi@raspberrypi.local:/usr/local
  5. (树莓派) 树莓派更新库依赖索引文件
    注意: 由于最新版本的 raspbian 镜像已经自带 qt5 库文件了,所以为了避免混淆,我们设为 00-qt5pi.conf ,这样 qt 程序会首先依赖我们编译的库,而不是镜像自带的库

    echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/00-qt5pi.conf
    sudo ldconfig
  6. (树莓派) 修复 EGL 库 ,使用硬件 GPU ,而不是 mesa 实现的 OpenGL
    sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup
    sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup
    sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
    sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
  7. (树莓派) 添加遗失的 openGL 库的 软链接
    sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
    sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2
  8. (主机) Qt例程测试 ,在主机交叉编译测试程序并传输到树莓派
    cd qtbase/examples/opengl/qopenglwidget
    ~/raspi/qt5/bin/qmake
    make
    
    scp qopenglwidget pi@raspberrypi.local:/home/pi
  9. (树莓派) 树莓派运行程序,完美
    cd ~
    chmod +x ./qopenglwidget 
    ./qopenglwidget

    效果如下:

2. 配置主机 Qt Creator 环境

  1. Tools -> Build & Run -> Compilers
    手动添加编译器 C 和 C++ 各一个,如果是 64 位机器,还是使用 ~/raspi/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
    32 位主机同理

  2. Tools -> Build & Run -> Debugger 手动添加调试器,
    我的位置是 ~/raspi/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb , 32 位主机同理

  3. Tools -> Build & Run -> Qt Versions 手动添加我们前面编译好的 Qt 版本,我们需要指定的是 qmake 的路径,我这里的路径是 ~/raspi/qt5/bin/qmake

  4. Tools -> Devices 手动添加 generic linux 设备,需要指定树莓派的 IP 地址,用户名和密码

  5. Tools -> Build & Run -> Kits 手动添加新的套件,需要指定设备,qt 版本以及编译器和调试器,这都是我们前面设置好了的

  6. 从 Qt 例程里随便挑选一个,选择我们的 kits ,点击 “Run”,然后看到远程的树莓派直接运行程序了,完美

3. 交叉编译 OpenCV 3.2.0

参考的博客:

其中第三篇博客给的启示最多,但主要还是自己尝试成功的

  1. (树莓派) 在树莓派安装需要的头文件和库,有两种方法
    方法一: 手动指定所有依赖的包

    sudo apt-get install build-essential cmake pkg-config libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libgtk2.0-dev libgtk-3-dev libcanberra-gtk* libatlas-base-dev gfortran python2.7-dev python3-dev

    方法二: 直接安装所有编译 opencv 需要的包

    sudo apt-get build-dep opencv

    我采用的是第二种,但会出现 openjdk 配置冲突的问题,需要去 树莓派官方论坛寻求解决方案
    有兴趣的同学可以试下第一种

  2. (主机) 主机下载 opencv 源码包,地址如下:

    依惯例,解压到 ~/raspi 目录

  3. (主机) 重新同步主机和树莓派

    rsync -avz pi@raspberrypi.local:/lib sysroot
    rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
    rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
    rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt

    这里有好几点注意的地方:

    • 由于先前在树莓派将 opengl 的库指向 /opt/vc/lib/libEGL.so ,这里我们同步到主机后,需要在主机这边再改回来,让软连接还是指向 mesa 实现的 opengl 库,但树莓派上可以保持不变

    • 由于树莓派 /usr/lib/arm-linux-gnueabihf 路径下已经存在官方编译好的一套 Qt 库,但我们并不需要,所以同步到主机后,为了避免编译 opencv 时,出现混淆,主机上需要删除这个目录下的所有 Qt 库

      rm -rf ~/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libQt*
    • 如果主机安装了 Anaconda,请在编译 opencv 时,屏蔽掉环境变量 PATH 中指向 anaconda 可执行文件的路径,因为 anaconda 也自带一份 Qt 库,它也会干扰我们的编译

  4. (主机) 交叉编译 opencv
    首先在 ~/raspi 目录下创建 pi.toolchain.cmake 文件,内容如下,注意需要根据自己的主机修改变量 HOST_HOME ,这里我的路径为 /home/bruno

    set(HOST_HOME_PATH /home/bruno)
    set(PI_ROOT ${HOST_HOME_PATH}/raspi/sysroot)
    set(ENV{PKG_CONFIG_PATH} "{PI_ROOT}/usr/lib/arm-linux-gnueabihf/pkgconfig:{PI_ROOT}/usr/lib/pkgconfig")
    set(ENV{PKG_CONFIG_SYSROOT_DIR} "${PI_ROOT}")
    set(PKG_CONFIG_EXECUTABLE "${PI_ROOT}/usr/bin/arm-linux-gnueabihf-pkg-config")
    set(ENV{LD_LIBRARY_PATH} "${PI_ROOT}/usr/lib")
    set(ENV{C_INCLUDE_PATH} "${PI_ROOT}/usr/include")
    set(ENV{CPLUS_INCLUDE_PATH} "${PI_ROOT}/usr/include")
    
    SET(CMAKE_SYSTEM_NAME Linux)
    
    set(CMAKE_C_COMPILER ${HOST_HOME_PATH}/raspi/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc )
     set(CMAKE_CXX_COMPILER ${HOST_HOME_PATH}/raspi/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ )
    
    SET(FLAGS "-Wl,-rpath-link,{PI_ROOT}/opt/vc/lib -Wl,-rpath-link,{PI_ROOT}/lib/arm-linux-gnueabihf -Wl,-rpath-link,{PIROOT}/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link,{PI_ROOT}/usr/lib")
    
    UNSET(CMAKE_C_FLAGS CACHE)
    UNSET(CMAKE_CXX_FLAGS CACHE)
    SET(CMAKE_CXX_FLAGS ${FLAGS} CACHE STRING "" FORCE)
    SET(CMAKE_C_FLAGS ${FLAGS} CACHE STRING "" FORCE)
    
    include_directories(${HOST_HOME_PATH}/raspi/sysroot/usr/include/arm-linux-gnueabihf) 
    
    set( WITH_QT )
    set (QT_QMAKE_EXECUTABLE  ${HOST_HOME_PATH}/raspi/qt5/bin/qmake )
    set (Qt5Concurrent_DIR ${HOST_HOME_PATH}/raspi/qt5pi/lib/cmake/Qt5Concurrent)
    set (Qt5Core_DIR  ${HOST_HOME_PATH}/raspi/qt5pi/lib/cmake/Qt5Core)
    set (Qt5Gui_DIR  ${HOST_HOME_PATH}/raspi/qt5pi/lib/cmake/Qt5Gui)
    set (Qt5Test_DIR  ${HOST_HOME_PATH}/raspi/qt5pi/lib/cmake/Qt5Test)
    set (Qt5Widgets_DIR  ${HOST_HOME_PATH}/raspi/qt5pi/lib/cmake/Qt5Widgets)
    set(CMAKE_SYSROOT ${PI_ROOT})
    
    SET(CMAKE_FIND_ROOT_PATH ${PI_ROOT})
    SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    
    # for libraries and headers in the target directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    
    # include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")

    跳转到 opencv 源码根目录,创建 build 目录,配置
    配置结果如下:

       --   OpenCV modules:
       --     To be built:                 core flann imgproc ml photo reg surface_matching video dnn fuzzy imgcodecs shape videoio highgui objdetect plot superres ts xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib cvv datasets rgbd stereo tracking videostab xfeatures2d ximgproc aruco optflow phase_unwrapping stitching structured_light
       --     Disabled:                    world contrib_world
       --     Disabled by dependency:      -
       --     Unavailable:                 cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 python3 viz cnn_3dobj freetype hdf matlab sfm
       -- 
       --   GUI: 
       --     QT 5.x:                      YES (ver 5.11.1)
       --     QT OpenGL support:           NO
       --     OpenGL support:              NO
       --     VTK support:                 NO
       -- 
       --   Media I/O: 
       --     ZLib:                        /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.8)
       --     JPEG:                        /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libjpeg.so (ver )
       --     WEBP:                        build (ver 0.3.1)
       --     PNG:                         /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.6.28)
       --     TIFF:                        /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 - 4.0.8)
       --     JPEG 2000:                   build (ver 1.900.1)
       --     OpenEXR:                     /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libImath.so /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libIlmImf.so /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libIex.so /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libHalf.so /home/bruno/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libIlmThread.so (ver Unknown)
       --     GDAL:                        NO
       --     GDCM:                        NO
       -- 
       --   Video I/O:
       --     DC1394 1.x:                  NO
       --     DC1394 2.x:                  NO
       --     FFMPEG:                      NO
       --       avcodec:                   NO
       --       avformat:                  NO
       --       avutil:                    NO
       --       swscale:                   NO
       --       avresample:                NO
       --     GStreamer:                   NO
       --     OpenNI:                      NO
       --     OpenNI PrimeSensor Modules:  NO
       --     OpenNI2:                     NO
       --     PvAPI:                       NO
       --     GigEVisionSDK:               NO
       --     Aravis SDK:                  NO
       --     UniCap:                      NO
       --     UniCap ucil:                 NO
       --     V4L/V4L2:                    NO/YES
       --     XIMEA:                       NO
       --     Xine:                        NO
       --     gPhoto2:                     NO
       -- 
       --   Parallel framework:            pthreads
       -- 
       --   Other third-party libraries:
       --     Use IPP:                     NO
       --     Use VA:                      NO
       --     Use Intel VA-API/OpenCL:     NO
       --     Use Lapack:                  NO
       --     Use Eigen:                   YES (ver 3.3.2)
       --     Use Cuda:                    NO
       --     Use OpenCL:                  YES
       --     Use OpenVX:                  NO
       --     Use custom HAL:              NO
       -- 
       --   OpenCL:                        <Dynamic loading of OpenCL library>
       --     Include path:                /home/bruno/raspi/opencv-3.2.0/3rdparty/include/opencl/1.2
       --     Use AMDFFT:                  NO
       --     Use AMDBLAS:                 NO
       -- 
       --   Python 2:
       --     Interpreter:                 /usr/bin/python2.7 (ver 2.7.12)
       -- 
       --   Python 3:
       --     Interpreter:                 /usr/bin/python3 (ver 3.5.2)
       -- 
       --   Python (for build):            /usr/bin/python2.7
       -- 
       --   Java:
       --     ant:                         NO
       --     JNI:                         /home/bruno/raspi/sysroot/usr/lib/jvm/default-java/include /home/bruno/raspi/sysroot/usr/lib/jvm/default-java/include/linux /home/bruno/raspi/sysroot/usr/lib/jvm/default-java/include
       --     Java wrappers:               NO
       --     Java tests:                  NO
       -- 
       --   Matlab:                        Matlab not found or implicitly disabled
       -- 
       --   Documentation:
       --     Doxygen:                     NO
       -- 
       --   Tests and samples:
       --     Tests:                       NO
       --     Performance tests:           YES
       --     C/C++ Examples:              NO
       -- 
       --   Install path:                  /home/bruno/raspi/libopencv
       -- 
       --   cvconfig.h is in:              /home/bruno/raspi/opencv-3.2.0/build

    可以看到,Qt 库确实是会被编译的
    然后编译,安装,这一步祈祷别出错吧

    make -j4
    make install
  5. (树莓派) 创建 opencv 库文件夹
    sudo mkdir /usr/local/libopencv
    sudo chown pi:pi /usr/local/libopencv
  6. (主机) 部署 opencv 库文件到树莓派
    rsync -avz libopencv pi@raspberrypi.local:/usr/local
  7. (树莓派) 让系统知道 OpenCV 库文件的路径
    echo /usr/local/libopencv/lib | sudo tee /etc/ld.so.conf.d/opencv.conf
    sudo ldconfig

    不知道为什么, opencv 库会依赖 PulseAudio 库文件,在树莓派执行以下命令

    echo /usr/lib/arm-linux-gnueabihf/pulseaudio | sudo tee /etc/ld.so.conf.d/libpulse.conf
    sudo ldconfig
  8. (主机) 交叉编译测试程序,这里有两套测试程序
    第一套是纯 cmake 测试 opencv
    新建 test 文件夹,创建 CMakeLists.txt 文件,指定编译的目标程序,以及依赖的库文件和头文件,同样需要修改 HOST_HOME_PATH 变量,指定自己的主机路径

    新建 toolchain.cmake 文件,指定交叉工具链 和 sysroot 路径

    新建 sobel.cpp 文件

    创建 build 文件夹,配置并编译,然后远程传输

    mkdir build && cd build
    cmake -D CMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
    make 
    scp TEST pi@raspberrypi.local:/home/pi
  9. (树莓派) 执行程序,下面的 lena.png 可以自己在网上拷贝一张图片过来就好了
    ./TEST lena.png

    效果如下:

注:第二套测试同时测试 Qt 和 Opencv ,需要使用摄像头

可以直接用 USB 摄像头,或者使用 CSI 摄像头,如果是后者,需要在 /etc/modules-load.d/modules.conf 末尾加一行:

bcm2835-v4l2

重启后,会在 /dev 目录下出现 video0 设备

这里直接给出 项目链接,自己用 Qt Creator 打开后,选择 raspberry pi kit 即可

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 博主赞过: