在调试时,监控摄像头的位置可以灵活地小幅度调整。在调试完毕后的实时视频显示期间,监控摄像头之间的相对位置以及旋转角度都不能再做更改。如果改动了监控摄像头的位置,需要再运行初始化程序,对相邻监控摄像头之间新的位置关系进行自动估计并更新投影矩阵。
为了视频帧拼接的需要,监控摄像头采集的普通窄视角场景之间必须有部分重叠区域,用来提取特征点并进行特征点匹配,从而求取投影矩阵并进行配准。因此,监控摄像头的放置位置必须保证部分的重叠区域。重叠区域的大小取决于算法的健壮性及所拍摄的场景内容。重叠区域太小,无法保证提取到足够的匹配特征点,从而不能得到正确的转换矩阵;重叠区域太大,降低了拼接效率,并增加了重叠区域产生鬼影或模糊的可能性。
在本系统中,经过反复实验测试,对于绝大多数的场景,30%~50%的重叠区域是适合的。当支架的位置和摄像头的方向都调整完毕后,系统开始运行。监控摄像头将所采集的第一帧传输给初始化模块。在初始化阶段,我们计算监控摄像头间的相对位置以及各相邻输入视频帧的相对位置关系,确定用于帧间配准的各参数,即投影矩阵的各参数。
由于这部分只在监控摄像头改变相对位置和方向后运行一次,没有实时性约束,因此我们采用了SIFT等较为复杂、计算量较大的算法,以求取得最佳的投影参数。而在计算出投影矩阵后,我们对于所有后续视频帧运行实时模块。实时阶段采用了尽可能简化的处理步骤,只对来自不同监控摄像头的所有视频帧进行简单的投影及融合,并裁剪出有效的全景视频帧作为输出。
我们的系统为每个单独的监控摄像头分别开辟一块缓存区存储采集的视频流。由于我们使用了多个网络监控摄像头,并且监控摄像头之间物理性质存在差异,我们必须对多路独立的视频流输入进行同步。由于监控摄像头数目有限,我们可以采用简单的策略来同步视频流。此时不同视频流之间的延迟不大,因此我们基本可认为不同监控摄像头相邻时间的视频帧是同步的。具体而言,我们的同步做法是当所有视频缓存区都有新的视频帧达到时,算法才开始拼接新的视频帧,其他时间则是等待所有新视频帧的到达。
微信扫描二维码,关注公众号。