混合第三方库视频系统接口设计与实现
扫描二维码
随时随地手机看文章
0 引 言
现有物联网监控系统的功能正在日益多元化。例如后台服务器算法与深度学习相结合,使得监控的智能水平取得了长足进步 [1] ;主从 -PTZ 摄像头的引入形成了多个摄像头组,能够完成之前单个摄像头无法完成的工作 [2] ;具有深度信息的摄像头能够从三维立体的角度重新进行监控 [3]。同 时,与视频监控系统有关的其他技术也在迅猛的发展之中,例如基于 FPGA,DSP 芯片,每个摄像头能够完成若干前端处理,从而降低对通信带宽的要求 [4] ;基于 USB 2.0 数据传输技术,可使视频数据传输的速度成倍提高 ;基于云存储技术使得视频数据的存储、访问与相关运算能够并行、远程处理,同时实现了海量视频数据以及相关若干技术 ;基于 GPU芯片性能的提升,视频、图像的处理速度较之前有了很大提高 [5-6]。
对现有监控系统而言,新的功能、应用领域正在形成,而这些新应用解决方案的实现既需要新的硬件,又需要新的软件 ;既可以选择自行开发,也可以直接集成第三方软硬件包。自行开发与集成第三方软件包相比,各有优劣。
以计算机视觉应用中的第三方软件包为例,现有第三方算法库较多,能够支持的应用也较多,如目标识别、行为检测、深度学习、深度信息等。如果均采用自行研发的方式进行实现,应用程序的稳定性与处理速度将完全取决于开发者自身的能力与水平 ;如果开发者水平高,不仅能够在功能的选择上拥有绝对的自主权,还可以通过优化与功能裁剪实现更高的系统稳定性与运行速度 ;但如果研发者水平受限,则程序的表现将无法预测。
系统集成直接使用第三方软件包,其程序代码的编写水平完全取决于第三方软件包,在搭设系统的同时,其应用服务的质量是同质化的,难分伯仲 ;对用户的服务支持则完全取决于第三方软件包,无过多自主权。
至于涉及的第三方硬件的软件开发包无需多言,绝大多数研发者都无力进行新硬件的设计、制造与相应软件开发,均以使用第三方硬件为主。
1 深度相机
以深度算法的应用作为案例进行现有视频系统接口的案例解析。
在原有视频监控系统中添加深度信息,需要进行相关功能的研发,首先需要硬件的支持,而新的硬件往往自带第三方开发包,可供开发者二次开发。
深度相机(又名 3D 相机)是指可通过距离信息获取物体之间的位置关系,能够区分前景与后景 ;使用相机获取的深度信息对目标图像的分割、标记、识别、跟踪等传统应用仍然有效,而且可以根据深度信息进行改进与提高 ;借助深度信息与 2D 相机无法获取数据与信息,但进行算法的设计与改进后便能够快速完成对目标的识别与追踪,进行复杂目标的状态行为判读 [7-8]。
目前深度相机包括 TOF(Time of Fligh,TOF)、结构光、激光扫描等,主要用于机器人、互动游戏等。其中较多指 TOF 相机 [9-10],微软第二代 Kinect v2 采用的就是 TOF 技 术,在 30 fps 条件下能够实现 1 920×1 080 的颜色分辨率、512×424 的深度分辨率,最多支持 6 人的姿态识别,每人25 个关节点,检测范围最远可达 4 m,水平有效角度最大为70°,垂直有效角度最大为 60°。
以激光散斑图像深度信息获取方法为例,深度相机实现这些功能的工作原理 :经过图像预处理后的输入散斑图和参考散斑图写入多条行形成输入散斑窗、参考散斑窗,在输入散斑窗中提取中心相同、窗口大小不同的图像块,对应参考散斑窗的匹配散斑窗,以搜索策略并且求最小 SAD 方法,搜索最佳匹配块,得到最佳偏移量,再通过参考阈值进行筛选,自适应选择某一图像块对应的最佳偏移量作为当前图像块中心点的最佳偏移量,然后通过深度计算公式得到其深度信息 [11-12]。
由上可见,该方法涉及的数学公式较多,运算量较大,同时,类似 30 fps 条件的视频参数对相关计算的实时性提出了较高要求。现在一般的解决方案为依靠 FPGA,DSP 进行相关运算,这就涉及到了与硬件相关的第三方开发包。以第三方 OpenCV 软件包与硬件相关的 HLS 算法库进行接口设计层次化、模块化说明。
2 接口的层次化、模块化设计
现有视频监控系统在进行接口层次化、模块化设计时可以参考 HLS 算法库与 OpenCV 软件包进行集成的案例。在该案例应用中,支持深度相机的系统被设计用来实现深度相关算法。
Vivado 高层次综合(Vivado High-Level Synthesis,HLS)在所有 HLx 版本中可直接使用 C,C++ 以及 System C 语言规范对 Xilinx 可编程器件进行编程,HLS 使系统和设计架构师支持 ISE® 和 Vivado 设计环境,无需手动创建 RTL 便能够快速创建 IP,包含 HLS 流库,HLS Math,HLS 视频,HLS IP,HLS 线性代数,HLS DSP 库等内容。HLS 在该案例中的主要功能是利用硬件加速相应的 OpenCV 应用。
OpenCV(Open Source Computer Vision Library,OpenCV)是一个基于 BSD 许可(开源)发行的跨平台计算机视觉库,可运行在 Linux,Windows,Android 和 Mac OS 操作系统上。OpenCV 轻量级且高效—由一系列 C 函数和少量 C++ 类构成, 同时提供 Python,Ruby,Matlab等语言接口,实现了图像处理和计算机视觉方面的诸多通用算法。OpenCV 在该案例中的主要功能是进行深度信息相关算法设计与应用。系统层结构与模块接口示意如图 1所示。
由图 1 可知,不同第三方库进行集成时,彼此之间的业务流按照数据类型的不同需要选择不同的接口 —在OpenCV 与 HLS 之间进行图像处理时需要 Axivideo2Mat 与Mat2Axivideo 接口。而在 OpenCV 与 HLS 之间进行视频处理时,仅需 Mat2Axivideo 接口。其接口类型根据数据类型的不同而变化。OpenCV 与 HLS 部分接口函数示意如图 2所示。
从图 2 中可以看出,在视频与图像分析的应用中,为能够充分利用深度相机的深度信息,需要 OpenCV 与 HLS 各自按照数据类型的不同采用不同的接口函数进行处理,并根据需要进行不同数据类型之间的转换,例如从 Mat 到video, 从 Mat 到 hlsMat, 或者从 video 到 Mat, 从 hlsMat到 Mat。
由此可见,接口就是进行的一系列数据类型转换,转换的最终目的是为不同算法提供符合其输入要求的数据。
3 数据接口的标准化
接口(Interface)是一系列操作的集合,在软件架构中,强调模块之间的数据交换操作。为拓展模块应用范围、进行二次开发、与其他系统集成,尤其要适应未来的技术趋势,就需要进行数据接口的标准化 [8]。
数据接口的标准化首先需要明确数据的类型。在视频监控系统中,有效数据类型主要包括图像、视频以及其他数据、状态数据四大类。作为数据接口的标准化内容之一,首先需要统一的内容较多,如图像大小、图像类型、视频帧数、色彩模型、数据格式、数据长度、数据实时性等,数据类型与业务流程相同,是进行划分的两大要素。
对不同型号、不同设备、不同参数的视频,需根据效果以及实验进行对比,降高升低。高参数设备采集的视频信息需进行预处理,以达到同一标准 ;同样,对达不到参数要求的设备,可结合金字塔法等进行预处理,使之达到同一标准。标准统一后,对数据的通信速度、数据的后期处理速度、处理精确度、存储速度、读取速度等多项指标都有明显改进。
统一视频处理输出后的数据格式是标准化的重点。视频监控系统采集视频信息,然后交由后台服务器进行视频信息的处理,其处理结果(系统输出)是应用层其他系统需要的输入,因此需进一步规范视频监控系统处理后的数据格式。
对视频监控系统处理后的数据,可采用视频、图像、与文本 /XML 等结合的方式。其中,对视频而言,需要规范每秒多少帧、每一帧的宽高、色彩模型、ROI 位置及长宽等 ;对图像而言,需要规范宽高、色彩模型、ROI 位置及长宽等,这里的参数应该与视频参数完全吻合,只是视频的参数多于图像参数而已 ;对于文本 /XML 而言,需要对视频、图像进行编号,对应编号保留所有视频、图像处理后的相关信息。
为最大限度保持算法设计上的灵活性,可对同一视频 /图像利用算法库进行多种不同数据格式的转换,通过不同的算法得到不同的输出 ;与不同参数需求的新设备进行数据通信 ;集成不同的第三方库,从而较好地解决系统的二次开发问题。图 3 所示为一种混合第三方库支持的车牌定位算法及其得到的车牌定位效果。对于成功定位的车牌,使用了文献 [13] 中提到的车牌字符分割算法并将字符以二值化方式显示。
第三方视频处理库为 OpenCV2.4.9,在 Windows 7 操作系统上借助 Qt5.0 实现,其中部分功能函数使用了 GPU 加速实现。主要硬件环境为 ThinkPad x230 笔记本电脑,Core i3(2.4 GHz)四核 CPU,8G 内存。实验数据集包含 800 幅含车牌的图像以及 400 幅不含车牌的图像。
实验测试对象中包含了大部分复杂环境,如颜色干扰(“湘 BY2054”和“粤 JPG999”的车身均为蓝色),倾斜的车牌(“粤 CFL980”“辽 ANB082”“粤 B0PA09”),复杂的背景和光照条件(“辽 M66B66”和“浙 BY1V13”)等。从结果可以看出 :混合第三方库支持的车牌定位算法在复杂条件下均能够准确定位车牌,并能够从车牌上准确读取车牌字符 [13]。
4 结 语
不同第三方库进行集成时,彼此之间的业务流需按照数据类型的不同来选择接口。在软件架构中,强调模块之间的数据交换操作。为拓展模块应用范围、进行二次开发、与其他系统集成,就需要进行数据接口的标准化。数据接口的标准化首先需要明确数据类型,然后尽量统一模块之间处理输出的数据格式。
在系统设计与实现中采用论文中提到的解决方案,在一定程度上解决了原有系统架构适应性差、调整困难的缺陷,能够借助分层次与模块化手段来提高系统稳定性,并借助第三方库提高系统核心运算的速度,易于二次开发。在工程应用中,该方法可作为一种快速软件原型开发的辅助手段,具有较为广泛的应用场景。