瑞芯微Rockchip开发者社区
直播中

李郝荫

7年用户 1333经验值
私信 关注
[问答]

如何交叉编译QT并将其作为gui供opencv使用呢

是什原因导致opencv无法使用gui的?
如何交叉编译QT并将其作为gui供opencv使用呢?

回帖(1)

李惠英

2022-2-17 09:16:52
Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399 (二)

前言:上一篇博客里介绍了如何交叉编译opencv并将其部署至RK3399开发板上,但由于GTK的问题导致opencv无法使用gui,这篇博客就将介绍如何交叉编译QT,并将其作为gui供opencv使用。
一、环境介绍

Host :PC端ubuntu18.04 64位
Target:ARM64开发板 firefly-RK3399 lubuntu18.04 64位
版本:3.4.9
QT版本:5.9.9&5.12.2
二、PC端交叉编译QT5.9.9

如果有触摸屏需求则需要额外交叉编译tsilb,如果用不到触摸功能则可以不编译,
按照步骤编译完成后部署至开发板上发现虽然选择了linuxfb作为显示驱动,但是会与RK3399上的lubuntu的图形界面冲突,虽然QT的gui程序可以正常运行,但是显示会与系统的图形界面冲突。猜测可能是5.9.9对于基于X11的嵌入式linux系统支持不够好。
三、PC端交叉编译QT5.12.2

由于上一步中交叉编译得到的Qt5.9.9在RK3399上并不能正常使用,于是在firefly的官网上查询了有关firefly-Rk3399对于QT的支持问题,在官网上找到了一个已经交叉编译好的qt5.12.2
将其拷贝并解压至RK3399的/opt目录下,已经附带了一个说明文档如下:

# Qt 5.12.2 arm64 ubuntu18.04 Cross Compile


Firefly Qt5.12.2 ,Work Environment


*   Host(x86 PC)  : ubuntu 18.04 x86_64


*   Target(RK3399, RK3328, PX30): ubuntu 18.04 arm64


## Host Deployment


```shell
$ apt install -y cros***uild-essential-arm64
$ cd firfly_arm64_qt5.12.2_18.04
$ cp -rfd host/opt  /
$ cp host/opt/qtEnv.sh  /etc/profile.d/
reboot


Target Deployment


$ cd firfly_arm64_qt5.12.2_18.04
$ cp -rfd host/opt/firefly_qt5.12.2_arm64_18.04/ext  /opt/firefly_qt5.12.2
$ cp target/qtEnv.sh /etc/profile.d/
$ cp target/qt.conf /etc/ld.so.conf.d
$ ldconfig
$ reboot




# Install base library
$ apt install -y
      libmtdev1
      libinput10
      libxkbcommon0  
      libdouble-conversion1
      libicu60
      libharfbuzz0b


#Qt QPA Backends
# linuxfb
$ export QT_QPA_PLATFORM=LINUXFB
$ export QT_QPA_FB_DRM=1
$ demo/analogclock


#eglfs
$ export QT_QPA_PLATFORM=EGLFS
$ export QT_QPA_EGLFS_INTEGRATION=EGLFS_KMS #in minimal ubuntu, use eglfs_kms.
$ export QT_QPA_EGLFS_KMS_ATOMIC=1  #use drm atomic api or legacy api(two different)
$ export QT_QPA_EGLFS_HIDECURSOR=1  #hide cursor
$ demo/openglwindow


#xcb (Ubuntu Desktop)
$ apt install -y
      libxcb-icccm4
      libxcb-image0
      libxcb-shm0
      libxcb-keysyms1
      libxcb-render0
      libxcb-render-util0  
      libxcb-shape0
      libxcb-sync1
      libxcb-xfixes0
      libxcb-xinerama0
      libxcb-xkb1
      libxcb-randr0
      libsm6
      libice6
      libxkbcommon-x11-0


$ export QT_QPA_PLATFORM=xcb
Cross Compile on Host


$ cd example/
$ qmake
$ make


分别列举了三种不同显示驱动linuxfb/eglfs/xcb所需要安装的对应依赖,可以根据需求不同在开发板上安装好对应的依赖。
三.RK3399开发板上的部署

上述的说明文档中必须严格按照它的文件路径去安放对应文件,不然运行上述傻瓜式脚本也会出错,实际上只需要像之前一篇配置opencv一样去部署即可,后续的其它软件的移植也可仿照以下两个步骤进行部署。
1. 添加动态库加载路径

运行Vim /etc/ld.so.conf.d/qt.conf,会提示该文件不存在将新建一个新的conf文件,在打开的conf第一行里写上自己第一步解压的qt的lib地址,如
/home/firefly/wangrui/firefly_qt5.12.2/lib
若你是解压在/opt文件夹下则是:
/opt/firefly_qt5.12.2/lib
vim中输入:wq指令保存并退出,随后运行sudo ldconfig激活生效。
2. 环境变量配置

firefly官方已经给了qt环境变量配置的脚本qtEnv.sh如下:
QT5_12_2PATH="/opt/firefly_qt5.12.2"


LD_LIBRARY_PATH=$QT5_12_2PATH/lib:$LD_LIBRARY_PATH
LIBRARY_PATH=$QT5_12_2PATH/lib:$LIBRARY_PATH
C_INCLUDE_PATH=$QT5_12_2PATH/include:$C_INCLUDE_PATH
CPLUS_INCLUDE_PATH=$QT5_12_2PATH/include:$CPLUS_INCLUDE_PATH
PATH=$QT5_12_2PATH/bin:$PATH


PKG_CONFIG_PATH=$QT5_12_2PATH/lib/pkgconfig:$PKG_CONFIG_PATH
QT_QPA_PLATFORM_PLUGIN_PATH=$QT5_12_2PATH/plugins


export LD_LIBRAY_PATH
export LIBRAY_PATH
export C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH


export PKG_CONFIG_PATH
export PATH
运行Vim /etc/bash.bashrc 进入编辑模式后,在最后一行将上述的qtEnv的内容全部复制上去,再在后面选择复制对应的显示驱动方式,如export QT_QPA_PLATFORM=xcb,只需要确保第一行qt的文件路径与你开发板上的一致即可,vim中运行:wq保存退出,随后运行source ~/.bashrc激活生效。
至此qt在开发板上的部署就全部完成了,接下来可以运行qt自带的一些示例去检测一下qt是否能在开发板上正常工作。
四.实例交叉编译及运行

若之前按照第二步交叉编译了qt5.9.9则可以在交叉编译后的/qt5.9.9/examples文件夹下找到已经编译好的可执行程序,若没有则可以到5.12.2的源码的example里qmake & make去交叉编译想要测试的程序,这里选择了qt两个示例程序analogclock和dials,时钟显示的gui以及有鼠标交互的旋钮程序,将交叉编译好的程序拷贝至开发板任意目录,并在此目录中运行指令./dials即可,开发板上运行效果如下:


至此代表qt的交叉编译及移植已经成功,下一步就是要将openCV和qt二者结合,在开发板上实现openCV处理qt作为gui显示。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分