全景视频实时拼接技术研究与实现
时间:2023-04-12 11:47:54
刘台,胡斌,田进龙,任伟嘉,高超
(武汉中原电子集团有限公司,湖北 武汉 430205)
0 引言
全景视频拼接系统利用多个固定摄像机从不同视角对同一场景进行拍摄,根据图像间的相关性,通过视频图像拼接技术产生比单个图像具有更宽视野的图像。这项技术的应用场景也越来越广泛,不仅应用在军用的无人领域,在汽车辅助驾驶系统中的使用显得亦尤为重要。在机动车数量飞速增长的同时,城市的交通道路系统发展却相对滞后,造成城市交通情况急剧恶化,由此引发的交通事故逐年增加[1]。对于在大城市驾车的车主,引发交通事故的原因有很大一部分是驾驶的车辆存在视觉盲区,驾驶员不能准确判断车与车之间的距离[2]。近几年来,随着视频编码技术以及车载整体设备性能的不断提高,为车辆提供鸟瞰全景视频功能的辅助驾驶系统,已然成为绝大部分车主的心声,同时也成为当前辅助驾驶系统研发的一个热点[3]。
本文通过全志T5 核心板,使用TP2854 视频采集芯片捕捉多路模拟相机的图像数据,再使用基于特征提取的配准算法,利用OpenCV 库对多路全景视频拼接技术进行了研究。
视频流是由多个图像构成的,对于25 帧的视频画面表示1 秒的视频包含了25 张图像,所以图像拼接技术就是视频拼接的基础。和图像拼接技术相比,视频拼接的重点是拼接是准确性和实时性。本文研究了图像拼接技术过程中的一些基本原理和改进方法,主要对图像的特征提取和图像的融合进行了深入研究。视频图像的配准和融合是视频拼接的核心技术,本文使用SURF 特征点提取作为特征提取算法,在提取图像特征点的基础上,利用FLANN 算法对图像进行特征配准,之后在进行图像间透视变换矩阵的计算。
本文的重点与难点在于图像的融合。若图片经过透视变换之后图片重叠区域处理不够好或不对其进行处理,那么图片的重叠区域就会产生阴影或缝隙。本文使用加权平均法对图像重叠区域进行处理,并且对算法进行改进,进一步完善该算法的实用性。
为了解决视频拼接的实时性,提出了固定摄像头位置采集视频的思路,将特征点匹配和单应性矩阵的计算放在启动程序,然后每次采集的图像数据只进行图像的变换和融合,实现了视频的实时拼接。
1 系统硬件组成
系统的硬件主要由三部分组成:全志T5、TP5854 采集芯片、AHD 摄像头。系统运行流程:使用AHD 摄像头采集图像模拟数据,经过TP2854 将图像模拟数据转为数字信号,在T5 通过IIC 获取数据之后进行图像拼接算法,最后将全景图像数据编码、推流给到用户端。系统框图如图1 所示:
图1 系统硬件结构框图
全志T5 系列是一个高性能四核Cortex-A53 处理器,适用于新一代汽车市场。T5 系列符合汽车AEC-Q100 测试要求。该芯片集成四核Cortex-A53 CPU、G31 MP2 GPU、多路视频输出接口(RGB/2*LVDS/HDMI/CVBS OUT)、多路视频输入接口(MIPI CSI/BT656/BT1120)。其中GPU 支持OpenGL ES 1.0/2.0/3.2、Vulkan 1.1 和OpenCL 2.0,在处理视频数据时可以使用GPU 来加速算法的执行时间。
同时,T5 芯片支 持4K@60fps H.265 解码和4K@25fps H.264 解码,DI、3D 降噪,自动调色系统和梯形校正模块可以提供流畅的用户体验和专业的视觉效果。
2 视频拼接原理分析
系统软件的基本流程是通过多组AHD 高清摄像头采集到视频之后,对其进行拼接,编码和RTSP推流发送给用户端。
视频处理软件主要由上层软件、中间层软件和底层软件组成,其分层体系结构如图2 所示。视频采集模块使用V4L2 视频驱动框架进行采集,视频拼接模块使用openCV 库对多组视频进行拼接,视频编码模块使用全志CedarX 库编码,视频推流模块使用RTSP 协议进行推流。如图2 视频处理软件架构:
图2 视频处理软件架构
2.1 V4L2视频驱动模块
V4L2(Video for Linux 2)是Linux 标准的视频采集驱动框架,位于Linux 内核态,它由硬件独立V4L2 驱动核心和硬件相关的Camera 驱动、Sensor 驱动等组成。其中,V4L2 驱动核心负责具体的摄像头驱动的注册管理,它为Linux 用户态应用提供了统一的设备文件系统接口,用于摄像头数据的读取和摄像头参数的控制;Camera 驱动是和具体硬件平台相关的摄像头驱动,用于视频帧处理;Sensor 驱动是和摄像头相关的传感器驱动,完成摄像头参数的控制,对视频处理模块而言,Sensor 驱动就是NVP6324 的驱动。
视频采集模块基于V4L2 视频驱动,采集流程如图3 所示:
图3 视频采集流程
基本步骤如下:
(1)打开视频设备文件;
(2)查询视频设备的能力,比如是否具有视频输入,或者音频输入输出等。
(3)设置视频采集的参数。
设置视频的制式,制式包括PAL/NTSC。
设置视频图像的采集窗口的大小。
a)设置视频帧格式,包括帧的点阵格式、宽度和高度等;
b)设置视频的帧率;
c)设置视频的旋转方式。
(4)向驱动申请视频流数据的帧缓冲区
请求/ 申请若干个帧缓冲区,一般为不少于3 个。查询帧缓冲区在内核空间中的长度和偏移量。
(5)应用程序通过内存映射,将帧缓冲区的地址映射到用户空间,这样就可以直接操作采集到的帧,而不必去复制。
(6)将申请到的帧缓冲全部放入视频采集输出队列,以便存放采集的数据。
(7)开始视频流数据的采集。
(8)驱动将采集到的一帧视频数据存入输入队列第一个帧缓冲区,存完后将该帧缓冲区移至视频采集输出队列。
(9)应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区,应用程序处理该帧缓冲区的原始视频数据。
(10)处理完后,应用程序的将该帧缓冲区重新排入输入队列,这样便可以循环采集数据。
重复上述步骤8 到10,直到停止采集数据。
(11)停止视频的采集。
(12)释放申请的视频帧缓冲区,关闭视频设备文件。
2.2 实时视频拼接的流程
视频拼接是在图像拼接的基础上发展而来的,所以图像拼接是视频拼接的核心步骤,图像拼接的结果直接影响到视频拼接的结果。图像拼接经过近些年来的发展有很多方法,但是大体步骤可以分为:图像的预处理、图像配准、和图像融合。其中图像的配准和图像的融合则是图像拼接的研究的难点问题。图像拼接的具体步骤如图4 所示:
图4 图像拼接的流程
视频拼接的原理是首先将视频信息进行帧提取,然后把提取的帧
提醒您:因为《全景视频实时拼接技术研究与实现》一文较长还有下一页,点击下面数字可以进行阅读!
《全景视频实时拼接技术研究与实现》在线阅读地址:全景视频实时拼接技术研究与实现