微小型机器人平面运动的视觉控制方法研究中的视频获取技术研究_第1页
微小型机器人平面运动的视觉控制方法研究中的视频获取技术研究_第2页
微小型机器人平面运动的视觉控制方法研究中的视频获取技术研究_第3页
微小型机器人平面运动的视觉控制方法研究中的视频获取技术研究_第4页
微小型机器人平面运动的视觉控制方法研究中的视频获取技术研究_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本科SRP论文微小型机器人平面运动的视觉控制方法研究中的视频获取技术研究学 院 专 业 学生姓名 学生学号 指导教师 提交日期 摘要宏运动下的机器人,多采用传统的轮式机器人,而对于需要在微运动下工作的机器人,有一种方法是采用尺蠖型机器人。尺蠖型机器人通过前后装置的压电材料,在电压变化同时产生相应形变,从而进行前后左右的蠕动,完成微小距离的运动控制。在微小型机器人平面运动的视觉控制系统中,采用视觉控制的方法,通过摄像头对机器人进行全局和局部的定位,以及相应的控制算法,让机器人能够根据控制要求在平面上进行精确移动。因此,对机器人的视觉定位显得尤为重要。本文针对这一部分,讨论了基于Visual C+

2、开发平台和DirectShow流媒体开发包的视频获取技术,为机器人的定位和控制提供必要前提。关键词:微小型机器人、视觉控制、平面运动、Visual C+、DirectShow、视频捕获目 录摘要I第一章 概述11.1课题背景和意义11.2视频获取方法11.3设计的关键1第二章 视频获取技术22.1Visual C+概述22.1.1 Visual C+集成开发环境(IDE)22.1.2 向导(Wizard)22.1.3 MFC库32.2 DirectShow概述32.2.1DirectX系统简介32.2.2 DirectShow概述32.2.3 Filter概述5第三章 视频获取具体实现73.1

3、 CVideoCapture类73.2视频模块功能的实现83.2.1视频捕获83.2.2单帧图像的实时抓取153.3 小结20结束语21参考文献22致谢23第一章 概述1.1课题背景和意义随着现代社会对生产要求、技术精度的不断提高,以及信息化、智能化时代的不断深入,无论是在生产生活、社会服务等领域,对控制的精确度提出越来越高的要求,对微操作处理技术的应用也越来越广泛和深入。微小型机器人的控制系统,具有体积小、能耗低等优点,逐渐受到人们的关注和青睐。而随着计算机技术,特别是多媒体技术的快速发展,图像处理技术得到极大发展,通过视觉图像技术对微小型机器人的准确定位,为系统的控制效果提供了可靠的保证。

4、因此,视觉控制下视频流数据的获取,对信息技术的运用和工业生产信息化、智能化具有十分重要的意义和研究价值。1.2视频获取方法基于视觉控制方法的微小型机器人平面运动控制,通过摄像头等硬件设备,对机器人及作业平台进行实时监控,获取视频流数据,再根据多媒体技术对视频流进行分解、分析,得到机器人在作业平台上的相对位置、角度等信息,再把分析结果反馈到控制器当中,通过预定的控制算法对机器人进行位移控制,从而实现对微小型机器人的精确控制。本文采用Visual C+ 开发平台,利用DirectShow流媒体开发包,实现了通过摄像头对视频流数据的捕获、预处理和保存的功能,为控制方法的进一步研究提供必要前提。1.3

5、设计的关键视频获取的主要关键点有:1.系统需要有良好的软件平台和框架。本课题的设计,是在Windows操作系统的运行平台下,以MicrosoftVisualC+6.0为开发环境完成的。C+面向对象的程序设计思想,给我们提供了用类来定义解决问题中各种抽象概念的方法,使系统的开发更加简明、高效。特别是微软提供的微软基础类库(MFC:MicrosoftFoundationClassLibrary),作为目前开发Windows桌面窗口应用的主流类库,实现了对90%以上的Win32API的面相对象化的包装,极大地提高了检测系统设计的效率,缩短了开发进程。2.视频的捕获。现场图像信息,是通过现场摄像头设备

