随着全球汽车电子产业以及智能交通科技的快速发展, 自2006年全景辅助泊车概念提出来以后, 全景技术成为各大汽车厂商以及科研单位的一大研究热点[1]. 全景视频成像系统是在车辆前、后以及侧方安装车载相机, 采集车辆四周图像通过校正、拼接等处理, 在终端实时显示车辆四周全景图像. 目前国外的全景辅助泊车研究技术成熟, 如日产、丰田等的环境监视系统, 目前只针对高档轿车或SUV上配备, 价格也较为昂贵[2]. 国内的汽车制造厂家目前没有一款成熟的辅助产品, 主要是针对算法上的优化. 文献[3]在TMS320DM6437嵌入式平台上实现4路高清广角摄像头的实时全景拼接; 文献[4,5]在FPGA平台上实现了2–4路的全景拼接处理, 文献[6]在将算法移植到GPU平台实现了6路2 k视频的全景拼接, 实时输出4 k高清视频. 对于大型车辆比如些重卡、货运车来说, 由于车体较大, 长宽高几倍于小型车辆, 需要选用更多的大视场镜头以保证车辆四周场景的全覆盖, 相邻相机间具有足够的重叠区域. 由此系统需要采用高速数据传输接口以及具备更强并行计算处理能力以保证视频数据的实时传输与处理. 目前国内外针对10路及以上高清镜头的全景视频成像系统实现方案还不成熟.
本文选择FPGA结合GPU高性能嵌入式平台, 设计了12路同步高清鱼眼相机的车载全景视频成像系统, 硬件方面采用 FPGA+TX2嵌入式平台, 通过PCIE口进行12路摄像头数据采集处理, 软件方面为了获取较高的图像配准精度进行了拼接算法的优化, 实现在TX2平台上的拼接算法移植, 结合CUDA并行加速技术实现 在FPGA+TX2嵌入式平台全景鸟瞰图的实时拼接输出, 为驾驶员提供车体周围360°景象, 保证安全驾驶、泊车, 避免视觉盲区隐患.
1 总体框架设计全景视觉系统是一套车辆驾驶辅助系统, 采用178°超广角高清鱼眼镜头, 选用FPGA结合NVIDIA TX2平台实现视频信号采集、全景实时拼接显示等功能. 其中FPGA主要实现12路HD-SDI高清视频信号采集、颜色空间转换, 通过PCIE接口将图像数据传送给TX2, 利用GPU的大数据并行加速优势进行畸变校正、鸟瞰变换、配准融合等算法处理, 最后将全景拼接俯视图回传给FPGA端进行显示, 辅助车辆驾驶员直观、实时地查看车辆周边盲区或障碍物, 做出正确判断和操作, 提高行车安全.
2 硬件平台设计系统总体结构框图如下图所示, 以Xilinx公司的Kintex UltraScale系列FPGA芯片作为核心芯片, 系统整体由电源、JTAG、图像采集、图像缓存、数据处理和显示等部分组成, 总体结构框图如图1.
系统工作流程如下: 系统上电后, 由FPGA采集车辆不同方位12路鱼眼镜头的实时高清图像, 在外部存储器DDR4中进行乒乓缓存, 经过预处理将视频数据由YCbCr转为RGB, 然后通过PCIe_X4接口将12路RGB图像数据传给GPU模块, 在GPU上经过鱼眼畸变校正、鸟瞰变换、图像配准、图像拼接融合、剪切合成等一系列算法处理, 生成车体周围鸟瞰视角的360°全景高清拼接图像. 最后将全景拼接结果图通过PCIe_X1接口实时回传并通过SDI接口输出显示.
GPU (Graphic Process Unit, 图形处理器)[7]在并行计算、分布计算和浮点运算方面, 拥有数十倍乃至上百倍于CPU的运算能力, GPU超强的并行计算能力使得其近年来越来越多的被应用在机器学习、图像处理加速等方向. Jeston TX2[8]是Nvidia 2013年推出的一款高性能、低功耗的AI单模块超级计算机, 具有256个CUDA核, 其浮点计算能力可以达到1.5 Tflops.
CUDA是NVIDIA推出的通用并行计算架构, 采用GPU和CPU混合编程的模式. 在采用CUDA进行并行程序的编写时, 应用程序代码分为Device端代码与Host端代码两部分, 一般将逻辑较强控制、并行度较低的串行计算放在Host端执行, 而计算密度大、相互无依赖的部分放在Device端会以Kernel的形式并发执行. 通过单指令多线程(SIMT)模式, 以warp为调度单位, 一个warp中32个线程, GPU一次并发执行多个warp并行处理.
3 拼接算法原理车载全景拼接算法[9]一般包含4个模块: 鱼眼校正[10]、鸟瞰变换、图像配准、图像融合. 考虑到算法实现的实时性, 本文将算法分为拼接模型参数计算和实时拼接融合两个部分. 通过对相机的内外参数离线标定, 生成固定不变的校正映射关系以及相邻相机间的映射关系, 计算拼接参数映射表, 依据映射关系表查表实现最终的图像拼接融合, 实时输出车体周围的360度全景俯视图.
3.1 参数标定由于鱼眼镜头是一种超大视场、大孔径的成像系统, 桶形畸变严重, 需要对鱼眼相机进行标定、畸变校正[11]. 本文使用OpenCV中鱼眼模型[12]进行相机标定, 制定棋盘格标定板, 采集不同位置和方向的棋盘格标定板图像15–20幅如图2, 利用其自带的标定工具箱求解出相机内参A和畸变参数K如表1所示, 相机内参是固有参数, 一经标定后可重复使用. 利用标定的参数对鱼眼图像进行校正, 校正结果如图3.
当鱼眼相机相对之间位置固定不变时, 其空间的变换模型也是固定不变的. 为获取鸟瞰变换矩阵以及相邻相机配准矩阵, 借助标记棋盘格, 置于相机正下方, 两边分别再放置一张标记棋盘格, 相机正下方以及两侧重叠区各摆放棋盘格分别用于标记鸟瞰阵以及相邻相机间的单应阵, 具体步骤如下:
1)车体四周摆放好棋盘格, 镜头正下方以及左右各摆一个标记物;
2)利用基于区域生长算法[13]检测视野内棋盘格, 并筛选出正下方以及左右的特征角点;
3)分别带入透视变换公式, 得到鸟瞰
$\left[ {\begin{array}{*{20}{c}} {{x{'}}} \\ {{{{y}}{'}}} \\ 1 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {{h_{11}}}&{{h_{12}}}&{{h_{13}}} \\ {{h_{21}}}&{{h_{22}}}&{{h_{23}}} \\ {{h_{31}}}&{{h_{32}}}&1 \end{array}} \right]\left[ {\begin{array}{*{20}{c}} x \\ y \\ 1 \end{array}} \right]$ | (1) |
4)校正后图像边缘畸变较大, 对图像进行有效区域提取.
3.2 逆向投映射参数计算依据上两节已经获得相机内参、畸变
鱼眼图像首先必须经过畸变校正
${H_{0n}} = {H_{01}}*{H_{21}}*\cdots*{H_{nn - 1}}$ | (2) |
$ {I{'}}\left( {{x{'}},{y{'}}} \right) = I\left( {H_{0n}^{ - 1}*H_{{\rm {bird}}}^{ - 1}*{f^{ - 1}}(A,K,x,y)} \right) $ | (3) |
3.3 拼接融合
在完成映射参数计算(如表2和表3)后, 获取从鱼眼图像到蒙版图的直接映射关系, 还需要进行双线性插值[14]处理消除边缘锯齿状. 考虑算法实时性, 对于拼接连接处的缝隙、重影情况, 重叠区域需使用渐入渐出融合算法[15], 车载相机安装好之后, 其相对位置和角度不再发生变化, 将拼接参数在实时拼接启动前拷入GPU.
4 基于GPU的全景实时拼接 4.1 全景拼接流程
FPGA将采集到的各通道视频数据通过颜色空间转换RGB数据后, 通过直接内存存储技术DMA以最高带宽速度将数据通过PCIe从CPU传送至GPU端的内存, 在GPU上进行具体的拼接融合算法运行以及加速优化, TX2上具体执行流程图如图5.
该系统首先FPGA端将离线标定好的参数文件通过串口传递给TX2; FPGA将12路图像数据通过PCIE传递给TX2, 在图像第一帧的时候根据标定参数计算出拼接参数映射表, 并将参数映射表从CPU端拷贝至GPU端; 接着将12路视频数据也从CPU端拷贝至GPU端, 在GPU端进行图像拼接融合并行处理.
4.2 拼接融合的CUDA实现GPU将各路视频数据根据重叠与非重叠区域的拼接融合参数, 以查表的方式对图像进行处理, 主要计算量为线性插值. 在实时拼接前需先将计算的拼接融合参数拷入GPU端并分配线程, 由Kernel函数进行并行实现. 在设计线程层次时, 应将并行化线程的粒度设计为一个线程对应处理一个像素.
针对重叠区域和非重叠区域不同的计算, 建立两个核函数分别进行处理. 两个Kernel函数分别在((Overlap_N+block.x - 1)/(dimBlock.x, 1)、((unOverlap_N+block.x-1)/ dimBlock.x,1)个线程块Block上执行, 每个Block上划分(16,16)个线程(thread). 其中Overlap_N和unOverlap_N分别为蒙版图重叠区域和非重叠区域的像素个数. 这样使得每个线程对应处理一个像素的插值融合计算, 同一时刻GPU并发执行多个warp, 并行索引鱼眼图像素数据源, 非重叠区域进行并行线性差值, 重叠区域并行进行差值以及加权融合计算, 最后将拼接结果图传回主机内存.
5 实验分析与总结在VS2013+Matlab上首先验证了算法的有效性, 然后将拼接算法移植到GPU上, 搭建系统环境, 采用软硬件联调的方式进行整个系统功能测试. 分别对8路和12路鱼眼相机高清输入时, 拼接生成一幅1080 P的全景环视图的性能测试, 具体如表4.
首先实时性方面, 从表中可以看出CPU端图像拼接融合过程运行时间相差不大, 其相当于一个查表过程, 计算量主要由输出图像的分辨率决定, 可适应各种大小车型; 通过CUDA的加速, 全景的拼接融合耗时8.5 ms左右, 图像数据从CPU端拷入GPU平均时间16 ms, 拼接结果图像考出时间为4 ms左右. 在Jeston tx2硬件平台上12路平均处理时间3 ms左右, 满足实时拼接的工程化需求. 但随着拼接视频路数的增多处理时间变长, 其主要耗时在CPU端到GPU内存的图像数据传送上. 最终的拼接视频效果截图如图6所示.
6 结束语
本文基于FPGA+GPU嵌入式实验平台, 实现了多路鱼眼摄像头的图像采集、缓存、处理的全景实时拼接系统. 针对目前图像拼接系统中的大数据传输、算法实时处理进行了改进优化. 通过对算法实现CUDA加速, 大幅提升了拼接速度, 满足实时化的工程需求. 该系统嵌入式、低功耗的设计理念, 可广泛应用于虚拟现实、医学影像、智能交通等领域.
[1] |
赵凯. 全景可视化辅助泊车系统研究[硕士学位论文]. 合肥: 合肥工业大学, 2011.
|
[2] |
陈泽茂. 基于全景视觉的汽车安全驾驶辅助系统的平台设计与实现[硕士学位论文]. 广州: 华南理工大学, 2014.
|
[3] |
周猛, 乔瑞萍, 王效鹏, 等. 基于DaVinciTM的360°全景泊车影像系统的设计与实现
. 电子应用技术, 2014, 40(10): 20-22, 26. |
[4] |
冯雁军, 周清海, 孙伟昶, 等. FPGA平台的实时全景视频系统设计. 电子产品世界, 2013, 20(2): 72-74. |
[5] |
丁士强. 基于Zynq的实时视频拼接技术研究与实现[硕士学位论文]. 大连: 大连海事大学, 2017.
|
[6] |
卢嘉铭, 朱哲. 基于GPU加速的实时4 K全景视频拼接. 计算机科学, 2017, 44(8): 18-21, 26. DOI:10.11896/j.issn.1002-137X.2017.08.003 |
[7] |
郭一汉, 史美萍, 吴涛, 等. 基于GPU的实时图像拼接. 计算机科学, 2012, 39(7): 257-261. DOI:10.3969/j.issn.1002-137X.2012.07.059 |
[8] |
Nvidia Jetson Agx Xavier. The AI platform for autonomous machines. https://www.nvidia.com/en-us/autonomous-ma-chines/jetson-agx-xavier/. (2018-05-10)[2019-05-13].
|
[9] |
盛明伟, 唐松奇, 万磊, 等. 二维图像拼接技术研究综述. 导航与控制, 2019, 18(1): 27-34, 96. DOI:10.3969/j.issn.1674-5558.2019.01.004 |
[10] |
李根, 费章君, 杨仕友, 等. 基于几何成像模型的鱼眼镜头图像校正算法和技术研究. 机电工程, 2013, 30(10): 1268-1272. |
[11] |
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 |
[12] |
石恬. 车载鱼眼相机自标定研究[硕士学位论文]. 西安: 西安电子科技大学, 2015.
|
[13] |
艾裕丰, 赵敏, 张琪, 等. 基于亚像素边缘的棋盘格的角点检测. 西安理工大学学报, 2019, 35(3): 333-337. |
[14] |
张小红, 刘刚. 基于小波变换与双线性插值图像配比算法研究. 江西理工大学学报, 2011, 32(1): 1-6. |
[15] |
罗永涛, 王艳, 张红民. 结合最佳缝合线和改进渐入渐出法的图像拼接算法. 红外技术, 2018, 40(4): 382-387. |