一、在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——2. Qt的交叉编译(带EGLFS支持)

在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——2. Qt的交叉编译(带EGLFS支持)

本系列导航

1. 对交叉编译的基本理解
2. Qt的交叉编译(带EGLFS支持)

3. OpenCV的交叉编译(OpenCV4.5.0)


目标

  1. PC端(Ubuntu) 上编译的 Qt程序 能够在 树莓派 上执行
  2. 交叉编译的Qt要带EGLFS支持。

EGLFS是一个Qt5的平台插件,它的作用就是让QT应用直接运行在EGL和OpenGL ES 2.0上。说白了,就是能让你绕过图形桌面,直接从显卡输出Qt图像到屏幕。

一、环境介绍

  1. 硬件设备
    树莓派 Raspberry Pi 4B,镜像版本为2021-01-11-raspios-buster-armhf-full;
    PC端的Ubuntu18.04(在VMware 16.0 Pro虚拟机上运行)。
  2. 软件版本
    Qt 5.14.2

二、在树莓派上的前期准备

!!注意!!
这部分操作全部在树莓派上进行

1. 更新树莓派固件(本地更新)

如果直接执行

sudo rpi-update

大概率不会成功,因此直接提供本地更新的方法。
Click Me,链接至本地更新方法

2. 在树莓派上安装依赖包

这里有的没的建议都安装上,防止后面交叉编译缺少依赖。下面的包可能有重复的,为了保险可以都执行一遍,如果树莓派发现包已经安装过了,只是会提示,并不会造成隐患或不好的影响。

先更新。

sudo apt-get update
sudo apt-get upgrade

再安装。

sudo apt-get install libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev
sudo apt-get install libgles2-mesa-dev libgbm-dev
sudo apt-get install ttf-wqy-zenhei
sudo apt-get install gdbserver
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
sudo apt-get install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libicu-dev libinput-dev libxkbcommon-dev libsqlite3-dev libssl-dev libpng-dev libjpeg-dev libglib2.0-dev libraspberrypi-dev libpq-dev libmariadbclient-dev bluez libbluetooth-dev build-essential
sudo apt-get install libboost1.58-all-dev libudev-dev libinput-dev libts-dev libmtdev-dev libjpeg-dev libfontconfig1-dev libssl-dev libdbus-1-dev libglib2.0-dev libxkbcommon-dev
sudo apt-get install dbus-*dev
sudo apt install libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev libxkbcommon-x11-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev
sudo apt install ninja-build libdrm-dev

3. 在树莓派上建立文件夹并修改权限

sudo mkdir /usr/local/qt5pi   # 用来安装qt运行库
sudo chown -R pi:pi /usr/local/qt5pi
mkdir /home/pi/qt5  # 用来存放以后自己写的qt程序可执行文件

4. 在树莓派上开启GL Driver,并以命令行模式启动

sudo raspi-config

选择 1 System Options
在这里插入图片描述
选择 S5 Boot / Auto Login
在这里插入图片描述

选择 B2 Console Autologin
在这里插入图片描述

注:如果之后还想开机进入桌面的话,同样在这里修改,选择 B4 Desktop Autologin 即可。

然后按照系统提示重启,重启后自动进入命令行。

5. 在树莓派上把用户pi添加到渲染组

sudo gpasswd -a pi render

二、在PC上的前期准备

1. 在PC上下载交叉编译器并配置环境变量

创建文件夹,我的目录是:

mkdir ~/Work/raspi
mkdir ~/Work/raspi/cross-compile-tool
cd ~/Work/raspi

linaro网站下载交叉编译工具链合并放到~/Work/raspi/cross-compile-tool目录下,包括gcc、runtime、sysroot三项:
在这里插入图片描述
!!注意!!
合并指的是把三个压缩包的内容合并到一个文件夹下,所以cross-compile-tool文件夹看起来应该是这样的:
在这里插入图片描述

配置环境变量

打开profile文件

sudo nano /etc/profile

profile文件最后一行增加下面这行代码。

export PATH=$PATH:~/Work/raspi/cross-compile-tool/bin

ctrl+o保存文件,回车, ctrl+x 退出nano编辑器。

刷新环境变量。

source /etc/profile

测试变量是否写入成功(如果看到了刚刚设置的PATH就是成功了)。

echo $PATH