6、进行获取,并传输到PC中待处理的。为了保证数据量巨大的多媒体处理的高效性、简化复杂的媒体源、媒体格式,以及对不同硬件的兼容问题,我采用了Microsoft公司提供的Windows平台流媒体处理开发包DirectShow进行视频流的操作。为视频流的捕获、保存和单帧抓取提供了强力的支持。第二章 视频获取技术2.1Visual C+概述Visual C+是Microsoft公司的Visual Studio开发工具箱中的一个C+程序开发包。VisualStudio提供了一整套开发Internet和Windows应用程序的工具,包括VisualC+, Visual Basic, Visual Foxpr

7、o, Visual InterDev, Visual J+以及其他辅助工具,如代码管理工具Visual SourceSafe和联机帮助系统MSDN。Visual C+包中除包括C+编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。从最早期的1.0版本,发展到最新的6.0版本,Visual C+已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。最新的6.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。Visual C+一般分为三个版本:学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一

8、种。 2.1.1 Visual C+集成开发环境(IDE)集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。Visual C+软件包中的Developer Studio就是一个集成开发环境,它集成了各种开发工具和VC编译器。程序员可以在不离开该环境的情况下编辑、编译、调试和运行一个应用程序。IDE中还提供大量在线帮助信息协助程序员做好开发工作。Developer Studio中除了程序编辑器、资源编辑器、编译器、调试器外,还有各种工具和向导(如AppWizard和ClassWizard),以及MFC类库,这些都可以帮助程序

9、员快速而正确地开发出应用程序。2.1.2 向导(Wizard)向导是一个通过一步步的帮助引导你工作的工具。Developer Studio中包含三个向导,用来帮助程序员开发简单的Windows程序,它们是:AppWizard:用来创建一个Windows程序的基本框架结构。AppWizard向导会一步步向程序员提出问题,询问他所创建的项目的特征,然后AppWizard会根据这些特征自动生成一个可以执行的程序框架,程序员然后可以在这个框架下进一步填充内容。AppWizard支持三类程序:基于视图/文档结构的单文档应用、基于视图/文档结构的多文档应用程序和基于对话框的应用程序。也可以利用AppWiz

10、ard生成最简单的控制台应用程序(类似于DOS下用字符输入输出的程序)。ClassWizard:用来定义AppWizard所创建的程序中的类。可以利用ClassWizard在项目中增加类、为类增加处理消息的函数等。ClassWizard也可以管理包含在对话框中的控件,它可以将MFC对象或者类的成员变量与对话框中的控件联系起来。ActiveX Control Wizard:用于创建一个ActiveX控件的基本框架结构。ActiveX控件是用户自定义的控件,它支持一系列定义的接口,可以作为一个可再利用的组件。2.1.3 MFC库库(library)是可以重复使用的源代码和目标代码的集合。MFC(M

11、icrosoft Fundamental Casses)是Visual C+开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。这些类可以提供程序框架、进行文件和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。使用MFC库开发应用程序可以减少很多工作量。2.2 DirectShow概述2.2.1DirectX系统简介DirectX的含义是:具有共性的一组东西。DirectX是一个大家庭,并且随着DirectX的版本更新,家族成员也在不断发展壮大。微软的DirectX设计为“硬件设备无关性”。“硬件设备无关性”,即是在利用DirectX进行开发设计时

12、,可以使用与设备无关的方法提供设备相关的性能。目前,DirectX已经成为一种标准,为应用程序开发人员和硬件厂商之间提供关系解耦。DirectX标准的建立,可以为硬件开发提供测量,硬件厂商不得不按照这一标准进行产品改进。同时,通过使用DirectX所提供的接口,开发人员可以充分利用硬件可能带来的高兴能,从而屏蔽了硬件中的具体细节,极大地缩短了开发进度。DirectX采用组件对象模型(COM)标准,因此不同的对象版本可以有不同的接口,这使得DirectX开发的程序即使在未来也能得到完全的兼容和支持。DirectX中成员包括:DirectX Graphics:集成了以前DirectDraw和Dir

