《农业网络信息》2007年第10期交流园地
基于VC++与DirectShow的视频监控及其实验平台彭海云1,徐建敏2
(1.周口师范学院,河南周口466000;2.东莞理工学院,广东东莞523808)
摘
要:主要介绍了基于VC++与DirectShow技术所开发的实时的视频监控过程及实现的主要代码。
文献标识码:B
文章编号:1672-6251(2007)10-0189-02
关键词:DirectShow;过滤器;视频图像中图分类号:TP399
AvideomonitorandexperimentplatformbasedonVC++andDirectShow
PENGHai-yun1,XUJian-min2
(1.ZhoukouNormalUniversity,Zhoukou466000,China;2.DongguanScienceandTechnologgUniversity,Dongguan511700,China)Abstract:ThispaperintroducesDirectShowandpresentssoftwareimplementationofaVideoImageProcessingSystembasedonDirectShow.
Keywords:Directshow;Filter;Videoimage
1引言
为了满足银行、交通、电力、居民小区等要害部门和社会领域的安防需要,视频监控技术得到迅速发展、普及。早期的监控主要由摄像机、视频矩阵、监视器、录像机控制电缆连接,只适用于小范围内的组成,通过视频线、
监控。随着数字视频压缩编码技术的日益成熟、多媒体计算机性能的提高和网络带宽的增大,使多媒体数据的远程传输变成可能,这些多媒体数据具有图像清晰、可记录、数据共享等优点。而如何进行实时视频捕捉,已成为视频监控系统要解决的重要问题。
本文利用VC++编程,结合DirectShow的多媒体开发具有代码量少、通用性强、实时性好的特点,来进行实时的视频监控。
图1DirectShow的体系结图
2实现原理
Directshow是微软公司提供的一套在Windows平台上进行媒体流处理的多媒体开发包,与DirectX开发包一起发布。是微软公司推出的新一代基于COM组件对象模型的系统,由许多模块化的软件组件组成,它主要负责在
支持多线程的特性,用一个线程实现数据的采集与回放,另一个线程进行图像处理,从而达到视频监控的目的。
2.1DirectShow工作原理
图1显示了DirectShow的体系结构图,DirectShow技术中处于最核心位置的就是作为“过滤器”的可插入标准组件,它是执行特定任务的COM对象,过滤器又可细分变换过滤器(Trans-form为:源过滤器(SourceFilter)、
表现过滤器(RendererFilter)等,过滤器通过文件读Filter)、
internet网上音频和视频流的捕捉和回放[1]。directshow采用多线程多任务的方式,还支持宽松的格式变化,包括高级流格式ASF,AVI,MPEG,MP3和WAV文件。因此
修改数据和显示数据输出设备上来操作流媒体,为了Directshow为播放视频监控中涉及到的各种类型的音频、写、
视频数据提供了非常有效的途径[1]。我们利用Directshow完成整个任务,必须要将所有的过滤器(Filter)连接起来,
收稿日期:2007-07-10;修回日期:2007-07-28作者简介:彭海云(1972-),女,讲师,研究方向:计算机应用研究。
-189-
《农业网络信息》2007年第10期交流园地
达时调用一次回调方法。ISampleGrabberCB有两个回调方法可以实现图像处理,SampleCB和BufferCB方法,通常仅需实现其中的一个方法。
图象处理主要实现步骤如下:(1)初始化COM……
这3种过滤器组成了过滤器图表结构
[2]
(2)创建CaptureGraphBuilder组件,获取Cap-
。对于每个过滤
器,都拥有自身的针脚,它是由过滤器创建的com对象,用于连接每个过滤器。针脚分为输入针脚和输出针脚,输入针脚把过滤器外部的数据接收到过滤器中准备处理,输出针脚把过滤器中处理后的数据传送到过滤器外部。通过一个又一个针脚,数据从一个过滤器传送到另一个过滤器中。
[2]
tureGraph接口
(3)在FilterGraph加入视频源过滤器
(4)在FilterGraph加入AVIDecompressorFilter(5)在FilterGraph加入SampleGrabberFilter并设置媒体类型、缓冲模式。
(6)连接各Filter
2.2具体实现
开发DirectShow应用程序,一般分为3个部分,如图2所示。
[3]
pBuilder->RenderStream(&PIN_CATEGORY_CAP-TURE,&MEDIATYPE_Video,m_pFilter,pAviDecompres-sorF,pGrabberF);
pBuilder->RenderStream(NULL,&MEDIATYPE_Vide-o,pGrabberF,NULL,NULL);
pBuilder->Release();
(7)定义一个类CSampleGrabberCB:publicIsample-
①创建一个过滤器图管理器;②根据实际的应用,一条完整的过滤器链路;③调用过滤器图管理器或过滤器上的各个接口方法进行控制,并完成过滤器图管理器与应用程序的事件交互。
2.2.1硬件系统
系统的硬件部分包括摄像机和视频采集卡,其主要任务是将模拟视频图像转换成适合于计算机处理的数字视频信号。可以根据系统要求选择不同的配置。
GrabberCB在该类中重载BufferCB方法。在BufferCB中可以加入用户具体的图像处理函数。在类中可以定义一些公用属性,用于传递相关参数。如图像类型。
(8)设置SampleGrabber回调模式
2.2.2软件系统
由于DirectShow是使用COM技术实现的,首先要调用CoInitialize函数进行初始化。接着创建用于组建过滤器图的过滤器组件管理器和CaptureGra-phBuilder组件,定义接口指针并获取各接口。
系统使用SampleGrabberFilter抓帧过滤器抓取视频帧,然后对每一帧应用具体的图像处理算法。抓帧过滤器是一个转换过滤器,支持ISampleGrabber接口。它把取样无改变地向下游传输,当取样穿过该过滤器时便能得到这些帧。帧抓取过滤器没有首选的媒体类型,它在被插入之前,通过调用ISampleGrabber::SetMediaType方法,指定参数AM_MEDIATYPE设置输入针的媒体类型,媒体类型能确保过滤器管理器在过滤器图表中适当的位置插入抓帧过滤器。SampleGrabber可以有两种工作模式,缓冲区模式和回调模式,通过调用Isample-Grabber::Set-
[4]
CSampleGrabberCBCB;
//向类CsampleGrabberCB传递图像类型信息。CB.Width=vih->bmiHeader.biWidth;CB.Height=vih->bmiHeader.biHeight;FreeMediaType(mt);
pGrabber->SetBufferSamples(true);pGrabber->SetOneShot(false);pGrabber->SetCallback(&CB,1);(9)用接口对FilterGraph进行控制
3结束语
本文实现了基于VisualC++与微软的DirectShow技术的实时监控视频图像处理功能,给出了详细的方法介绍和程序设计,对类似系统的设计开发有一定的借鉴意义。
参考文献
[1][2][3][4]
陆其明.DirectShow开发指南[M].北京:清华大学出版社,2003.胡春华,曹元大,张磊.基于DirectShow的视频流媒体存储系统的设计与实现[J].计算机工程与设计,2003.11(24):31~33.
BufferSamples(TRUE/FALSE)设置。在缓冲区模式下,调用IsampleGrabber::Get-CurrentBuffer方法获得最近缓冲的帧,因当前帧将覆盖前一帧,可以设置IsampleGrabber::
MicrosoftCorporation.MicrosoftDirectX9.0SDKDocument[M].MicrosoftCorporation,2002.
辛长安,梅林.VC++编程技术与难点剖析[M].海口:南方出版社,2004.
Set-OneShot(TRUE),使SampleGrabber抓取一帧后,立即停止运行。在回调模式下,要定义一个回调类,它实现
ISampleGrabberCB接口。抓帧过滤器能在每一个取样到
-190-