基于MVF和改进八叉树的屏幕图像采集方案

2013-08-13 05:07勇,郭
电视技术 2013年19期
关键词:八叉树内存颜色

张 勇,郭 琳

(1.西南石油大学,四川 成都 610000;2.四川职业技术学院,四川 遂宁 629000)

在远程视频监控中,视频快速捕捉与传输技术是决定其性能关键点之一[1],而随着计算机功能的不断强大,多媒体技术特别是数字图像技术的不断发展,为只依靠软件技术快速抓取计算机屏幕的监控画面,并将其转化成可供传输与预览的视频流资源提供了可能。

目前在远程实时视频监控软件系统中,获取屏幕图像的方法主要有两种:创建屏幕设备描述表(Device Context,DC)方法[2]以及 DirectX 中的 DirectShow 方法[3],两种方法各自具有优缺点。屏幕DC方法技术实现比较直接,对应用环境没有特殊要求,但是截图速率低,越来越难以满足实时性视频监控的需求。DirectShow方法截图速率高,但是需要DirectX库支持,在实现上相对于直接Windows设备上下文编程显得繁杂,为程序开发和应用带来不便。在远程视频监控系统的工程实践中,为降低传输负载,在发送图像文件时,后端硬件会进行取高位处理,例如实现24位色到16位色转换时,分别对R,G,B取高位,由 R8∶G8∶B8 转变成 R5∶G6∶B5,其优点是实现简单,能保证系统传输的实时性需求,缺点是处理后的图像会出现颜线、图像轮廓模糊等问题,从而图像效果出现严重失真。

笔者的研究主要是在屏幕DC截图的基础上,利用内存映射文件技术MVF(Map View of File),将图像文件映射到虚拟内存的一块地址空间,在访问文件时像访问内存文件一样,避免了不必要的I/O操作,加快采集速度,较好地解决了屏幕DC截图速度慢的缺点。又根据降低网络传输负载的需求,对所采集到的图像在统一量化算法初步处理的基础上建立简化的八叉树,对像素点进行裁剪,既降低图像传输数据量,又保证图像成像效果,有效提升远程实时视频监控软件系统的工作性能。

1 基于内存映射文件法的屏幕DC截图法具体设计

1.1 内存映射文件技术简要介绍

WIN32 API提供了实施文件操作的便捷渠道,也就是内存映射文件。在这里,其准许能够在WIN32进程的虚拟空间里面留有一定的空间,同时能够把物理存储器里面的目标文件向这一个空间进行提交,从而能够与该虚拟空间进行映射。这样就能够通过存取内存数据的手段对文件里面的数据进行直接操作,就像将它们置于内存里面,在很大程度上使得访问文件得以简化,同时能够使若干进程共享数据得以实现。因此,引入内存映射文件能够在很大程度上使程序效率得以提升[4]。

1.2 优化后屏幕DC读写屏工作流程设计

对于远程视频监控软件系统来说,其主要是在计算机上运行的,是利用软件手段把那些监控图像在播放的过程中进行截取。由于所截取的为整个视频信息,因此在这里要求抓取速率一定要保持在24帧/s(f/s)以上,这是由于人可以接受的连续画面速度一般是24 f/s以上,要是比该速度小,人眼会观察到一定的阻滞现象,这也是笔者优化读写屏速率的其中一个关键需求。另一方面,考虑到系统实时处理模式下网络负载水平,在对图像进行抓取的过程中,可以按照视频的刷新率的具体情况,科学合理地对截图速率进行设置,从而能够有效控制一定时间内图像抓取的数据量。该操作流程示意图如图1所示。

图1 优化后的屏幕DC读写屏工作流程原理图

将CreateDIBSection()引入传统的屏幕DC截图法里面,利用该函数能够构建起存储DIB位的内存,能够进行GDI操作。在很大程度上降低了成本,缩短了读屏消耗时间。对于CreateFileMapping()来说,其主要是负责在文件映射内核对象构建过程中进行使用,所以在具体使用过程中一般将文件创建成内存映射对象。

对于MapViewofFile()来说,其主要是负责将文件里面的数据信息向进程的地址空间里面进行映射,而对于UnmapViewOfFile()来说,其主要是负责将文件内存映射解除,然后系统把内存里面的数据向磁盘进行回写。完成上述的操作之后,接着利用CloseHandle()将映射文件关闭,从而将所使用到的内存得到释放[5]。

2 基于八叉树颜色量化改进算法设计与实现

在监控网络通信能力一定的基础上,各像素点的颜色数据量愈小,网络负载压力就愈低,从而能够在很大程度上改善系统的有效性,例如,在颜色量化重建过程中,为使图像最大限度的和原始图像相接近,笔者在这里主要是通过八叉树算法进行[6],接下来将对基于八叉树颜色量化改进算法设计和实现进行阐明。