13、ect3D技术。DirectDraw:主要负责2D加速,以实现对显卡内存和系统内存的直接操作。Direct3D:主要提供三维绘图硬件接口,它是开发三维DirectX游戏的基础。DirectInput:主要支持输入服务,同时支持输出设备。DirectPlay:主要提供多人网络游戏的通信、组织功能。DirectSetup:主要提供自动安装DirectX组件的API功能。DirectMusic:主要支持MIDI音乐合成和播放功能。DirectSound:主要提供音频捕捉、回放、音效处理、硬件加速、直接设备访问等功能。DirectShow:为在Windows平台上处理各种格式的媒体文件的回访、音视频采

14、集等高兴能要求的多媒体应用,提供了完整的解决方案。DirectX Media Object:DirectShow Filter的简化模型,提供更方便的流媒体数据处理方案。2.2.2 DirectShow概述微软DirectShow是DirectX SDK的成员之一,其前身是ActiveMovie。DirectX SDK是微软提供的一套在Windows操作系统上开发高性能图形、声音、输入、输出和网络游戏的编程接口。它既支持用WDM(Windows Driver Model)驱动的捕捉卡,也支持VFW(Video for Windows)驱动的捕捉卡。DirectShow简化了媒体回放,格式转化和

15、捕捉工作。同时,当要求定制解决方案时,它使应用程序有权使用基的本流控制体系。DirectShow技术是建立在DirectDraw和DirectSound组件基础之上的,通过DirectSound对声卡进行控制以播放声音。DirectShow可提供高质量的多媒体流的捕获和回放功能;支持多种媒体式格;可以从硬件上捕获媒体数据流;可以自动检测并使用视频和音频加速硬件。因此DirectShow可以充分发挥媒体的性能,提高运行速度,可以简化媒体播放、媒体间的格式转换和媒体捕获等工作。同时它,还具有极大的可扩展性和灵活性,可以由用户自己创建组件,并将这个组件加入DirectShow结构中以支持新的格式或特

16、殊的效果。而且DirectX还采用了组件对象模型标准,它具有良好的开放性和可扩展性,软件开发人员可以方便地开发出符合特定算法的编解码组件。其中DirectShow是在Windows平台上处理各种媒体格式文件的回放、音视频设备采集等多媒体应用的软件技术DirectShow设计初衷就是尽量要把开发人员从复杂的数据传输、硬件差异、同步性等工作中解脱出来,总体应用程序框架和层底工作由DirectShow来完成,最终使基于DirectShow框架的开发多媒体应用程序变得易于开发。Microsoft DirectX是微软公司提供的一套在Windows平台上为创建游戏和其他高质量的多媒体应用程序而设计的一套

17、底层应用程序接口集。它提供了对二维和三维的图像、声音效果、音乐、输入设以备及网络应用程序的支持。PC机的成功导致了可用硬件的大量繁衍,众多的供应商为PC机设计了提供各种兼容的产品,但它们却常常缺乏开发所需的可靠标准。DirectShow体系结构方框图如下图2-1所示:图2-1 DirectShow体系结构方框图2.2.3 Filter概述DirectShow是基于模块化的,每个功能模块都采用COM组件方式,称之为Filter(过滤器)。Filter是DirectShow中最基本的概念。DirectShow使用Filter Graph来管理Filter。Filter Graph是Filter的“

18、容器”,Filter是Filter Graph中最小的功能模块。DirectShow提供了一系列的标准模块用于应用开发,开发者也可以开发自己的功能Filter来扩展DirectShow的应用,是DirectShow的开发具有很强的扩展性。Filter一般包含一个到多个的Pin组成。Pin接口本身也是一个COM组件。Filter与Filter之间便是由Pin相互连接,从而构成一条Filter链路。每个Filter上都至少实现了一个IBaseFilter的接口。作为一种COM组件,Filter的创建是通过API函数CoCreateInstance来完成的:STDAPI CoCreateInstan