打开sudoers。

sudo nano /etc/sudoers

修改secure_path路径内容(把交叉编译工具链的路径放在secure_path的后面)。

secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/yjx/Work/raspi/cross-compile-tool/bin"

ctrl+o保存文件,回车, ctrl+x 退出nano编辑器。

检查配置是否完成(注意,两个都需要有正常的版本信息输出,这一步才算完成)。

arm-linux-gnueabihf-g++ -v
sudo arm-linux-gnueabihf-g++ -v

2. 在PC上下载Qt Creator安装包和Qt源码

这里的子目录,Click Me下载:
① qt-opensource-linux-x64-5.14.2.run(安装包)
② qt-everywhere-src-5.14.2.tar.xz(源码)

安装包可直接运行。(不知道装啥组件的话就全装上)
在这里插入图片描述
源码解压,可解压到目录~/Work/raspi。
在这里插入图片描述

3. 在PC上创建并配置sysroot

这一步是要把树莓派上的库都传到PC上来,形成一个和树莓派一样的环境,方便交叉编译的时候链接到里面的库和头文件。

在PC上执行以下命令把树莓派的库和头文件拷贝到PC上(IP地址要改成自己的)。

cd ~/Work/raspi
rsync -avz pi@192.168.31.188:/lib sysroot
rsync -avz pi@192.168.31.188:/usr/include sysroot/usr
rsync -avz pi@192.168.31.188:/usr/lib sysroot/usr
rsync -avz pi@192.168.31.188:/opt/vc sysroot/opt

附一个问题的解决:
报错:rsync error: some files/attrs were not transferred (see previous errors) (code 23)
解决方法,Click Me。

利用网上现成的python脚本修改sysroot里面的软链接(把路径从树莓派的绝对路径改为PC上对应的路径)。

cd ~/Work/raspi
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

三、交叉编译Qt

配置编译参数(先编译qtbase)。

cd ~/Work/raspi/qt-everywhere-src-5.14.2/qtbase/

./configure -release -opengl es2 -device linux-rasp-pi4-v3d-g++ -device-option CROSS_COMPILE=~/Work/raspi/cross-compile-tool/bin/arm-linux-gnueabihf- -sysroot ~/Work/raspi/sysroot -opensource -confirm-license -reduce-exports -make libs -prefix /usr/local/qt5pi -extprefix ~/Work/raspi/qt5pi -hostprefix ~/Work/raspi/qt5pi-host -v
参数说明
-opengl es2编译时带opengl
-device linux-rasp-pi4-v3d-g++选择目标设备为Raspberry Pi 4
-device-option CROSS_COMPILE=~/Work/raspi/cross-compile-tool/bin/arm-linux-gnueabihf-交叉编译器路径
-sysroot ~/Work/raspi/sysrootsysroot的路径
-prefix /usr/local/qt5piQt在树莓派中的路径
-extprefix ~/Work/raspi/qt5piPC上的交叉编译后Qt的路径(这个目录下的内容最终会被放到树莓派上)
-hostprefix ~/Work/raspi/qt5pi-host在PC上交叉编译Qt工程的工具存放的位置(里面有qmake)

这里是我的build options,供参考(可在config.summary中查看)。

Build options:
  Mode ................................... release
  Optimize release build for size ........ no
  Building shared libraries .............. yes
  Using C standard ....................... C11
  Using C++ standard ..................... C++17
  Using ccache ........................... no
  Using new DTAGS ........................ yes
  Relocatable ............................ 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
  Zstandard support ...................... no
Qt Core:
  DoubleConversion ....................... yes
    Using system DoubleConversion ........ yes
  GLib ................................... yes
  iconv .................................. no
  ICU .................................... yes
  Built-in copy of the MIME database ..... yes
  Tracing backend ........................ <none>
  Logging backends:
    journald ............................. no
    syslog ............................... no
    slog2 ................................ no
  PCRE2 .................................. yes
    Using system PCRE2 ................... yes
Qt Network:
  getifaddrs() ........................... yes
  IPv6 ifname ............................ yes
  libproxy ............................... no
  Linux AF_NETLINK ....................... yes
  OpenSSL ................................ yes
    Qt directly linked to OpenSSL ........ no
  OpenSSL 1.1 ............................ yes
  DTLS ................................... yes
  OCSP-stapling .......................... yes
  SCTP ................................... no
  Use system proxies ..................... yes
  GSSAPI ................................. no
