视频分析技术详解

视频分析是计算机视觉领域的一个重要分支,它涉及到多种算法和技术,对于初学者来说,理解其工作原理并非易事。尽管有许多关于机器视觉如何使用和应用的出版物和示例,但关于其工作原理的资料却相对匮乏。本文旨在详细解析视频分析的一般流程,帮助读者更好地理解这一过程,尤其是在刚开始学习计算机视觉时。

视频流的理解

要理解视频分析,首先需要了解视频流的概念。视频数据有多种格式,但其本质相同:一系列以一定速率每秒显示的帧。每一帧都有分辨率和格式(每像素的位数及其解释:哪些位负责不同的颜色)。虽然帧可以使用压缩来减少传输数据量,但在屏幕上显示时总是解压到原始状态。分析算法总是处理未压缩的帧。

视频流的特征包括帧速率、分辨率和位格式。值得注意的是,计算机视觉算法总是只分析当前帧。这意味着帧是顺序处理的。此外,了解自上一帧以来经过的时间也很重要。这个值可以从频率计算得出,但更实用的方法是在每个帧上附加时间戳。

帧格式和大小的变换

视频分析的第一步是准备帧。通常,在这一步中,帧的大小会显著减小。原因是图像的每个像素都会参与后续处理。相应地,帧的大小越小,处理速度就越快。当然,在减小大小时会丢失一些信息,但这并不关键,甚至有益。分析主要处理的对象通常足够大,不会在帧压缩过程中丢失。但与相机质量、照明、自然因素等有关的一些“噪声”类型会减少。

改变分辨率是通过将原始图像的多个像素合并为一个来实现的。信息丢失量取决于像素合并类型。例如,原始图像的3x3像素块可以转换为单个像素。可以对所有9个像素求和,可以对4个角像素求和,也可以只取一个中心像素。

求和4个角像素:

Sum of 4 corner pixels:

求和所有9个像素:

Sum off all 9 pixels:

仅取一个中心像素:

Only one central pixel:

结果总是略有不同,取决于速度和质量。但有时,丢失更多信息的方式比使用所有像素的方式能提供更平滑的图像。

在这个阶段的另一个操作是改变帧格式。通常不使用彩色图像,因为它也会增加处理时间。例如,RGB24每像素包含3个字节。但Y8只包含一个,并且不会丢失太多信息:

Y8 = (R + G + B) / 3.

结果将是相同的图像,但以灰度显示:

这是处理中最重要的阶段。这一步的目的是创建场景背景,并获取背景与新帧之间的差异。处理结果在很大程度上取决于这个阶段算法的质量。纠正将对象误认为是背景或背景的一部分的情况,将在后续阶段变得非常困难。

在最简单的情况下,可以取一个空场景的帧作为背景:

例如,取一个有对象的帧:

如果将这些帧转换为Y8并从有对象的帧中减去背景帧,得到以下结果:

为了方便,可以进行二值化:将所有像素值大于0的像素替换为255。结果,从灰度图像转换为黑白图像:

看起来一切都很好:与背景分离的对象有清晰的边界。但是,首先,阴影被突出显示为对象的一部分。其次,可以在帧的顶部找到图像噪声的伪影。

这种方法在实际使用中并不好。任何阴影、眩光、改变相机亮度都会破坏整个结果。问题的复杂性就在于此。对象应该与背景分离,因此需要忽略自然因素和图像噪声:光反射、建筑物和云层的阴影、植物枝条的摇摆、帧压缩伪影等。此外,如果正在寻找的左对象,它不应该成为背景的一部分。

有许多算法可以解决这些问题,效率各不相同。从简单的背景平均到使用概率模型和机器学习。许多算法都包含在OpenCV中。并且可以组合几种算法以获得更好的结果。但是,算法越复杂,处理下一帧的过程就越长。如果实时视频有12.5帧每秒,那么系统只有80毫秒的处理时间。因此,选择最佳解决方案将取决于目标和分配给其实施的资源。

区域创建

形成了差异帧。在黑色背景上看到白色对象:

现在需要将对象从区域中分离出来,将对象的像素组合起来:

例如,这可以通过

connected component labeling

来完成。在这一点上,可以看到背景模型的所有问题。顶部的人被分成了几个部分,有很多伪影,人的阴影。然而,这些问题中的一些可以在这个阶段得到纠正。关于对象区域、其宽度和高度、像素密度的知识,使得过滤掉不必要的对象成为可能。

蓝色矩形表示参与进一步处理的对象,绿色表示过滤掉的对象。这里也可能出现错误。正如看到的,顶部被分成几个部分的人已经被过滤掉了,因为他们的大小。这个问题可以通过使用透视来解决。

其他错误也是可能的。例如,一些对象可能被合并为一个。因此,在这个阶段有很大的实验空间。

区域跟踪

最后,在最后一个阶段,区域变成了对象。这里使用了过去几帧的处理结果。主要任务是确定两个连续帧上的区域是否是同一个对象。标志可能不同:大小、像素密度、颜色特征、运动方向预测等。时间戳在这个阶段非常重要。它们允许计算对象的速度和行驶距离。

在这个阶段,可以纠正前几阶段的问题。例如,通过使用它们运动的历史,可以将连接的对象分开。另一方面,也可能有问题。其中最重要的问题是两个对象的交叉。这个问题的一个特殊情况是,一个较大的对象长时间遮挡一个较小的对象。

分析算法的架构可以包括回引用,以改进前几阶段的工作。首先想到的是——使用场景中对象的信息来形成背景。例如,可以找到丢失的对象,并且不让它成为背景的一部分。或者与“幽灵”作斗争:如果用舞台上的人创建背景,那么当他离开时,那里会有一个“幽灵”对象。理解这个地方开始的对象轨迹可以帮助迅速从背景中移除“幽灵”。

结果

所有阶段的结果是一个场景中对象的列表。每个对象都以大小、密度、速度、轨迹、方向等参数为特征。这个列表用于场景分析。可以确定对象的线交叉或错误方向的运动。或者可以计算给定区域内的对象数量,空闲交错,跌倒等许多其他事件。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485