19、ce( REFCLSID rclsid, /指定需要创建的Filter的CLSID LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv);Filter具有三个状态:运行,停止,暂停。当一个Filter运行时,便处理媒体数据流;停止时,Filter不再处理数据;而暂停状态通常为运行和停止作为过渡状态。Filter一般分为下面几种类型:(1)Source Filter(源过滤器):源过滤器把数据引入到Filter Graph(过滤器图表)中,数据来源可以是文件、网络、摄像头等,而不同的Source Filter可以处理

20、不同类型的数据源。(2)Transform Filter(变换过滤器):变换过滤器的工作是获取输入流,处理数据,并产生输出流,其对数据的处理包括编解码、格式转换、压缩解压缩等。(3)Render Filter(提交过滤器):提交过滤器出于过滤器图表中的最后一级,负责接收数据并把数据提交给外设。(4)Splitter Filter(分割过滤器):分割过滤器把输入流分割成多个输出。例如把AVI格式的字节流分割成视频流和音频流。(5)Mux Filter(混合过滤器):混合过滤器把多个输入组合成一个单独的数据流。例如把视频流和音频流合成为一个AVi格式的字节流。Filter处理的数据流具有各种形式的

21、数据格式,即媒体类型(Media Type)。媒体类型实际上是DirectShow定义的一个数据结构AM_MEDIA_TYPE:Typedef struct _MedaiType GUID majortype; GUID subtype; BOOL bFixedSizeSamples; BOOL bTemporslCompression; ULONG lSampleSize; GUID formattype; IUnknown *pUnk; ULONG cbFormat; BYTE *pbFormat; AM_MEDIA_TYPE;媒体类型主要由3个部分来描述:majortype(主类型,定性

22、地描述媒体类型,如MEDIATYPE_Video或者MEDIATYPE_Audio)、subytype(辅助说明类型,辅助说明主类型,具体指明格式类型)和formattype(格式细节类型,进一步描述格式细节,包括视频图像大小、帧率、采样频率、量化精度等)。每个部分都由GUID进行标识。第3章 视频获取具体实现3.1 CVideoCapture类 CVideoCapture类中,结合DirectShow开发包,封装了系统中对视频流过滤器图表的所有操作。类设计如下:class CCaptureVideo public:int EnumDevices(HWND hList); void Confi

23、gCameraPin(HWND hwndParent); /配置摄像头的视频格式void ConfigCameraFilter(HWND hwndParent); /配置摄像头的图像参数HRESULT CaptureImages(CString inFileName); /捕获保存视频HRESULT PreviewImages(int iDeviceID , HWND hWnd); /采集预览视频HRESULT Begin(int iDeviceID , HWND hWnd ,CString inFileName); /捕获开始 HRESULT Stop(); /停止视频流void FreeM

24、ediaType(AM_MEDIA_TYPE& mt);void GrabOneFrame(BOOL bGrab);private:HWND m_hWnd; /视频显示窗口的句柄IGraphBuilder *m_pGB; /滤波器链表管理器ICaptureGraphBuilder2 *m_pCapture; /增强型捕获滤波器链表管理器IBaseFilter *m_pBF; /捕获滤波器IMediaControl *m_pMC; /媒体控制接口IVideoWindow *m_pVW; /视频显示窗口接口IBaseFilter *pMux; /写文件滤波器CComPtr <ISam

25、pleGrabber> m_pGrabber; /ISampleGrabber接口public:CCaptureVideo();CCaptureVideo();protected:bool BindFilter(int deviceId,IBaseFilter *pFilter); /把指定的设备滤波器捆绑到链表中void ResizeVideoWindow(); /更改视频显示窗口HRESULT SetupVideoWindow(); /设置视频显示窗口的特性HRESULT InitCaptureGraphBuilder(); /创建滤波器链表管理器,查询其各种控制接口;#endif

