远程巡视系统三维视频融合技术方案(3年前笔记,归档)
远程巡视系统三维视频融合技术方案
摘要:在三维场景中模拟海量摄像机,确定每个测点位置及姿态,将离散的具有不同视角的传统监控视频与监控场景的三维模型进行视频融合,形成场景内不同视频画面之间的空间关联,形成一张“无限量”分辨率的大视频,实现“一张图”看全局。支持在单一画面中对整体区域的全局立体监控、分画面细节监控,无需切换分镜头,即可实现对换流变区域全景、实时、多角度监控。支持关键路径、重点区域目标快速锁定。实现数字化、智能化、可视化的视频融合监控与预警管理,提高处置突发事件的能力,为宏观实时指挥、高效日常管理和突发事件快速处置提供直观、全面的辅助。
关键字:视频融合、数字孪生、纹理映射、空间计算
第一部分:需求分析
传统的视频监控是在场景中不同位置安装多个监控相机,后台会通过一个大屏查看每个监控相机发来的实时视频画面。由于这些监控相机是离散地分布在场景中,每个相机的监控视频都是场景中的某个固定视角的画面,它们之间割裂开来,用户只能切换不同相机来查看对应的视频或者在大屏中以网格状展示多个不同相机拍摄的不动视角画面。由于用户查看的是零碎的监控片段,虽然监控视频在时间上是连续的,但在空间是分裂的,不能让用户快速把控整个场景的宏观状况,用户需要不打断地扫视多个视频画面,以便在大脑中拼接整个监控场景的状态。
因此,基于上述分析,我们需要在空间上形成一个完整且连续的可观察实体,让它与视频深度结合,通过加入虚实联动让用户能对场景的监控状态一目了然,快速定位问题。这个实体便是对真实被监控的场景进行虚拟建模的三维模型。我们要做的便是把监控视频映射到三维模型中去,现实场景中的布置的海量相机都在三维模型中有对应位置标记,每个相机的视频都根据相机的姿态参数贴合到三维模型中相应的位置,这样整个三维模型是动态的。随着视频流的连续推送,三维模型各处虚拟场景与现实场景达到了一一对应的联系,这也叫视频增强虚拟现实。整个动态的三维模型就是对多个监控相机的不同位置不同视角视频的融合,用户察看的就是整个场景的三维模型,这个动态的三维模型就是一个无限量的全景三维视频,只要通过键鼠的简单操作就可以方便地查看场景各个位置的监控实况或以上帝视角查看整个场景的全局状态。
第二部:视频融合总体设计
视频融合整体采用B/S架构设计,基于浏览器的业务系统具有良好的跨端部署与交互易操作性,三维视频融合作为一个前端单页面应用展示给用户。整个架构图大致如下:

图2-1
完善的Web3D技术使得视频融合计算在Web端也很方便。借助WebRTC拉取实时视频流数据并绘制到HTML Video容器中,然后通过Web三维框架CesiumJS结合监控相机参数计算视频在三维场景中的投影平面并创建该平面模型,将Video标签承载的实时视频流数据导入平面模型的材质属性中,这样便完成了视频在三维场景中的投射过程。
视频投射过程部分是自动计算的,属于视频融合技术的一部分,由于模型存在误差不一定能得到较好的效果,因此还需手动调参实现更好的视频融合效果。用CesiumJS构建一个可编辑的视锥体系统,这个系统对应于实际的监控相机,在位置、视场角、旋转、朝向、宽高比、投影距离等参数与监控相机一一对应。通过手动调节这些参数实时控制视锥体的形态,便于实时观察视频投射平面与场景的融合效果,从而最终达到满意的视频融合效果。
活动图如下:

图 2-2
第三部分:视频融合详细设计
首先三维模型数据的来源和监控视频数据采集不是本文档关注点。重点关注视频流数据处理、视频融合空间计算。
一、视频流数据处理
视频数据由后端推送RTSP流,前端用WebRTC接收并创建HTML Video结点截取实时视频流数据。HTML Video并不作为渲染容器,只是充当媒介,可以作为隐藏结点置于后台或直接以离屏渲染形式驻于内存中。截取的视频流数据绘制到canvas上并导出为图片作为三维模型的材质。示例代码如下:

图 3-1
实际开发中WebGL可以借助插件直接解析Video Dom结点实时读取视频帧作为材质渲染,并不需要上面代码那样处理,上图代码仅作为原理参考。
二、视频融合空间计算
视频融合算法主要内容是根据相机姿态参数把纹理贴图的二维笛卡尔坐标映射到对应的三维模型上的空间坐标上。计算返回的是百分比为单位的坐标数值,三维引擎根据计算的坐标数据把视频帧图片作为纹理映射到相应的模型表面,这个过程随着数据的推送是不断重复执行的。
相机的姿态参数一般包括相机的绝对地理位置信息或相对位置信息Position、相机的上向量(Up Vector, 表示相机的上方向)、相机的方向向量(Direction Vector)、相机的水平视场角FovX和垂直视场角FovY,这些参数是进行空间计算所必须的,当然一般实际不直接提供这些相机参数,像上方向参数可能提供的是相机参考某个位置和轴旋转的角度信息。相机的姿态信息帮助构建相机观察空间或观察矩阵(ViewMatrix),相机观察空间形成一个视锥体Frustum,这个视锥体内部空间是我们在视频画面上能看到的实际物理空间范围,不在这个范围内的场景都被裁剪了。

相机呈现的视频画面是贴在投影平面上的,还要根据一个投影距离来计算,视锥体是一个平截头四棱锥,投影平面位于这个棱锥内部,目标就是计算这个投影平面。

图3-2
上图中位于视锥体线框中的灰白色矩形就是投影平面,视频画面回等比例投射到上面。
下面给出大致的计算过程:
首先定义投影平面的参数方程:
由海森标准型定义的平面为 ax + by + cz + d = 0,其中 (a, b, c) 是平面的法线向量,d 是到平面的有符号距离,而 (x, y, z) 是平面上的任意一点。我们简单表示如下:
Plane = (Normal, D),Normal是平面的法向量,D是平面的符号距离。
相机的方向向量就是垂直于投影平面的,投影平面的正面正对相机,对相机方向向量取反得到投影平面的法向量:
Normal = DirectionVector x (-IdentityMatrix)
符号距离设为0,不重要。
D = 0
上述公式定义的是广义上的平面,在空间上无限延展的、没有边界。投影平面有固定的宽高。接下来根据相机的FOV、投影距离ProjD参数计算投影平面的宽高:
这里把水平FovX和垂直FovY统一为Fov,因为AspectRatio会影响FovX或FovY,具体还要根据实际的相机参数设定来,实际情况可能完全不同。
根据默认的FOV计算的投影平面是正方形,宽高相等:
Width = Height = ProjD * Math.tan(Fov /2 / 180 * Math.PI) * 2
如果AspectRatio = 1 则不用调整宽高,宽高1:1.
否则根据 AspectRatio对宽或高进行拉伸或压缩。
目前为止是基于相机视角进行计算的,即以相机位置为原点定义的参考系。要把投影平面绘制到三维场景中还得把基于相机的局部坐标系转换为世界坐标系,而在Cesium三维框架中相机的局部坐标系是从世界坐标系转换过来的,即选取世界坐标系中的一个位置坐标作为参考点建立了相机的局部坐标系。因此,我们只要求出局部坐标系的变换矩阵的逆矩阵再乘以投影平面法向量就能得到其在世界坐标系中的法向量。如下:
定义相机视角的观察矩阵为ViewMatrix =GeoSpatialReference.Local(position)
投影平面在世界坐标系中的法向量Normal = Inverse(ViewMatrix)x Normal。
到此为止,投影平面的计算完成。
最后一步就是把截获实时视频流并作为材质贴到投影平面上,完成视频融合工作。

图 3-3
上图是测试效果,由于模型比较粗糙,效果一般。三维视频融合需要高精度模型。
总结:
当前展现的视频融合属于基于相机视角的视频投射技术,本人也没做过视频融合相关项目,这些技术细节纯凭个人通过互联网了解各家三维服务公司的案例展示效果的逆向推理和个人对三维应用开发技术的积累及图形学的了解琢磨出来的,只有结合具体的业务场景才能发挥其价值。
浙公网安备 33010602011771号