二. 组件开发与演示
有了马赛克处理的算法实现,接下去的问题就是,如何来获取连续的视频图像帧数据?在这里我们可以借助于DirectX SDK自带的一个工具软件GraphEdit(即SDK目录下的Bin\DXUtils\graphedt.exe)。运行GraphEdit,如图5:
 图5 GraphEdit工具软件 |
执行菜单命令File | Render Media File…,在随后弹出的对话框中选择一个多媒体文件(比如选定一个含有人像、位置比较固定的MPEG2文件mp2_Sales.mpg),自动构建如图6的链路:
 图6 使用GraphEdit构建的播放链路(点击放大) |
然后执行菜单命令Graph | Play就可以对mp2_Sales.mpg文件实现播放了。同样执行Graph | Pause或Graph | Stop就可以暂停或停止当前的播放。
值的注意的是,GraphEdit播放mp2_Sales.mpg文件采用的就是DirectShow技术!大家知道,DirectX是微软公司提供的一套在Windows平台上开发高性能图形、声音、输入、输出和网络游戏的编程(www.cppentry.com)接口;而DirectShow就是DirectX的一个成员,专门用于音视频数据采集、多媒体文件播放等方面的应用。
DirectShow中最基本的功能模块叫做Filter(图6中每个矩形块都代表一个Filter);每个Filter都至少有一个Pin,用于接收数据或者输出数据;Filter总是完成一定的功能(图6中左边第一个Filter是文件源,MPEG-2 Splitter负责将MPEG2数据流中的音频和视频分离,CyberLink Audio Decoder负责将MPEG格式的音频数据解码,HQ MPEG-2 Video Decoder负责将MPEG格式的视频数据解码,Default DirectSound Device负责音频播放,Video Renderer负责视频显示);各种Filter按照一定的顺序串联起来,相互协作;数据在Filter之间沿着箭头的方向流动,直到Default DirectSound Device和Video Renderer。
DirectShow是一个模块化的、开放性的应用框架。我们可以开发自己的Filter组件,然后插入到Filter链路中的某个位置,以获得处理数据流的机会。拿本文需要实现的视频马赛克处理来说,我们完全可以将马赛克处理算法实现在一个Filter中,然后将其连接到视频解码Filter后面,以获取连续的、非压缩的图像帧数据。我们把这个Filter取名为“HQ Video Mosaic”;因为这个Filter可以在输入的图像帧上“就地”修改数据,因此Filter可以采用Trans-In-Place模型;Filter接受16位、24位、32位RGB格式的数据输入。HQ Video Mosaic开发完成后生成Hqmosaic.ax文件(假设放在C:\下),然后使用系统的Regsvr32.exe注册(方法是:执行命令行Regsvr32 C:\Hqmosaic.ax)。(注意:关于DirectShow Filter开发方法更详细的介绍,限于篇幅,笔者在这里就不作展开了;有兴趣的读者可以参考笔者的两本拙作《DirectShow开发指南》和《DirectShow实务精选》。HQ Video Mosaic Filter的源代码请读者到 http://hqtech.nease.net下载。)
Filter组件开发完成并且成功注册之后就可以在GraphEdit中使用了。首先还是构建如图6的Filter链路。然后执行菜单命令Graph | Insert Filters…,在随后弹出的对话框中点开“DirectShow Filters”目录,然后找到“HQ Video Mosaic”一项双击将其加入。接着将HQ MPEG-2 Video Decoder与Video Renderer的连接断开(用鼠标选中这两个Filter之间的箭头后按下键盘的Delete键)。然后将HQ MPEG-2 Video Decoder连向HQ Video Mosaic,再将HQ Video Mosaic连向Video Renderer。(两个Filter之间的连接方法:首先在欲连接的上一级Filter的输出Pin上按住鼠标左键不放,拖动鼠标到下一级Filter的输入Pin上,最后放开鼠标左键。)最终的Filter链路如图7:
 图7 在GraphEdit中使用渐入渐出Filter(点击放大) |
现在,执行菜单命令Graph | Play,我们就可以看到类似图1的视频局部区域马赛克处理的演示了。另外,通过如图8的HQ Video Mosaic Filter的属性页(打开属性页的方法:鼠标选中HQ Video Mosaic,执行右键菜单项“Filter Properties…”),我们还可以动态更新需要进行马赛克处理的区域,以及像素水平/垂直放大的比率。
 图8 HQ Video Mosaic Filter的属性页 |
三. 小结
本文介绍了视频马赛克处理的原理,以及一种使用C++(www.cppentry.com)的算法实现。随后借助于DirectShow,本文还完成了视频局部区域马赛克处理的效果演示。
|