26、/ !defined(AFX_CAPTUREVIDEO_H_ED45681A_5410_40B1_9439_ECB1AD042BC8_INCLUDED_)通过CVideoCapture类的对象,可以实现Filter Graph的创建,捕捉过滤器Grabber Filter的捆绑,过滤器之间的连接,以及Filter Graph数据流的管理、控制等操作。3.2视频模块功能的实现3.2.1视频捕获为了提高系统的稳定性,Windows操作系统对硬件操作进行了割礼,应用程序一般不能直接访问硬件。而DirectShow Filter工作在用户模式,硬件工作在内核模式。为了解决协同工作的问题,DirectS

27、how把硬件设备设计包装成为Filter,使之能够工作在用户模式下,其控制方法与普通Filter一样,却在内部能够完成与硬件驱动程序的交互,使得DirectShow应用程序的开发人员能够从为硬件做特殊处理的工作中解脱出来。1、视频捕捉过滤器图表的创建为实现对视频流的捕获,首先需要创建一个捕捉过滤器图表(Capture Filter Graph)。DirectShow提供了一个Capture Graph Builder COM组件来协助Capture Filter Graph的创建。Capture Graph Builder提供了一个ICaptureGraphBuilder2的接口,该接口用于构

28、建和控制Capture Filter Graph。每个Filter Graph都由一个Filter Graph Manager COM组件来进行管理,该组件暴露了一个IGraphBuilder接口,提供了操作管理Filter Graph的方法。创建过程如下:首先分别定义两个接口的接口指针:IGraphBuilder *m_pGB; /滤波器链表管理器ICaptureGraphBuilder2 *m_pCapture; /增强型捕获滤波器链表管理器然后创建接口对象,把上述指针分别指向两个接口对象并对ICaptureGraphBuilder2接口进行初始化:HRESULT hr ;/创建IGrap

29、hBuilder接口hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void*)&m_pGB);if(FAILED(hr) return hr ;/创建ICaptureGraphBuilder2接口hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(void*)&m_pCapture) ;if(FAILED(hr) return

30、hr ;/初始化滤波器链表管理器IGraphBuilderm_pCapture->SetFiltergraph(m_pGB);至此,Capture Filter Graph得以创建。接下来要为过滤器图表添加各种Filter来完成模块功能。2、系统设备枚举与捕获过滤器的绑定首先,需要为捕获过滤器图表选择一个视频捕捉设备。通常采用系统设备枚举的方法。系统设备枚举器根据不同的种类创建一个枚举器,如音频压缩、视频捕捉等。不同种类的枚举器对于每一种设备返回一个独立的名称(moniker)。种类枚举器自动将相关的即插即用、演播设备包括进来。使用设备枚举器步骤如下:(1)创建枚举器组件,CLSID 为

31、 CLSID_SystemDeviceEnum(2)通过设备特定的标识符CLSID来指定某一类型设备,再通过一个系统函数TUHICreateDevEnum:CreateClassEnumeratorTHU获取某一种类的枚举器,这个函数返回一个IEnumMoniker接口指针,如果该种类的空或者不存在,这个方法就返回S_FALSE。因此,当你调用这个函数时一定要检查返回值是否为S_OK,而不要用SUCCEEDED宏。指定某一种类型设备,参数CLSID,通过(3)然后 IEnumMoniker:Next 枚举每一个 moniker。这个方法返回一个 IMoniker 接口指针。(4)要想知道设备的

32、名称,可以通过下面的函数 IMoniker:BindToStorage(5)然后利用IMoniker:BindToObject生成绑定道设备上的filter。调用TUHIFilterGraph:AddFilterTHU将filter添加到Graph图中。枚举过程如图3-1所示图3-1 设备枚举过程创建过程如下(通过调用BindFilter成员函数实现):bool CCaptureVideo:BindFilter(int deviceId,IBaseFilter *pFilter)/枚举所有的视频捕获设备ICreateDevEnum *pCreateDevEnum ;/创建设备枚举器pCreat

33、eDevEnum对象hr=CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void*)&pCreateDevEnum);if( hr != NOERROR ) return false ;IEnumMoniker *pEm;/创建视频输入设备类枚举器hr=pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm,0);if( hr != NOERROR ) re