Qt Gui:
  Accessibility .......................... yes
  FreeType ............................... yes
    Using system FreeType ................ yes
  HarfBuzz ............................... yes
    Using system HarfBuzz ................ yes
  Fontconfig ............................. yes
  Image formats:
    GIF .................................. yes
    ICO .................................. yes
    JPEG ................................. yes
      Using system libjpeg ............... yes
    PNG .................................. yes
      Using system libpng ................ yes
  Text formats:
    HtmlParser ........................... yes
    CssParser ............................ yes
    OdfWriter ............................ yes
    MarkdownReader ....................... yes
      Using system libmd4c ............... no
    MarkdownWriter ....................... 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 ................................. yes
  Session Management ..................... yes
Features used by QPA backends:
  evdev .................................. yes
  libinput ............................... yes
  INTEGRITY HID .......................... no
  mtdev .................................. yes
  tslib .................................. yes
  xkbcommon .............................. yes
  X11 specific:
    XLib ................................. yes
    XCB Xlib ............................. yes
    EGL on X11 ........................... 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 ...................... yes
    EGLFS GBM ............................ yes
    EGLFS VSP2 ........................... no
    EGLFS Mali ........................... no
    EGLFS Raspberry Pi ................... no
    EGLFS X11 ............................ yes
  LinuxFB ................................ yes
  VNC .................................... yes
  XCB:
    Using system-provided XCB libraries .. yes
    XCB XKB .............................. yes
    XCB XInput ........................... no
    Native painting (experimental) ....... no
    GL integrations:
      GLX Plugin ......................... no
      EGL-X11 Plugin ..................... yes
Qt Sql:
  SQL item models ........................ yes
Qt Widgets:
  GTK+ ................................... no
  Styles ................................. Fusion Windows
Qt PrintSupport:
  CUPS ................................... yes
Qt Sql Drivers:
  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

注意:
EGLFS EGLDevice, EGLFS GBM, EGL on x11的后面必须都是yes
EGLFS Raspberry Pi 后面是no是对的,因为它代表的是树莓派3以前的旧驱动(brcm),树莓派4不用的。

如果报错,可在config.log中查看报错信息,逐个排查。配置完成后,就可以make了。这里make -j4的数字一般是CPU核数目的两倍,表示同时可以执行4个编译命令。可以根据自己CPU的性能修改,尽量缩短编译时间,提高效率。

make -j4

然后:

make install

至此,qtbase就编译成功了。

注意,这里只编译了qtbase,还有很多其他的模块没有编译,而且其他模块之前存在相互依赖关系,需要按一定的先后顺序进行编译。以编译quickcontrols2为例:

由于qtquick2依赖于qtquick,而quick属于qtdeclarative,所以先编译qtdeclarative

cd ~/Work/raspi/qt-everywhere-src-5.14.2/qtdeclarative

用刚刚编译出来的qmake工具来配置。

~/Work/raspi/qt5pi-host/bin/qmake

make,会安装到~/Work/raspi/qt5pi中。

make -j4 && make install

再编译我们要的quickcontrols2,步骤一样。

cd ~/Work/raspi/qt-everywhere-src-5.14.2/qtquickcontrols2

~/Work/raspi/qt5pi-host/bin/qmake

make -j4 && make install

最后把编译好的Qt安装到树莓派上去(要改成自己树莓派的IP地址)。

cd ~/Work/raspi
rsync -avz qt5pi pi@192.168.31.188:/usr/local

四、配置Qt Creator

打开Qt Creator,进入Tools→Options…→Devices
添加(Add…): Generic Linux Device
输入树莓派的用户名和ip地址,并选择用ssh私钥建立连接。具体方法,Click Me。
Tools→Options…→Kits→Compilers,Add添加交叉编译工具链(我的本来就有的,无需手动添加,如图。)
在这里插入图片描述
Tools→Options…→Kits→Debuggers,Add添加debugger
在这里插入图片描述
Tools→Options…→Kits→Qt Versions,Add添加qmake
在这里插入图片描述
Tools→Options…→Kits→Kits,Add并配置如下图(都选择刚刚配置的那些)。
在这里插入图片描述
保存退出,重启Qt Creator。

五、例程测试