2.1 构建八叉树

在上面阐述的采集屏幕图像过程中,主要得到的是RGB信号,然而要是在基于LUV的色彩空间上进行量化,就可以获得非常不错的视觉体验。但鉴于要在LUV空间里面实施转换,必须要以非线性运算方式实现,这个过程中需要相对较多的系统资源,因此,为充分保证算法具有较高的效率,可以通过RGB颜色空间实现颜色量化。

八叉树构建过程中,笔者通过升级的八叉树的存储结构进行[7],具体见图2,各节点的数据结构里面。

图2 简易八叉树数据结构(截图)

主要涉及到两个指针,它们分别指向父节点与8个子节点向量,同时涉及到这一个节点对应的颜色、出现的次数等几个方面的内容。并且具备3个成员函数,它们依次是在判断这一个节点是不是叶子节点的过程中进行使用;判断这一个节点是不是倒数第二层的节点过程中进行使用;将子节点的R,G,B的颜色值及其颜色出现次数向父节点进行累加的过程中使用。该结构能够在很大程度上使空间与操作效率相互间的关系得到平衡,可以在内存空间相对较小、实时性要求相对偏高的视频监控系统里使用。

在RGB颜色空间对八叉树进行构建,该环节主要涉及到以下几方面:

1)利用统一量化法进行操作,也就是把R8∶G8∶B8直接取高位,使其成为12位的R4∶G4∶B4,所得到的12位颜色信息当作八叉树中节点的坐标值,在这里RGB数据从大到小依次与八叉树里面的浅层以及深层级节点相对应,这样多次操作,就能够充分保证获得的4层八叉树。

2)将八叉树节点的坐标信息确定下来之后,接着自根节点开始沿着纵向对八叉树进行遍历。要是遍历的坐标里面没有八叉树的节点,在这种情况下,就能够将这一个八叉树节点生成,否则接着将低于RGB 1位的组合当作节点坐标,直至访问到八叉树的叶节点为止。需要对八叉树里面具有的颜色数进行统计,并且还需要将这一个节点的颜色出现次数、RGB值向节点数据结构的字段里面进行累加。

图像里面各像素都进行上面的两个流程,一直到其里面的各像素都和八叉树里面的叶节点相互对应为止,这样就构建起八叉树(见图3)。

图3 构建的4层八叉树简易结构图

2.2 八叉树的裁剪与图像质量恢复

在裁减过程中,主要是通过下面的两个条件取舍深度一样的节点,也就是最少或最多像素的节点。对于前者来说,其能够最大限度地降低图像的误差,然而在对图像细节方面的支持不足;对于后者来说,其能够在相对较大的光滑范围里面形成带状效应,然而能够有效地保持图像里面的细节,从而实现反走样的效果[8]。在远程监控过程中,图像的层次感与轮廓在很大程度上决定着图像的视觉效果,应该最大限度地降低图像的误差,所以,在对深度一样的节点进行裁减的过程中,笔者主要是通过将最小像素的节点删去,以误差扩散的方式保证图像细节。

八叉树裁减主要是以其颜色数是不是比256色高当作裁减结束的标准。当比256色高的时候,就从最小像素点的节点位置进行裁减,直至颜色数在249~256区域内为止,这样才可以与调色表的设计要求相符合。

裁减的时候应该首先看第三层的节点数是不是比256高,要是比256高,就应该将4层的全部叶节点向其父节点里面进行合并,同时还应该适当的裁减。接着开展从下到上的裁减操作。在这里主要是将颜色次数出现最小的最底层父节点的子节点删除[9],一直至满足上述条件为止。具体通过下面的操作流程进行:

1)第一步,从根节点处对八叉树进行遍历,得到最底层的父节点;

2)第二步,将该种节点向一个链表里面进行存储,同时根据节点的颜色数从高到低进行逻辑排序;

3)第三步,将该种节点子节点的颜色数与RGB的对应的值进行累加;

4)第四步,这种情况下,链表尾部为颜色出现最少的最底层的父节点,然后将该类父节点的全部子节点都删除,这样该类父节点就成为叶节点,其父节点则变为底层的父节点,多次进行这几个步骤,一直到八叉树的颜色数比257小,才结束操作。

裁减之后会在一定程度上产生图像层次感不足、轮廓明显等诸多问题,为有效处理这些问题,笔者同时在颜色量化处理的前提条件下配置相应的负反馈系统,在这里主要是利用Floy-Steinberg误差扩散算法进行,根据适当的比例将像素的量化误差向邻接像素进行扩散,从而使其有所补偿。该算法具有诸多优势,例如处理及时、运算简单等,因此在实时性的远程实时监控系统里面具有较高的适用性。

3 实现效果