34、turn false ;pEm->Reset(); /复位该设备ULONG cFetched;IMoniker *pM;int index = 0 ;/获取设备while( hr = pEm->Next(1,&pM,&cFetched),hr = S_OK , index <= deviceId ) IPropertyBag *pBag; /获取该设备的属性集 hr = pM->BindToStorage(0,0,IID_IPropertyBag,(void*)&pBag); if(SUCCEEDED(hr) VARIANT var ;var.v

35、t = VT_BSTR; /保存的是二进制的数据hr = pBag->Read(L"FriendlyName",&var,NULL); /获取FriendlyName形式的信息if( hr = NOERROR ) /采集设备与捕获滤波器捆绑 if( index = deviceId ) pM->BindToObject(0,0,IID_IBaseFilter,(void*)pFilter); SysFreeString(var.bstrVal); /释放二进制数据资源pBag ->Release(); pM->Release(); index

36、+;3、过滤器在过滤器图表中的连接Filter的连接实际上就是过滤器上Pin的连接。连接的方向一般上总是由上一级Filter的输出Pin指向下一级Filter的输入Pin。Pin的连接实际上是连接双方使用的媒体类型的一个“协商”过程。Pin作为一个COM组件,在每个Pin上都实现的IPin接口。Pin正式通过这个IPin接口来完成连接的。一般通过调用接口方法IFilterGraph:ConnectDirect、IGraphBuilder:Connect、IGraphBuilder:Render或者IGraphBuilder:RenderFile、以及ICaptureGraphBuilder2:

37、RenderStream来实现。连接过程如下图3-2所示:图3-2 Filter连接过程本次设计中使用ICaptureGraphBuilder2:RenderStream的方法来进行过滤器的连接。通常情况下,在每个Filter只有一个输入或输出Pin的时候,可以利用本方法方便地把两个或者三个Filter同时连接起来。例如A,B,C三个过滤器,每个过滤器只有一个输入和输出Pin,则通过调用本方法可以将A,B,C按顺序智能地连接起来:RenderStream(NULL,NULL,A,B,C);如果只需要连接2个过滤器,A和C,则只需要将中间的B设置为NULL即可:RenderStream(NULL

38、,NULL,A,NULL,C);假如第三个参数设置为NULL,则该方法自动为过滤器图表设置一个提交过滤器(Render Filter),并自动根据数据流类型设置为Video Render或者DirectSound Render。另外,在连接过滤器之前,需要把过滤器添加到过滤器图表中,才能把过滤器连接到图表中。把过滤器添加到过滤器图表中可以通过调用过滤器图表管理器暴露的IGraphBuilder接口提供的IGraphBuilder:AddFilter函数来实现。如把捕捉源过滤器添加到过滤器图表,为:hr = m_pGB->AddFilter(m_pBF,L"Capture Fil

39、ter");添加完成后,便可以进行过滤器的连接:hr=m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,m_pBF,NULL,NULL);if(FAILED(hr) AfxMessageBox(_T("Can't build the graph"); return hr ;4、视频的保存和预览视频捕捉过滤器一般都有两个或者多个输出Pin,它们输出的媒体类型都一样,如预览Pin和捕捉Pin。可以根据Pin的功能来区别每个Pin,每个Pin都有一个GUID,成为

40、Pin的种类。预览Pin用于将视频流显示在屏幕上,捕捉Pin啧用来将视频流写入文件中。本设计中,实现了对视频的实时预览和保存,因此需要用到预览Pin和捕捉Pin。当需要预览视频的时候,则在过滤器连接到过滤器图表的函数调用中,指定连接接口为预览Pin:RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,m_pBF,NULL,NULL);其中第一个参数指明了所连接的输出Pin为预览Pin,第二个参数则指明媒体类型为视频流媒体类型。最后一个参数为NULL,如上面所说,该函数自动为过滤器图表添加连接一个Video Render提交过滤

41、器。当需要保存视频的时候,同理,在连接函数调用中,指定连接接口为捕捉Pin:IBaseFilter *pMux;hr = pBuild->SetOutputFileName( &MEDIASUBTYPE_Avi, / Specifies AVI for the target file. L"C:Example.avi", / File name. &pMux, / Receives a pointer to the mux. NULL); / (Optional) Receives a pointer to the file sink.RenderSt

42、ream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,NULL,pMux);其中第一个参数指明了所连接的输出Pin为捕捉Pin,最后一个参数指明另一个过滤器AVI Mux Filter。该过滤器把从捕捉Pin接口输出的视频流打包转为AVI格式的数据流。SetOutputFileName函数根据第一个参数usuo指定的媒体主格式产生一个多路过滤器,如上的AVI,产生AVI_MAX_FILTER,然后把该过滤器加入到过滤器图表中(这里则可以省去AddFilter函数的调用)然后把该过滤器的IBaseFilter接口指针赋给pMux。如果