在树莓派上配置环境变量
把以下内容追加到/etc/profile最后,可以根据需求自行修改。

# 存放我们自己编写的qt程序的路径
export PATH=$PATH:/home/pi/qt5  

# eglfs屏幕物理尺寸,单位毫米
export QT_QPA_EGLFS_PHYSICAL_WIDTH=255
export QT_QPA_EGLFS_PHYSICAL_HEIGHT=143

# eglfs屏幕分辨率
export QT_QPA_EGLFS_WIDTH=1920
export QT_QPA_EGLFS_HEIGHT=1080

# 其他
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH # 链接库路径
export QTDIR=/usr/local/qt5pi
export QT_QPA_FONTDIR=$QTDIR/lib/fonts 
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins/ 
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_HIDECURSOR=1
export QT_QPA_EGLFS_ALWAYS_SET_MODE="1" # 这个非常重要,我也不知道为啥,没有这条就不行
export QWS_MOUSE_PROTO=/dev/input/event0 # 触摸屏输入设备
export QML_IMPORT_PATH=$QTDIR/qml
export QML2_IMPORT_PATH=$QTDIR/qml

保存退出后重启树莓派。

编译一个例程
在Qt Creator中选择File→Open File or Project…
选择 [Qt Creator安装目录]/Examples/Qt-5.14.2/opengl/cube/cube.pro
修改cube.pro(删去原来的target.path,改成树莓派上放程序的路径)

target.path = /home/pi/qt5

左下角设备选择树莓派,然后点三角形运行。成功!

说明:
树莓派桌面下运行程序的方法:

cd ~/qt5
./cube --platform xcb

总结

主要参考:
https://zhuanlan.zhihu.com/p/138021025
https://wiki.qt.io/RaspberryPi2EGLFS

撒花✿✿ヽ(°▽°)ノ✿

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 在Ubuntu系统上,使用QtOpenCV可以实现人脸识别功能。需要先安装QtOpenCV的相关库文件,并在Qt中创建一个新的项目。在项目中导入OpenCV库,并在程序中编写人脸识别算法。可以使用OpenCV提供的CascadeClassifier类对人脸进行识别,并将识别结果显示在Qt界面上。 在识别人脸之前,需要训练一个识别器。可以使用OpenCV提供的train\_cascade工具进行训练,先准备一些包含人脸的正样本图片和一些不包含人脸的负样本图片,在训练过程中,识别器会不断调整参数,直到达到最佳识别效果。 在Qt界面上,可以使用QImage类加载图片,并使用QLabel类显示图片和人脸识别结果,也可以使用QPainter类对图片进行绘制,标出人脸的区域。为了提高识别准确率,可以对人脸图像进行预处理,如灰度化、直方图均衡化等操作。 总的来说,利用Ubuntu系统中的QtOpenCV库,实现人脸识别功能是一件相对容易实现的任务,唯一需要注意的是算法的准确性和效率,需要利用更高级的算法来提高识别的准确率和效率。 ### 回答2: 在Ubuntu操作系统下,结合QTOpenCV可以实现人脸识别功能。首先需要安装OpenCVQT库,可以通过在终端输入命令sudo apt-get install opencv以及sudo apt-get install qt5-default来完成安装。 在QT Creator中新建一个项目,选择QT Widgets Application,然后在主窗口中添加一个按钮和一个标签,作为启动和显示人脸识别结果的界面。然后在该项目文件中添加OpenCV库文件,在项目中添加头文件#include<opencv2/opencv.hpp>。 接下来,需要编写人脸识别程序的代码,使用opencv中的cv::CascadeClassifier类进行人脸检测和识别。首先需要加载训练好的人脸分类器分类器的xml文件,可通过以下代码完成:cv::CascadeClassifier faceCascade;faceCascade.load("haarcascade_frontalface_alt.xml"); 在QT程序中添加启动人脸识别的槽函数,可以使用QT预设的信号和槽机制实现按钮单击后运行人脸识别程序。槽函数中调用OpenCV函数,用分类器进行人脸检测和识别,并把结果输出到QT程序中的标签对象上。 最后编译和运行程序,当单击按钮后,程序即可开始运行人脸识别功能,对抓取的图像进行实时分析和识别。注意,在命令行设置摄像头参数时要注意摄像头分辨率和帧率的设置,以保证识别效果和程序运行流畅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值