2. 福建师范大学 光电与信息工程学院, 医学光电科学与技术教育部重点实验室, 福州 350007
2. Key Laboratory of Optoelectronic Science and Technology for Medicine (Ministry of Education), College of Photonic and Electronic Engineering, Fujian Normal University, Fuzhou 350007, China
车道偏离检测和前向车距检测的目的是防止无人车偏离本车道或者与前方车辆距离较近时发生交通事故. 近年来, 国内外学者基于机器视觉的方法对车道偏离[1–4]和车距检测技术[5–7]展开了相应的研究. 本文在前人研究的基础上, 实现了车道偏离和车距检测算法的改进与仿真, 并移植到嵌入式平台上测试.
车道偏离检测算法和车辆前向车距检测算法均需要通过相机采集的图像重建出三维世界, 以此算出客观世界中的真实数据. 在机器视觉中, 三维重建可以定义为根据图像坐标系与世界坐标系的转换关系进而计算到相机参数, 进一步推导出图像坐标与世界坐标系的关系, 因此车道偏离检测与防撞检测的首要条件是相机标定. 本文采用张氏相机标定方法[8].
1 相机标定原理相机标定的理论推导涉及4种坐标系, 分别是以像素为单位的像素平面坐标系
(1)图像物理坐标系到像素坐标系的转换
图像像素坐标系
$\left[ \begin{array}{l} u \\ v \\ 1 \\ \end{array} \right] = \left[ \begin{array}{l} 1/{d_x}\;\;\;\;0\;\;\;\;\;\;{u_0} \\ 0\;\;\;\;\;\;\;\;1/{d_y}\;\;{v_0} \\ 0\;\;\;\;\;\;\;\;\;0\;\;\;\;\;\;\;1 \\ \end{array} \right]\left[ \begin{array}{l} x \\ y \\ 1 \\ \end{array} \right]$ | (1) |
(2)相机坐标系到物理坐标系的转换
光心是相机坐标系
${Z_c}\left[ \begin{array}{l} x \\ y \\ 1 \\ \end{array} \right] = \left[ \begin{array}{l} f\;\;0\;\;0\;\;0 \\ 0\;\;f\;\;0\;\;0 \\ 0\;\;\;0\;\;1\;\;0 \\ \end{array} \right]\left[ \begin{array}{l} {X_c} \\ {Y_c} \\ {Z_c} \\ \;1 \\ \end{array} \right]$ | (2) |
(3)世界坐标系到相机坐标系的转换
世界坐标系
$\left[ \begin{array}{l} {X_c} \\ {Y_c} \\ {Z_c} \\ \;1 \\ \end{array} \right] = \left[ \begin{array}{l} R\;\;\;T \\ {O^{\rm T}}\;\;1 \\ \end{array} \right]\left[ \begin{array}{l} {X_w} \\ {Y_w} \\ {Z_w} \\ \;\;1 \\ \end{array} \right]$ | (3) |
整合4个坐标系的转换关系, 可以得出像素坐标系与世界坐标系的变换过程, 其转换过程为:
${Z_c}\left[ \begin{array}{l} u \\ v \\ 1 \\ \end{array} \right] = \left[ \begin{array}{l} f{d_x}\;\;\;0\;\;\;{u_0}\;\;0 \\ 0\;\;\;\;f{d_y}\;\;{v_0}\;\;0 \\ 0\;\;\;\;\;0\;\;\;\;\;1\;\;\;0 \\ \end{array} \right]\left[ \begin{array}{l} R\;\;\;T \\ {O^{\rm T}}\;\;1 \\ \end{array} \right]\left[ \begin{array}{l} {X_w} \\ {Y_w} \\ {Z_w} \\ \;\;1 \\ \end{array} \right]{{ = A[R \;T]M}}$ | (4) |
式(4)中包含有
(4)求解相机畸变参数
在几何光学和阴极射线管显示中, 畸变是对直线投影的一种偏移, 即一条直线投影到图片上并不是以直线的形式投影在图像上. 一般将畸变分成对图像的投影影响较大的径向畸变和切向畸变, 其表达式为:
$ \begin{array}{l} \left[\!\! \begin{array}{l} {x_{crt}}\\ {y_{crt}} \end{array} \!\!\right] \!=\! \left( {1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6}} \right)\left[\!\! \begin{array}{l} x\\ y \end{array}\!\! \right]\;({\text{径向畸变}})\\ \;\;\;\;\;\;\;\;\;\;\;\;\;\; + \left[ \begin{array}{l} 2{p_1}xy + {p_2}\left( {{r^2} + 2{x^2}} \right)\\ 2{p_1}\left( {{r^2} + 2{y^2}} \right) + 2{p_2}xy \end{array} \right]\;\;({\text{水平畸变}}) \end{array} $ | (5) |
(5) OpenCV上的相机标定
张氏标定法简单稳定, 因此得到广泛的使用. 具体标定步骤如下:
① 制作棋盘标定板: 在固定的相机角度下, 拍摄不同角度, 多尺度且旋转多变的棋盘图像20张, 棋盘格数为9×5.
② 令棋盘的左上角为世界坐标原点, 初始化棋盘格上所有角点的世界坐标, 且
③ 引用calibrateCamera()函数计算相机的内外参数和畸变参数得到的标定参数为:
畸变系数:
相机内参矩阵:
车距检测模型, 如图4所示. 假设相机能够获取的路面区域为ABCD, 路面E点投影在图像最顶边的
根据图4的路面建模图, 结合相机成像规则, 可以得到以下关系:
(1)
(2) if
if
(3) 又:
(4)无人车与前车距离:
本文在实验室通过模拟车道来测试算法的可靠性. 相机光心投影在图像上的像素坐标为(u0, v0) = (268.62, 192.25), x方向的焦距为
图5中随机的路面坐标
表1中的距离结果以mm为单位, 角度单位为度, 从模拟路面上的6组数据中可以看出, 实际值与测量值的误差较小, 在10 m内的误差控制在200 mm内, 说明本文建立的车距测量模型较准确. 在实际的高速路面上, 安全车距不少于50米, 可以通过本文的算法设置固定的车距安全阈值来实现车距安全检测.
2.3 构建车道偏离模型
由于无人车驾驶过程中容易出现偏航现象, 如果不及时调整方向便会偏离到其他车道. 此外, 车辆压到分道线导致左轮或者右轮偏离在其他车道中, 将影响其他车辆的正常运行, 甚至导致不可预知的交通事件, 因此需要车道偏离提示. 车辆准备超车时会提前打开左转向灯, 所以, 无人车在没有检测到左转向灯打开时, 车道偏离报警系统才会发挥相应的警报作用.
无人车正常行驶时, 行驶方向与左右分道线趋近平行, 因而, 可以利用车道俯视图模型来计算出偏航的角度和车辆与左右分道的边距, 以做出相应的报警信息反馈.
$\vartriangle y = \left\{ \begin{aligned} & \vartriangle {y_{\rm{1}}} = \frac{{{b_l}}}{2} - \left( {{y_0} + \frac{{{b_c}}}{2}} \right)\\ & \vartriangle {y_{\rm{2}}}= \frac{{{b_l}}}{2} + \left( {{y_0} - \frac{{{b_c}}}{2}} \right) \end{aligned} \right.$ | (6) |
CCP算法需要预知无人车的横向宽度
相机的光心在图像上的坐标为
如图8所示, 在路面上建立一个路面坐标, 以分道线平行的中线为正向y轴, 无人车所在的位置横向为x轴, 右方向为正, 其中
(1)无人车偏航角的计算
① 余太武[9]计算左右车道的角平分线作为车道中线, 而本文计算车道中线的方法是基于左右车道斜率和截距求平均的方法.
$ {\text{车道中线}}:y=\frac{{{k}_{1}}+{{k}_{2}}}{2}\cdot x+\frac{{{b}_{1}}+{{b}_{2}}}{2} $ | (7) |
如图9所示, 基于角平分线求解车道中线的方法存在误差, 而基于式(7)求解的结果正确.
② 基于2.1节介绍的路面建模图像, 我们随机取车道中线上的某点
根据余弦定理求
$\varphi {\rm{ = arccos}}\left( {\frac{{{{\left| {F{V_o}} \right|}^2} + {{\left| {{P_o}{V_o}} \right|}^2} - {{\left| {F{P_o}} \right|}^2}}}{{2\left| {F{V_o}} \right|\left| {P{V_o}} \right|}}} \right),\;\;\varphi \in \left[ {0,\pi } \right]$ | (8) |
③ 计算偏航角:
$\left\{ \begin{array}{l} \theta = \left\{ \begin{array}{l} \varphi {\rm{ - }}\pi {\rm{/2}}\;\;\;\varphi \ge \pi /2\;\\ \pi {\rm{/2 - }}\varphi \;\;\;\varphi < \pi /2 \end{array} \right.,\;\;\;\theta \in \left[ {{\rm{0}},\dfrac{\pi }{2}} \right]\\ {\rm if}\;\;{\theta > \pi /36} \;\; \Rightarrow \;{\text{车辆行驶方向开始偏离车道}} \end{array}\right. $ | (9) |
(2)无人车与左右分道线的距离计算
① 计算
② 若
无人车距左分道线距离为:
${D_{\rm L}} = \frac{{{b_l}}}{2} - \left( {{y_0} + \frac{{{b_c}}}{2}} \right)$ | (11) |
无人车距右分道线距离:
$ {D_{\rm R}} = \frac{{{b_l}}}{2} + \left( {{y_0} - \frac{{{b_c}}}{2}} \right) $ | (12) |
③ 若
无人车距左分道线距离:
$ {D_{\rm L}} = \frac{{{b_l}}}{2} + \left( {{y_0} - \frac{{{b_c}}}{2}} \right) $ | (13) |
无人车距右分道线距离:
$ {D_{\rm R}} = \frac{{{b_l}}}{2}{\rm{ - }}\left( {{y_0}{\rm{ + }}\frac{{{b_c}}}{2}} \right) $ | (14) |
获取到无人车与左右分道线的偏离距离和偏航角后, 就可以设定相应的阈值来判断当前无人车的行驶状况. 如图10所示, 沿车道方向分割成安全区域和报警区域. 对于一般小车宽度为1.5–1.8 m之间, 标准高速路宽度为3.7 m. 本文设置车辆与左右分道线0.5 m范围内为报警区, 车道中间2.75 m内为安全区.
2.4 车道偏离试验
如图11所示为两帧车道偏离检测结果, 其中第1行输出为车辆左轮与左分道线的间距和右轮与右分道线的间距; 第2行输出为车辆行驶方向与车道中线的偏航角, 当偏航角小于5度时表示行驶方向正常. 第3行表示车辆当前的运行状态, 只有当偏航角、无人车与左右分道线的间距不超过设定的安全阈值时才会断定为正常行驶.
如图12所示, 本文实验模拟的车道宽度为120 cm, 车辆宽度为36 cm, 相机投影在地面到图像底边的实际地面边界的距离为205 cm, 其高为70 cm, 模拟得到的结果为表2和表3.
3 算法在DSP-DM3730上的移植
TI公司的DM3730[10,11]整合了具有控制优势的ARM核和具有运算优势的DSP核. DSP端依靠DSP/BIOS操作系统来支持音视频算法, ARM端依靠Linux系统来控制芯片的外部设备, 而ARM与DSP双核之间的数据传输与通信则依赖Codec Engine架构来管理[12]. ARM+DSP框架如图13所示.
3.1 硬件资源
(1)处理器: DM3730处理器.
① Pin-to-Pin兼容DM3730系列处理器.
② 1000-MHz主频ARM CortesxTM-A8内核.
③ 800-MHz DSP TMS320C64x+TM内核.
④ 片内集成存储器用于ARM CPU(16 KB I-Cache, 16 KB D-Cache, 256 KB L2 Cache)和片上存储(64 KB SHared SDRAM, 112 KB ROM).
(2)存储器: Micron mDDR与NandFlash集成芯片.
① 256 MByte 32位mDDR 133 MHz.
② 512 MByte 16位Nand Flash.
(3)视频接口、USB接口、音频插座、调试接口、SD/MMC插座、电源接口、串口插座、扩展接口、网络接口.
3.2 软件资源搭建软件开发平台的资源有:VirtualBox; uBuntu V10.04; PC端的超级终端Tera Term Pro.
安装TI提供的支持音频和视频算法的DVSDK组件包, 该包含有各算法支持库和各支持库的调用管理引擎(Code Engine), 以及XDM算法的编译工具xdctools, 同时提供了音频、视频算法进行编解码的例程以供参考. 利用该包可以很方便地开发DSP下的图像语音处理软件, 并且实现ARM与DSP之间的联系. Codec Engine是DVSDK组件包的核心模块, 是ARM和DSP的通信与数据传输桥梁, 过渡于ARM应用层和DSP信号处理层之间. 该模块要与DSP端建立的Codec Engine服务器进行通信需要使用DSP/BIOS、DSP Link、DSP算法接口的标准xDIAS[13]和XDM协议. 为了发挥DM3730的双核作用, Codec Engine、DSP Link、xDIAS和XDM是软件中不可缺少的部分.
DM3730开发板可以从板载的NandFlash中启动, 也可以从SD卡的Fat32分区中启动. 无论是从板载的NandFlash中启动还是从SD卡启动, 都需要用XLoader对开发板进行一些初始化工作, 接着从NandFlash/SD中读取Uboot程序到存储器, 然后Uboot从NandFlash/SD卡读入启动参数, 加载Linux内核uImage到存储器, 解压缩后运行, 直到Linux内核启动后, 重新初始化DM3730板, 加载NandFlash/SD卡上的FileSystem, 执行FileSystem中的程序并启动控制台. 由此可见, 开发板上的Xloader、Uboot、uImage和文件系统在整个启动过程是层层依赖的关系.
3.3 搭建交叉编译环境安装DVSDK组件包后有自带的交叉编译器—arm-arago-linux-gnueabi-gcc. 只需将DVSDK组件包中的交叉编译器的安装路径添加在用户目录中的.bashrc文件中即可.
3.4 搭建网络文件传输服务(TFTP)TFTP网络能将编译的程序和数据烧写到目标版上运行, 或将目标版上文件或者运行结果上传到Linux主机端. tftp工作目录在/tftpboot, 在文件传输过程中, 均需要先将文件拷贝到该目录下, 然后才能在超级终端Tera Term Pro中使用以下命令实现uBuntu和目标板中文件的传输:
(1) tftp -g -r fileName uBuntu的IP地址
(2) tftp -p -l fileName uBuntu的IP地址
(3) g: get, -r: remote, -p: put, -l: local
3.5 移植OpenCV和EMCV库OpenCV开源的视觉库提供了丰富的图像处理算法, 在各大操作系统上均可编译通过生成相应的执行文件, 因此, 这些代码只要经过适当修改和编译便可移植在嵌入式系统中.
EMCV库基于C语言实现, 能运行于TI DM64x系列DSP中, 移植EMCV相当于把OpenCV中少部分算法移植到DSP中[14].
在DM3730的ARM应用程序中调用交叉编译后的OpenCV接口函数, 而在DSP端调用EMCV接口函数. 适用cmake交叉编译OpenCV库之前, 需要编译安装ffmpeg资源包、libx264和libxvid两个库、汇编编译器yasm, 以及libpng和libjpeg库, OpenCV才能读取和显示png和jpeg格式图片, 而libpng库的安装依赖于zlib库.
所有库的安装目录均设置在交叉编译的目录中, 且将编译安装后的生成库通过tftp网络传送到目标板的lib目录上. 至此, 就可以实现在DM3730目标板的ARM端调用OpenCV库函数了.
本文使用Qt开发图形界面对处理后的视频在LCD上显示. 先在Qt中的项目文件.pro中添加OpenCV的头文件路径和库文件. 编译后生成的二进制文件传送到目标板的文件系统上就可以在ARM端调用OpenCV函数接口, 处理后的结果使用Qt来显示.
使用Codec Engine作为ARM和DSP的连接桥梁, 模仿Codec Engine自带的video_copy例程来添加算法. 针对EMCV的移植, 将EMCV的文件添加到video_copy中, 并在配置文件中添加EMCV的文件名. 车道识别和车辆检测算法移植后, 进而测试本文的车道偏离检测和车距安全检测算法, 得到的效果良好.
3.6 算法的移植TI的DVSDK组件包提供了Codec Engine软件模块来实现ARM和DSP的通信和协同工作. Codec Engine是一组应用程序编程接口, 用于实例化和运行xDAIS算法, 还有VISA(Video, Image, Speech, Audio)接口, 用于与xDM兼容的xDAIS算法进行交互[15,16], 使ARM端的Linux可以调用VISA标准接口来管理ARM与DSP的软件. 如图14所示, Codec Engine框架中, Server集成Codec端算法, DSPLink模块隐藏了APP调用Server端算法的整个过程, 因此在实例应用中只能看到Server和APP端.
如图15所示, ARM应用程序调用Codec Engine的VISA API接口, VIDENC_process(a, b, c)传递a, b, c参数, Codec Engine的stub会把参数a, b, c以及VISA接口信息封装处理, 利用消息队列msgq传递给DSP端. DSP端的skeleton解开这个封装包, 把ARM端的参数a, b, c (虚拟地址)转换成DSP端的参数x, y, z(物理地址). DSP端的处理process中的请求即能实现ARM端VIDENC_process(a, b, c)函数的操作[17,18].
3.7 实验结果
图16为本文算法移植在DM3730平台上的运行结果. 已知采集高速车道视频的相机内外参, 使用本文的车距模型和车道偏离模型, 计算的车距和车道偏离角度均显示在图片上. 车辆正常行驶拍摄到的视频得到的检测结果良好.
4 结论与展望
本文的车距检测模型[19], 不但能够检测前方车辆与无人车的距离, 还能计算出前方车辆相对于相机光轴的偏转角度. 基于CCP车道偏离算法, 建立车道偏离模型, 实现了无人车当前位置和相对于分道线的偏航角的计算, 并设定无人车在车道上的安全区和警报区实现车道偏离的及时报警. 对于车距的建模, 在实验室模拟车道计算路面上的随机点, 得到的误差较小, 稳定性较好. 对于车道偏离检测, 模拟高速路车道搭建车道偏离模型, 计算车辆偏离车道的偏航角且车辆与左右分道线的距离, 检测误差范围小, 准确性较高. 还使用运行状况良好的高速路视频测试本文算法, 偏离反馈均显示正常. 尽管本文采用先进的ARM+DSP框架实现车辆动态图像识别的系统设计, 且采用Codec Engine框架实现ARM和DSP的通信, 实验过程稳定性较高, 但是在嵌入式平台内存和运行主频有限且运行算法尚未优化的情况下难以实现算法的实时性处理, 因此有待完善运行平台, 更好地协调车道检测、车辆检测与跟踪、车道偏离检测和车距检测4个模块. 有待进一步使用本文的算法在路面上测试.
[1] |
韦庭. 基于单目视觉的辅助驾驶系统中的图像处理研究[硕士学位论文]. 成都: 电子科技大学, 2012.
|
[2] |
Risack R, Mohler N, Enkelmann W. A video-based lane keeping assistant. Proceedings of the IEEE Intelligent Vehicles Symposium 2000. Dearborn, MI, USA. 2002. 356–361.
|
[3] |
Lee S, Kwon W, Lee JW. A vision based lane departure warning system. Proceedings 1999 IEEE/RSJ International Conference on Intelligent Robots and Systems. Human and Environment Friendly Robots with High Intelligence and Emotional Quotients. Kyongju, Republic of Korea. 1999. 160–165.
|
[4] |
戴斌, 裘伟. 逆透视投影下车道偏离时间的在线估计. 计算机工程与应用, 2007, 43(21): 235-238. DOI:10.3321/j.issn:1002-8331.2007.21.071 |
[5] |
李欣. 基于单目视觉的车辆前方障碍物测距[硕士学位论文]. 西安: 西安建筑科技大学, 2013.
|
[6] |
佟卓远. 基于机器视觉的前方车辆检测与测距系统设计[硕士学位论文]. 哈尔滨: 哈尔滨工业大学, 2015.
|
[7] |
Bao DS, Wang PK. Vehicle distance detection based on monocular vision. 2016 International Conference on Progress in Informatics and Computing. Shanghai, China. 2017.
|
[8] |
Zhang Z. A flexible new technique for camera calibration. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2000, 22(11): 1330-1334. DOI:10.1109/34.888718 |
[9] |
余太武. 基于机器视觉的车道偏离预警研究[硕士学位论文]. 昆明: 昆明理工大学, 2013.
|
[10] |
Texas Instruments: SPRS685D. DM3730, DM3725 Digital Media Processors.
|
[11] |
朱银忠. 基于DM3730的人脸识别系统设计[硕士学位论文]. 苏州: 苏州大学, 2012.
|
[12] |
Texas Instruments: SPRUE67D. Codec Engine Application Developer User’s Guide.
|
[13] |
Texas Instruments: SPRAAE7B. Using Adapters to Run Existing xDAIS Algorithms with Codec Engine.
|
[14] |
陈存弟, 刘金清, 刘引, 等. 基于DM642的纹理检测与Adaboost分类器相结合的车牌定位. 计算机系统应用, 2017, 26(7): 56-64. DOI:10.15888/j.cnki.csa.005853 |
[15] |
吴厚源. 基于DM3730的疲劳驾驶预警系统[硕士学位论文]. 厦门: 厦门大学, 2014.
|
[16] |
Texas Instruments. TMS320DM3730 Software Developers Guide.
|
[17] |
林上升, 韩润萍. 基于OMAP3530硬件平台的ARM和DSP协同开发方法. 电子技术应用, 2013, 39(2): 6-8, 11. DOI:10.3969/j.issn.0258-7998.2013.02.001 |
[18] |
李阳. 3G移动定位与视频监控系统的设计与实现[硕士学位论文]. 哈尔滨: 哈尔滨工程大学, 2014.
|
[19] |
陈存弟. 基于DSP的智能交通车辆动态图像识别[硕士学位论文]. 福州: 福建师范大学, 2019
|