43、该过滤器支持IFileSinkFilter接口,则调用IFileSinkFilter:SetFileName来设置保存文件名,否则本函数另外创建一个FileWriterFilter过滤器到过滤器图表中,如果第四个参数不为NULL,则返回FileWriterFilter的接口指针给该参数。如下图3-3所示图3-3 视频捕捉过滤器链表无论是预览还是视频保存,都需要在系统界面上提供一个窗口播放采集的视频信息。本设计中,在界面上创建一个pictrue控件来作为视频播放窗口。首先在CCaptureVideo类中定义一个窗口句柄,用于保存视频显示窗口句柄:HWND m_hWnd; /视频显示窗口的句柄然后

44、把创建的Pictrue控件句柄作为形参传递给预览或保存函数:HWND hVWindow = m_videoWindow.GetSafeHwnd(); /获取视频显示窗口的句柄m_cap.PreviewImages(id,hVWindow);最后,在m_cap.PreviewImage函数中调用显示窗口子函数,完成显示窗口的设置:HRESULT CVideoCapture:SetupVideoWindow()HRESULT hr ;/m_hWnd为类CCaptureVideo的成员变量,在使用该函数前须初始化hr = m_pVW->put_Visible(OAFALSE); /视频窗口不可

45、见hr = m_pVW->put_Owner(OAHWND)m_hWnd); /窗口所有者:传入的窗口句柄if(FAILED(hr) return hr ;hr = m_pVW->put_WindowStyle( WS_CHILD | WS_CLIPCHILDREN); /窗口风格设置if( FAILED(hr) return hr ;ResizeVideoWindow(); /更改窗口大小hr = m_pVW->put_Visible(OATRUE); /视频窗口可见return hr ;5、视频流的控制视频预览和保存设置成功后,需要对视频流进行开始、停止等操作。这就需要用

46、到过滤器图表管理器为我们提供的控制接口:IMediaControl 。首先在CVideoCapture类中定义一个接口指针:IMediaControl *m_pMC; /媒体控制接口然后查询过滤器图表管理器的IMediaControl接口,并把地址赋给m_pMC:hr = m_pGB->QueryInterface(IID_IMediaControl,(void*)&m_pMC);这样便可以通过调用IMediaControl提供的函数对过滤器图表中的数据流进行操作:数据开始传输:m_pMC->Run();数据传输停止:m_pMC->Stop();3.2.2单帧图像的实

47、时抓取本设计中的火焰高度检测,是基于BMP位图的图像处理,而捕获的数据形式为视频格式。由于视频流实际上由一帧帧的图像构成的,所以通过对数据单样本的截取保存,可以实现对单帧图像的实时抓取,为火焰高度的分析提供相应的BMP位图文件。1、Filter中数据的传送每个Pin上都实现了IPin接口,但这个接口主要用于Pin的连接,而非数据传送。数据的传送一般是在输入Pin上实现的IMemInputPin接口。Filter之间是以Sample的形式来传送数据的。Sample是一个封装了一定大小数据内存的COM组件。这个组件引出了IMediaSample接口。而Sample则由内存分配器(alloctor)

48、的COM对象来创建。每个allocator都要创建一个Sample池,并且给每个Sample分配一个内存Buffer,每当一个Filter需要一个Buffer来填充数据,它就通过allocator的函数IMemAllocator:GetBuffer来获得一个Sample。如果分配器正好有空闲的Sample,GetBuffer立即返回一个指向该Sample的指针。如果没有空闲Sample,该方法则阻塞直到有空闲Sample出现位置。当该函数返回一个Sample指针时,过滤器就将数据填充到Buffer中,设置好标识,然后将Sample传递给下一个过滤器。为了在过滤器图表中传递媒体数据,Direct

49、Show过滤器需要支持一些协议,称之为传输协议。连接的过滤器必须支持同样的传输协议,否则不能交换媒体数据。2、过滤器图表中的事件通知机制当某个事件发生时,比如数据流结束、或者产生一个错误等,过滤器会给过滤器图表管理器发送一个事件通知。过滤器图表管理器可以处理其中一部分时间,把另一部分交给应用程序来处理。如果管理器没有处理某个事件,它就把事件通知放到一个队列中,图表管理器也可以把它本身的事件通知放进队列中。通过这种方式,图表管理器和应用程序之间的相互通信得以实现。为了处理事件,应用程序需要一种机制来获取正在队列中等待的时间。过滤器图表管理器提供了两种方法:(1)窗口通知:图表管理器发送开发者自己

50、定义的窗口消息;(2)事件信号:如果队列中有管理器事件,就用事件信号通知应用程序,如果队列为空就重新设置事件信号。3、图像抓取的实现在媒体文件播放或者捕获过程中,抓取当前播放位置的图像的方法有很多种。最为简单的是通过调用过滤器图表管理器暴露的IBasicVideo接口提供的IBasicVideo:GetCurrentImage接口函数。但是如果Video Render使用了Direct Draw加速,这个函数的调用会失败,并且调用过程中Video Render必须处于暂停状态,所以本方法具有较大限制。在本设计中,采用了Sample Grabber Filter所提供的方法来实现图像的抓取。Sa

51、mple Grabber Filter其实是一个Trans In Place Filter,事实上,除了抓取单帧图像,利用Sample Grabber可以抓取任何类型的Sample。(1)创建Sample Grabber,并将其添加到过滤器图表当中/ Create the Sample Grabber.IBaseFilter *pGrabBase = NULL;hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void*)&pGrabBase);if (FAI

52、LED(hr) / Return an error.hr = pGraph->AddFilter(pGrabBase, L"Sample Grabber");if (FAILED(hr) / Return an error.(2)查询过滤器的ISampleGrabber接口,并获得其指针ISampleGrabber *pGrabber;pGrabBase->QueryInterface(IID_ISampleGrabber, (void*)&pGrabber);(3)设置Sample Grabber Filter 连接Pin上使用的媒体类型,本设计中使用

53、24位RGB图像,实现方法如下:AM_MEDIA_TYPE mt;ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE);mt.majortype = MEDIATYPE_Video;mt.subtype = MEDIASUBTYPE_RGB24;hr = pGrabber->SetMediaType(&mt);(4)完成格式设置后,便可以把Sample Grabber过滤器与视频捕捉过滤器连接起来/把Grabber滤波器与Capture滤波器链接hr=m_pCapture->RenderStream(&PIN_CATEGORY_PREV

54、IEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);(5)图像的抓取。在图像抓取中,本设计定义了一个继承ISampleGrabber接口的类CSampleGrabberCB。在该类中,设置了Sample Grabber的工作模式及其回调函数,并在回调函数中实现对BMP位图文件的保存。其工作模式包括两个方面:缓冲模式和回调模式。缓冲模式中,过滤器将输入的Sample进行缓存后,再往下传送;而在回调模式中,当有输入的Sample时,过滤器将调用设置的回调函数。本设计中采用了回调模式。hr = m_pGrabber->SetBufferSamples( FALSE );hr = m_pGrabber->SetOneShot( FALSE );hr = m_pGrabber->SetCallback( &mCB, 1 ); 回调函数的设置: STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )if( !bOneShot )return 0;if (!pBuffer)return E_POINTER;strcpy(m_szFileName, szFileName);SaveBitmap(pBuffer, lBuf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论