在上一节中,我们在MaaXBoard上使用Qt实现了车载数字仪表盘,本节中,我们继续使用Qt环境,继续完善基于MaaXBoard的ADAS系统,开发一个基于OpenCV的车道线检测应用。
车道线检测是一个非常重要的ADAS应用,无论在辅助驾驶乃至自动驾驶领域,都具有举足轻重的地位。 对于车道线检测有两种主流方法,传统的图像处理方法和基于深度学习的方法。 在本文中,我们使用传统图像处理方法实现一个车道线检测的ADAS应用。
官方系统只包含了基础库,并不包含OpenCV库。所以我们最开始需要在MaaXBoard上编译安装OpenCV库,本节中,我们使用源码编译的方式进行安装。
首先下载OpenCV源代码,我选用了OpenCV 3.4.4版本。
使用cmake-gui工具对工程进行配置,我们开启了项目所需的功能,以及OpenCV针对ARM处理器的NEON加速优化,这样可以进一步提高在i.MX8M上的图形处理速度。
经过一段时间的编译,OpenCV库编译成功,使用make install 安装到系统中。
依赖库安装完毕,下一步,编写基于OpenCV的车道线检测程序,为了便于和上一节中的仪表盘程序整合到一起,我们继续使用C++语言编写。
使用Qt Creator打开上一节的数字仪表盘程序,在上一节的工程文件中添加OpenCV库的头文件目录和库路径。
为了便于工程的平台迁移与配置复用,我们使用独立的.pri文件存放OpenCV库的相关配置,这一点类似于Visual Studio中的.props文件。
下面对车道线检测子系统进行功能分解,车道线检测功能主要由两部分构成:图像采集部分以及图像处理部分。
整个软件流程比较简单:图像采集部分获取车载摄像头到的视频图像,将每一帧图像数据交给图像处理程序,图像处理程序识别出图像内包含的车道线,并在原图像中绘制出来,最终封装成QML视频组件,在ADAS界面中显示出来。
在main.cpp主程序中,我们将图像采集与处理程序封装为一个自定义QML组件,这样就可以在QML程序中导入并运行它。
- #include <QApplication>
- #include <QQuickView>
- #include <QQmlEngine>
- #include "CameraToolBox.h"
- int main(int argc, char **argv)
- {
- QApplication app(argc, argv);
- qmlRegisterType<CameraToolBox>("CameraToolBox", 1, 0, "CameraToolBox");
- QQuickView view;
- view.setSource(QUrl("qrc:/main.qml"));
- app.connect(view.engine(), &QQmlEngine::quit, &QApplication::quit);
- view.show();
- app.exec();
- return 0;
- }
在QML编写的前端显示界面中,通过添加数行代码,数字仪表盘组件与ADAS车道线检测组件实现了无缝结合。
程序编译完毕后,在MaaXBoard上运行。
在运行测试中,传统的车道线检测方法在MaaXBoard上达到了平均18 FPS的帧率,竟然与在PC平台上程序运行的帧率不相上下。可见i.MX8M处理器的图像处理能力还是很强的。原程序逻辑相对比较简单,处于Debug原型状态,还没有实施进一步优化,预计优化后的程序是有希望达到实时标准的。
在视频处理和显示的同时,仪表盘也能够流畅运行,小小的一块MaaXBoard上能够流畅实现如此计算量的计算和显示应用,确实值得肯定!
ADAS完整工程已上传github并开源,欢迎大家下载或提出宝贵意见!
Github地址:https://github.com/CoreBoxer/ADAS-panel