为了测试优化后屏幕DC法的截图效率,在同一软硬环境下,利用设计的屏幕图像采集。软件工作基本流程如图4所示。

截取正在播放的Flash文件的连续的监控画面,并通过软件合成。用AVI格式的视频流检测所采集到的画面的连续性。软件做了4次捕捉实验,每次捕捉的尺寸不同,每次连续捕捉1000帧,捕捉1帧所需要的平均时间见表1。

如表1所示,可以清晰地比较出屏幕DC和优化屏幕DC二种截图法的效率。在传统DC屏幕截图法中,即使是在尺寸比较小的时候(例如200×200),抓取每一帧的时间是0.0625 s,也就是说1 s抓取16帧,其效率仍没有满足24帧/s(f/s)。结合文件内存映射技术后的屏幕DC法,截取尺寸在330×240以内时,基本上可以做到每秒钟抓取24帧以上,所以在一定的条件下,用基于MVF改进的屏幕DC截取法可以抓取监控屏幕中连续播放的视频图像,这样就完全可以满足监控画面的实时连续播放的需求。

图4 屏幕图像采集软件工作基本流程(截图)

表1 实验测试视频帧抓取时间表

同时为了检验对所截取的监控图像的量化效果,特别是检验图像经过颜色量化以后在层次感、颗粒感与轮廓变化上给人的视觉感受,笔者选择如图5a所示的原图进行静态图像实验,分别对原图做了统一量化处理、改进后的八叉树裁减处理、最后误差扩散处理,由图5可知改进的八叉树算法在颜色的数据量减为原来的1/3的情况下,能够有效减少在颜色渐变区域存在的带状现象,颜色更有层次感,在经过Floyd-Steinberg误差扩散处理后,图像增加了颗粒感,同时带状现象也进一步弱化,从而进一步提高视觉效果。

4 结论

图5 颜色量化算法效果实现对比图

笔者针对传统屏幕DC法在采集图像上速率的不足,结合内存映射文件法设计了在技术上实现较为直接,能够适应各种视频源文件,应用于远程视频监控屏幕资源采集的技术方案。同时通过对原始八叉树算法时效性的改进,再配以改进的Floyd-Steinberg误差扩散处理技术改善了对采集的屏幕图像颜色量化降低颜色数据量时所产生的带状现象、颜色失真等问题。但是笔者设计的方案所对应的软件系统目前的工作平台是Windows系统,因其不是实时操作系统,所以软件在实时抓取连续播放视频图像时,每秒钟实际的截取帧数可能会小于设置的帧数,所以可以考虑将本文所设计方法移植到实时的操作系统上(例如VxWorks),从根本上解决软件系统运行速度的可靠性瓶颈问题。另外笔者是通过对所采集的图像进行量化处理,降低图像颜色的数据量来降低实时监控系统的网络负载,对通信网络的数据吞吐量的提高没有实际的帮助,所以也可以通过简化底层通信机制,尽可能避免为提高网络可靠性所进行的冗余处理,优化网络通信的协议栈等方式增大系统的负载规模。

[1]郑世宝.智能视频监控技术与应用[J].电视技术,2009,33(1):94-96.

[2]胡春安,欧阳城添.Windows编程中的图像输出[J].浙江工业大学学报,2006,34(5):546-549.

[3]张立荣,石峰.基于DirectShow的远程视频监控系统的设计与实现[J].电视技术,2005,29(3):91-93.

[4]徐世波,郭爱菁.基于大型图片的文件读取方法的研究与探讨[J].计算机应用与软件,2009,26(6):126-140.

[5]李小根,王宗敏,黄志全.基于内存映射文件技术快速绘制大场景流域模型[J].计算机应用与研究,2009,26(2):527-528.

[6]廖峨眉,胡建平.基于八叉树颜色量化的OpenGL实现[J].信息技术,2010(5):165-167.

[7]吕广宪,潘懋,宋扬,等.基于多级线性结构和规则分块的虚拟八叉树[J].计算机工程,2007,33(23):3-5.

[8]KANG H C,KAI T W,CHIN C C,et al.Exploiting hardware accelerated occlusion queries for visibility culling[J].IEICET Transactions on Fundamentals,2005(7):2007-2014.

[9]GUO Baolong,FU Xiang.A modified octree color quantization algorithm[EB/OL].[2013-02-25].http://www.researchgate.net/publication/224695366_A_Modified_Octree_Color_Quantization_Algorithm.

猜你喜欢
八叉树内存颜色
三维十字链表八叉树的高效检索实现
基于平面补丁的自适应八叉树三维图像重建
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
特殊颜色的水
内存搭配DDR4、DDR3L还是DDR3?
基于密集型区域的八叉树划分算法
一种基于GPU实现的自适应八叉树纹理绘画算法
上网本为什么只有1GB?