




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科 SRP 论文微小型机器人平面运动的视觉控制方法研究中的视频获取技术研究学 院 专 业 学生姓名 学生学号 指导教师 提交日期 I摘要 宏运动下的机器人,多采用传统的轮式机器人,而对于需要在微运动下工作的机器人,有一种方法是采用尺蠖型机器人。尺蠖型机器人通过前后装置的压电材料,在电压变化同时产生相应形变,从而进行前后左右的蠕动,完成微小距离的运动控制。在微小型机器人平面运动的视觉控制系统中,采用视觉控制的方法,通过摄像头对机器人进行全局和局部的定位,以及相应的控制算法,让机器人能够根据控制要求在平面上进行精确移动。因此,对机器人的视觉定位显得尤为重要。本文针对这一部分,讨论了基于 Visual C+开发平台和 DirectShow 流媒体开发包的视频获取技术,为机器人的定位和控制提供必要前提。关键词:微小型机器人、视觉控制、平面运动、Visual C+、DirectShow 、视频捕获II目 录摘要 .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 CVideoCapture 类 73.2 视频模块功能的实现 83.2.1 视频捕获 .83.2.2 单帧图像的实时抓取 .153.3 小结 .20结束语 21参考文献 22致谢 231第一章 概述1.1 课题背景和意义随着现代社会对生产要求、技术精度的不断提高,以及信息化、智能化时代的不断深入,无论是在生产生活、社会服务等领域,对控制的精确度提出越来越高的要求,对微操作处理技术的应用也越来越广泛和深入。微小型机器人的控制系统,具有体积小、能耗低等优点,逐渐受到人们的关注和青睐。而随着计算机技术,特别是多媒体技术的快速发展,图像处理技术得到极大发展,通过视觉图像技术对微小型机器人的准确定位,为系统的控制效果提供了可靠的保证。因此,视觉控制下视频流数据的获取,对信息技术的运用和工业生产信息化、智能化具有十分重要的意义和研究价值。1.2 视频获取方法基于视觉控制方法的微小型机器人平面运动控制,通过摄像头等硬件设备,对机器人及作业平台进行实时监控,获取视频流数据,再根据多媒体技术对视频流进行分解、分析,得到机器人在作业平台上的相对位置、角度等信息,再把分析结果反馈到控制器当中,通过预定的控制算法对机器人进行位移控制,从而实现对微小型机器人的精确控制。本文采用 Visual C+ 开发平台,利用 DirectShow 流媒体开发包,实现了通过摄像头对视频流数据的捕获、预处理和保存的功能,为控制方法的进一步研究提供必要前提。1.3 设计的关键视频获取的主要关键点有:1.系统需要有良好的软件平台和框架。本课题的设计,是在 Windows 操作系统的运行平台下,以 MicrosoftVisualC+6.0 为开发环境完成的。C+面向对象的程序设计思想,给我们提供了用类来定义解决问题中各种抽象概念的方法,使系统的开发更加简明、高效。特别是微软提供的微软基础类库(MFC:MicrosoftFoundationClassLibrary),作为目前开发Windows 桌面窗口应用的主流类库,实现了对 90%以上的 Win32API 的面相对象化的包装,极大地提高了检测系统设计的效率,缩短了开发进程。2.视频的捕获。现场图像信息,是通过现场摄像头设备进行获取,并传输到 PC 中待处理的。为了保证数据量巨大的多媒体处理的高效性、简化复杂的媒体源、媒体格式,以及对不同硬件的兼容问题,我采用了 Microsoft 公司提供的 Windows 平台流媒体处理开发包DirectShow 进行视频流的操作。为视频流的捕获、保存和单帧抓取提供了强力的支2持。第二章 视频获取技术2.1Visual C+概述Visual C+是 Microsoft 公司的 Visual Studio 开发工具箱中的一个 C+程序开发包。VisualStudio 提供了一整套开发 Internet 和 Windows 应用程序的工具,包括 VisualC+, Visual Basic, Visual Foxpro, Visual InterDev, Visual J+以及其他辅助工具,如代码管理工具Visual SourceSafe 和联机帮助系统 MSDN。Visual C+包中除包括 C+编译器外,还包括所有的库、例子和为创建 Windows 应用程序所需要的文档。从最早期的 1.0 版本,发展到最新的 6.0 版本,Visual C+已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。最新的 6.0 版本在编译器、MFC 类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。Visual C+一般分为三个版本 :学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种。 2.1.1 Visual C+集成开发环境(IDE )集成开发环境(IDE )是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。Visual C+软件包中的 Developer Studio 就是一个集成开发环境,它集成了各种开发工具和 VC 编译器。程序员可以在不离开该环境的情况下编辑、编译、调试和运行一个应用程序。IDE 中还提供大量在线帮助信息协助程序员做好开发工作。Developer Studio 中除了程序编辑器、资源编辑器、编译器、调试器外,还有各种工具和向导(如 AppWizard 和 ClassWizard) ,以及 MFC 类库,这些都可以帮助程序员快速而正确地开发出应用程序。2.1.2 向导(Wizard)向导是一个通过一步步的帮助引导你工作的工具。Developer Studio 中包含三个向导,用来帮助程序员开发简单的 Windows 程序,它们是:AppWizard:用来创建一个 Windows程序的基本框架结构。AppWizard 向导会一步步向程序员提出问题,询问他所创建的项目的特征,然后 AppWizard 会根据这些特征自动生成一个可以执行的程序框架,程序员然后可以在这个框架下进一步填充内容。AppWizard 支持三类程序:基于视图/ 文档结构的单文档应用、基于视图/文档结构的多文档应用程序和基于对话框的应用程序。也可以利用AppWizard 生成最简单的控制台应用程序(类似于 DOS 下用字符输入输出的程序) 。ClassWizard:用来定义 AppWizard 所创建的程序中的类。可以利用 ClassWizard 在项目中增加类、为类增加处理消息的函数等。ClassWizard 也可以管理包含在对话框中的控件,它可以将 MFC 对象或者类的成员变量与对话框中的控件联系起来。3ActiveX Control Wizard:用于创建一个 ActiveX 控件的基本框架结构。ActiveX 控件是用户自定义的控件,它支持一系列定义的接口,可以作为一个可再利用的组件。2.1.3 MFC 库库(library)是可以重复使用的源代码和目标代码的集合。MFC (Microsoft Fundamental Casses)是 Visual C+开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。这些类可以提供程序框架、进行文件和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。使用 MFC 库开发应用程序可以减少很多工作量。2.2 DirectShow 概述2.2.1DirectX 系统简介DirectX 的含义是:具有共性的一组东西。DirectX 是一个大家庭,并且随着 DirectX的版本更新,家族成员也在不断发展壮大。微软的 DirectX 设计为“硬件设备无关性” 。“硬件设备无关性” ,即是在利用 DirectX 进行开发设计时,可以使用与设备无关的方法提供设备相关的性能。目前,DirectX 已经成为一种标准,为应用程序开发人员和硬件厂商之间提供关系解耦。DirectX 标准的建立,可以为硬件开发提供测量,硬件厂商不得不按照这一标准进行产品改进。同时,通过使用 DirectX 所提供的接口,开发人员可以充分利用硬件可能带来的高兴能,从而屏蔽了硬件中的具体细节,极大地缩短了开发进度。DirectX 采用组件对象模型(COM )标准,因此不同的对象版本可以有不同的接口,这使得 DirectX 开发的程序即使在未来也能得到完全的兼容和支持。DirectX 中成员包括:DirectX Graphics:集成了以前 DirectDraw 和 Direct3D 技术。DirectDraw:主要负责 2D 加速,以实现对显卡内存和系统内存的直接操作。Direct3D:主要提供三维绘图硬件接口,它是开发三维 DirectX 游戏的基础。DirectInput:主要支持输入服务,同时支持输出设备。DirectPlay:主要提供多人网络游戏的通信、组织功能。DirectSetup:主要提供自动安装 DirectX 组件的 API 功能。DirectMusic:主要支持 MIDI 音乐合成和播放功能。DirectSound:主要提供音频捕捉、回放、音效处理、硬件加速、直接设备访问等功能。DirectShow:为在 Windows 平台上处理各种格式的媒体文件的回访、音视频采集等高兴能要求的多媒体应用,提供了完整的解决方案。DirectX Media Object:DirectShow Filter 的简化模型,提供更方便的流媒体数据处理方案。42.2.2 DirectShow 概述微软 DirectShow 是 DirectX SDK 的成员之一,其前身是 ActiveMovie。DirectX SDK是微软提供的一套在 Windows 操作系统上开发高性能图形、声音、输入、输出和网络游戏的编程接口。它既支持用 WDM(Windows Driver Model)驱动的捕捉卡,也支持VFW(Video for Windows)驱动的捕捉卡。DirectShow 简化了媒体回放,格式转化和捕捉工作。同时,当要求定制解决方案时,它使应用程序有权使用基的本流控制体系。DirectShow 技术是建立在 DirectDraw 和 DirectSound 组件基础之上的,通过 DirectSound对声卡进行控制以播放声音。DirectShow 可提供高质量的多媒体流的捕获和回放功能;支持多种媒体式格;可以从硬件上捕获媒体数据流;可以自动检测并使用视频和音频加速硬件。因此 DirectShow 可以充分发挥媒体的性能,提高运行速度,可以简化媒体播放、媒体间的格式转换和媒体捕获等工作。同时它,还具有极大的可扩展性和灵活性,可以由用户自己创建组件,并将这个组件加入 DirectShow 结构中以支持新的格式或特殊的效果。而且 DirectX 还采用了组件对象模型标准,它具有良好的开放性和可扩展性,软件开发人员可以方便地开发出符合特定算法的编解码组件。其中 DirectShow 是在 Windows 平台上处理各种媒体格式文件的回放、音视频设备采集等多媒体应用的软件技术 DirectShow 设计初衷就是尽量要把开发人员从复杂的数据传输、硬件差异、同步性等工作中解脱出来,总体应用程序框架和层底工作由 DirectShow 来完成,最终使基于 DirectShow 框架的开发多媒体应用程序变得易于开发。Microsoft DirectX 是微软公司提供的一套在 Windows 平台上为创建游戏和其他高质量的多媒体应用程序而设计的一套底层应用程序接口集。它提供了对二维和三维的图像、声音效果、音乐、输入设以备及网络应用程序的支持。PC 机的成功导致了可用硬件的大量繁衍,众多的供应商为 PC 机设计了提供各种兼容的产品,但它们却常常缺乏开发所需的可靠标准。DirectShow 体系结构方框图如下图 2-1 所示:5图 2-1 DirectShow 体系结构方框图2.2.3 Filter 概述DirectShow 是基于模块化的,每个功能模块都采用 COM 组件方式,称之为Filter(过滤器) 。Filter 是 DirectShow 中最基本的概念。DirectShow 使用 Filter Graph 来管理 Filter。Filter Graph 是 Filter 的“容器” ,Filter 是 Filter Graph 中最小的功能模块。DirectShow 提供了一系列的标准模块用于应用开发,开发者也可以开发自己的功能 Filter来扩展 DirectShow 的应用,是 DirectShow 的开发具有很强的扩展性。Filter 一 般包含一个到多个的 Pin 组成。Pin 接 口本身也是一个 COM 组 件。Filter 与Filter 之间便 是由 Pin 相互连接,从而 构成一条Filter 链路。每个 Filter 上都至少实现了一个 IBaseFilter 的接口。作为 一种 COM 组件,Filter 的 创建是通过API 函数 CoCreateInstance 来完成的:6STDAPI CoCreateInstance(REFCLSID rclsid, /指定需要创建的 Filter 的 CLSIDLPUNKNOWN pUnkOuter,DWORD dwClsContext,REFIID riid,LPVOID *ppv);Filter 具有三个状态:运行,停止,暂停。当一个 Filter 运行时,便处理媒体数据流;停止时,Filter 不再处理数据;而暂停状态通常为运行和停止作为过渡状态。Filter 一般分为下面几种类型:(1)Source Filter(源过滤器):源过滤器把数据引入到 Filter Graph(过滤器图表)中,数据来源可以是文件、网络、摄像头等,而不同的 Source Filter 可以处理不同类型的数据源。(2)Transform Filter(变换过滤器):变换过滤器的工作是获取输入流,处理数据,并产生输出流,其对数据的处理包括编解码、格式转换、压缩解压缩等。(3)Render Filter(提交过滤器):提交过滤器出于过滤器图表中的最后一级,负责接收数据并把数据提交给外设。(4)Splitter Filter(分割过滤器):分割过滤器把输入流分割成多个输出。例如把AVI 格式的字节流分割成视频流和音频流。(5)Mux Filter(混合过滤器):混合过滤器把多个输入组合成一个单独的数据流。例如把视频流和音频流合成为一个 AVi 格式的字节流。Filter 处理的数据流具有各种形式的数据格式,即媒体类型(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;7媒体类型主要由 3 个部分来描述:majortype(主类型,定性地描述媒体类型,如MEDIATYPE_Video 或者 MEDIATYPE_Audio) 、subytype(辅助说明类型,辅助说明主类型,具体指明格式类型)和 formattype(格式细节类型,进一步描述格式细节,包括视频图像大小、帧率、采样频率、量化精度等) 。每个部分都由 GUID 进行标识。第 3 章 视频获取具体实现3.1 CVideoCapture 类CVideoCapture 类中,结合 DirectShow 开发包,封装了系统中对视频流过滤器图表的所有操作。类设计如下:class CCaptureVideo public:int EnumDevices(HWND hList); 8void ConfigCameraPin(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 FreeMediaType(AM_MEDIA_TYPEvoid 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 m_pGrabber; /ISampleGrabber 接口public:CCaptureVideo();CCaptureVideo();protected:bool BindFilter(int deviceId,IBaseFilter *pFilter); /把指定的设备滤波器捆绑到链表中void ResizeVideoWindow(); /更改视频显示窗口HRESULT SetupVideoWindow(); /设置视频显示窗口的特性HRESULT InitCaptureGraphBuilder(); /创建滤波器链表管理器,查询其各种控制接口;#endif / !defined(AFX_CAPTUREVIDEO_H_ED45681A_5410_40B1_9439_ECB1AD042BC8_INC9LUDED_)通过 CVideoCapture 类的对象,可以实现 Filter Graph 的创建,捕捉过滤器 Grabber Filter的捆绑,过滤器之间的连接,以及 Filter Graph 数据流的管理、控制等操作。3.2 视频模块功能的实现3.2.1 视频捕获为了提高系统的稳定性,Windows 操作系统对硬件操作进行了割礼,应用程序一般不能直接访问硬件。而 DirectShow Filter 工作在用户模式,硬件工作在内核模式。为了解决协同工作的问题,DirectShow 把硬件设备设计包装成为 Filter,使之能够工作在用户模式下,其控制方法与普通 Filter 一样,却在内部能够完成与硬件驱动程序的交互,使得DirectShow 应用程序的开发人员能够从为硬件做特殊处理的工作中解脱出来。1、视频捕捉过滤器图表的创建为实现对视频流的捕获,首先需要创建一个捕捉过滤器图表(Capture Filter Graph) 。DirectShow 提供了一个 Capture Graph Builder COM 组件来协助 Capture Filter Graph 的创建。Capture Graph Builder 提供了一个 ICaptureGraphBuilder2 的接口,该接口用于构建和控制Capture Filter Graph。每个 Filter Graph 都由一个 Filter Graph Manager COM 组件来进行管理,该组件暴露了一个 IGraphBuilder 接口,提供了操作管理 Filter Graph 的方法。创建过程如下:首先分别定义两个接口的接口指针:IGraphBuilder *m_pGB; /滤波器链表管理器ICaptureGraphBuilder2 *m_pCapture; /增强型捕获滤波器链表管理器然后创建接口对象,把上述指针分别指向两个接口对象并对 ICaptureGraphBuilder2 接口进行初始化:HRESULT hr ;/创建 IGraphBuilder 接口hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void*)if(FAILED(hr) return hr ;/创建 ICaptureGraphBuilder2 接口hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(void*)if(FAILED(hr) return hr ;10/初始化滤波器链表管理器 IGraphBuilderm_pCapture-SetFiltergraph(m_pGB);至此,Capture Filter Graph 得以创建。接下来要为过滤器图表添加各种 Filter 来完成模块功能。2、系统设备枚举与捕获过滤器的绑定首先,需要为捕获过滤器图表选择一个视频捕捉设备。通常采用系统设备枚举的方法。系统设备枚举器根据不同的种类创建一个枚举器,如音频压缩、视频捕捉等。不同种类的枚举器对于每一种设备返回一个独立的名称(moniker) 。种类枚举器自动将相关的即插即用、演播设备包括进来。使用设备枚举器步骤如下:(1)创建枚举器组件,CLSID 为 CLSID_SystemDeviceEnum(2)通过设备特定的标识符 CLSID 来指定某一类型设备,再通过一个系统函数TUHICreateDevEnum:CreateClassEnumeratorTHU 获取某一种类的枚举器,这个函数返回一个 IEnumMoniker 接口指针,如果该种类的空或者不存在,这个方法就返回 S_FALSE。因此,当你调用这个函数时一定要检查返回值是否为 S_OK,而不要用 SUCCEEDED 宏。指定某一种类型设备,参数 CLSID,通过(3)然后 IEnumMoniker:Next 枚举每一个 moniker。这个方法返回一个 IMoniker 接口指针。(4)要想知道设备的名称,可以通过下面的函数 IMoniker:BindToStorage(5)然后利用 IMoniker:BindToObject 生成绑定道设备上的 filter。调用TUHIFilterGraph:AddFilterTHU 将 filter 添加到 Graph 图中。枚举过程如图 3-1 所示11图 3-1 设备枚举过程创建过程如下(通过调用 BindFilter 成员函数实现):bool CCaptureVideo:BindFilter(int deviceId,IBaseFilter *pFilter)/枚举所有的视频捕获设备ICreateDevEnum *pCreateDevEnum ;/创建设备枚举器 pCreateDevEnum 对象hr=CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void*)if( hr != NOERROR ) return false ;IEnumMoniker *pEm;/创建视频输入设备类枚举器hr=pCreateDevEnum-CreateClassEnumerator(CLSID_VideoInputDeviceCategory,if( hr != NOERROR ) return false ;pEm-Reset(); /复位该设备ULONG cFetched;IMoniker *pM;int index = 0 ;/获取设备while( hr = pEm-Next(1,if(SUCCEEDED(hr)VARIANT var ;var.vt = VT_BSTR; /保存的是二进制的数据hr = pBag-Read(L“FriendlyName“, /获取 FriendlyName 形式的信息if( hr = NOERROR )12/采集设备与捕获滤波器捆绑if( index = deviceId ) pM-BindToObject(0,0,IID_IBaseFilter,(void*)pFilter);SysFreeString(var.bstrVal); /释放二进制数据资源pBag -Release();pM-Release();index+;3、过 滤器 在过 滤器 图表 中的 连接Filter 的连接实际上就是过滤器上 Pin 的连接。连接的方向一般上总是由上一级 Filter 的输出 Pin 指向下一级 Filter 的输入 Pin。Pin 的连接实际上是连接双方使用的媒体类型的一个“协商”过程。Pin 作为一个 COM 组件,在每个 Pin 上都实现的 IPin 接口。Pin 正式通过这个 IPin 接口来完成连接的。一般通过调用接口方法IFilterGraph: ConnectDirect、IGraphBuilder : Connect、IGraphBuilder:Render 或者IGraphBuilder:RenderFile、以及 ICaptureGraphBuilder2:RenderStream 来实现。连接过程如下图 3-2 所示:13图 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,NULL,A,NULL,C);假如第三个参数设置为 NULL,则该方法自动为过滤器图表设置一个提交过滤器(Render Filter),并自动根据数据流类型设置为 Video Render 或者 DirectSound Render。另外,在连接过滤器之前,需要把过滤器添加到过滤器图表中,才能把过滤器连接到图表中。把过滤器添加到过滤器图表中可以通过调用过滤器图表管理器暴露的 IGraphBuilder接口提供的 IGraphBuilder:AddFilter 函数来实现。如把捕捉源过滤器添加到过滤器图表,为:hr = m_pGB-AddFilter(m_pBF,L“Capture Filter“);添加完成后,便可以进行过滤器的连接:hr=m_pCapture-RenderStream(if(FAILED(hr)AfxMessageBox(_T(“Cant build the graph“);return hr ;4、视频的保存和预览视频捕捉过滤器一般都有两个或者多个输出 Pin,它们输出的媒体类型都一样,如预览 Pin和捕捉 Pin。可以根据 Pin 的功能来区别每个 Pin,每个 Pin 都有一个 GUID,成为 Pin 的种类。预览 Pin 用于将视频流显示在屏幕上,捕捉 Pin 啧用来将视频流写入文件中。本设计中,实现了对视频的实时预览和保存,因此需要用到预览 Pin 和捕捉 Pin。当需要预览视频的时候,则在过滤器连接到过滤器图表的函数调用中,指定连接接口为预览 Pin:RenderStream(14其中第一个参数指明了所连接的输出 Pin 为预览 Pin,第二个参数则指明媒体类型为视频流媒体类 型。最后一个参数为NULL,如 上面所说,该函数自动为过滤器 图表添加连接一个Video Render 提交过滤器。当需要保 存视频的时候,同理,在连接函数调用中,指定连接接口为捕捉 Pin:IBaseFilter *pMux;hr = pBuild-SetOutputFileName(/ (Optional) Receives a pointer to the file sink.RenderStream(其中第一个参数指明了所连接的输出 Pin 为捕捉 Pin,最后一个参数指明另一个过滤器AVI Mux Filter。该过滤器把从捕捉 Pin 接口输出的视频流打包转为 AVI 格式的数据流。SetOutputFileName 函数根据第一个参数 usuo 指定的媒体主格式产生一个多路过滤器,如上的 AVI,产生 AVI_MAX_FILTER,然后把该过滤器加入到过滤器图表中(这里则可以省去 AddFilter 函数的调用)然后把该过滤器的 IBaseFilter 接口指针赋给 pMux。如果该过滤器支持 IFileSinkFilter 接口,则调用 IFileSinkFilter:SetFileName 来设置保存文件名,否则本函数另外创建一个 FileWriterFilter 过滤器到过滤器图表中,如果第四个参数不为NULL,则返回 FileWriterFilter 的接口指针给该参数。如下图 3-3 所示15图 3-3 视频捕捉过滤器链表无论是预览还是视频保存,都需要在系统界面上提供一个窗口播放采集的视频信息。本设计中,在界面上创建一个 pictrue 控件来作为视频播放窗口。首先在 CCaptureVideo 类中定义一个窗口句柄,用于保存视频显示窗口句柄:HWND m_hWnd; /视频显示窗口的句柄然后把创建的 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); /视频窗口不可见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、视频流的控制视频预览和保存设置成功后,需要对视频流进行开始、停止等操作。这就需要用到过滤器图表管理器为我们提供的控制接口:IMediaControl 。首先在 CVideoCapture 类中定义一个接口指针:IMediaControl *m_pMC; /媒体控制接口然后查询过滤器图表管理器的 IMediaControl 接口,并把地址赋给 m_pMC:hr = m_pGB-QueryInterface(IID_IMediaControl,(void*)这样便可以通过调用 IMediaControl 提供的函数对过滤器图表中的数据流进行操作:数据开始传输:m_pMC-Run();16数据传输停止:m_pMC-Stop();3.2.2 单帧图像的实时抓取本设计中的火焰高度检测,是基于 BMP 位图的图像处理,而捕获的数据形式为视频格式。由于视频流实际上由一帧帧的图像构成的,所以通过对数据单样本的截取保存,可以实现对单帧图像的实时抓取,为火焰高度的分析提供相应的 BMP 位图文件。1、Filter 中数据的传送每个 Pin 上都实现了 IPin 接口,但这个接口主要用于 Pin 的连接,而非数据传送。数据的传送一般是在输入 Pin 上实现的 IMemInputPin 接口。Filter 之间是以 Sample 的形式来传送数据的。Sample 是一个封装了一定大小数据内存的 COM 组件。这个组件引出了IMediaSample 接口。而 Sample 则由内存分配器(alloctor)的 COM 对象来创建。每个allocator 都要创建一个 Sample 池,并且给每个 Sample 分配一个内存 Buffer,每当一个Filter 需要一个 Buffer 来填充数据,它就通过 allocator 的函数 IMemAllocator:GetBuffer 来获得一个 Sample。如果分配器正好有空闲的 Sample,GetBuffer 立即返回一个指向该Sample 的指针。如果没有空闲 Sample,该方法则阻塞直到有空闲 Sample 出现位置。当该函数返回一个 Sample 指针时,过滤器就将数据填充到 Buffer 中,设置好标识,然后将Sample 传递给下一个过滤器。为了在过滤器图表中传递媒体数据,DirectShow 过滤器需要支持一些协议,称之为传输协议。连接的过滤器必须支持同样的传输协议,否则不能交换媒体数据。2、过滤器图表中的事件通知机制当某个事件发生时,比如数据流结束、或者产生一个错误等,过滤器会给过滤器图表管理器发送一个事件通知。过滤器图表管理器可以处理其中一部分时间,把另一部分交给应用程序来处理。如果管理器没有处理某个事件,它就把事件通知放到一个队列中,图表管理器也可以把它本身的事件通知放进队列中。通过这种方式,图表管理器和应用程序之间的相互通信得以实现。为了处理事件,应用程序需要一种机制来获取正在队列中等待的时间。过滤器图表管理器提供了两种方法:(1)窗口通知:图表管理器发送开发者自己定义的窗口消息;(2)事件信号:如果队列中有管理器事件,就用事件信号通知应用程序,如果队列为空就重新设置事件信号。3、图像抓取的实现在媒体文件播放或者捕获过程中,抓取当前播放位置的图像的方法有很多种。最为简单的是通过调用过滤器图表管理器暴露的 IBasicVideo 接口提供的IBasicVideo:GetCurrentImage 接口函数。但是如果 Video Render 使用了 Direct Draw 加速,17这个函数的调用会失败,并且调用过程中 Video Render 必须处于暂停状态,所以本方法具有较大限制。在本设计中,采用了 Sample Grabber Filter 所提供的方法来实现图像的抓取。 Sample 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*)if (FAILED(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*)(3)设置 Sample Grabber Filter 连接 Pin 上使用的媒体类型,本设计中使用 24 位 RGB 图像,实现方法如下:AM_MEDIA_TYPE mt;ZeroMemory(mt.majortype = MEDIATYPE_Video;mt.subtype = MEDIASUBTYPE_RGB24;hr = pGrabber-SetMediaType((4)完成格式设置后,便可以把 Sample Grabber 过滤器与视频捕捉过滤器连接起来/把 Grabber 滤波器与 Capture 滤波器链接hr=m_pCapture-RenderStream((5)图像的抓取。在图像抓取中,本设计定义了一个继承 ISampleGrabber 接口的类18CSampleGrabberCB。在该类中,设置了 Sample Grabber 的工作模式及其回调函数,并在回调函数中实现对 BMP 位图文件的保存。其工作模式包括两个方面:缓冲模式和回调模式。缓冲模式中,过滤器将输入的 Sample 进行缓存后,再往下传送;而在回调模式中,当有输入的 Sample 时,过滤器将调用设置的回调函数。本设计中采用了回调模式。hr = m_pGrabber-SetBufferSamples( FALSE );hr = m_pGrabber-SetOneShot( FALSE );hr = m_pGrabber-SetCallback( 回调函数的设置:STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )if( !bOneShot )return 0;if (!pBuffer)return E_POINTER;strcpy(m_szFileName, szFileName);SaveBitmap(pBuffer, lBufferSize);bOneShot = FALSE;return 0;/创建位图文件BOOL Sa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学机电数学考试题库及答案
- 厨师实操模拟考试题及答案
- 初三对联考试题及答案
- 出国签证口语模拟考试题及答案
- 播音主持一级考试题材及答案
- 经济新常态视角下保险资金运用中存在的问题研究
- 中国高尿酸血症与痛风诊疗指南(2024年)
- 拜城农民考试题及答案
- 儿童心脏病的筛查与诊断方法
- 高级教学课件展示
- 人教版(2023版)初中语文九年级上册全册同步练习+单元综合训练+专项训练+期中期未测试合集(含答案)【可编辑可打印】
- 电磁兼容中抗扰度试验教学课件
- 中国邮政储蓄银行理财考试真题模拟汇编(共719题)
- 医务科岗前培训
- 市政雨污水管道清污清淤工程地下有限空间作业专项方案2020年10月10
- GB/T 8685-2008纺织品维护标签规范符号法
- 医疗器械行业市场部人员岗位职责
- 旅行社导游带团操作流程
- 部编版小学道德与法治三年级下册期末质量检测试卷【含答案】5套
- 怎样当好一名师长
- DB21T 3354-2020 辽宁省绿色建筑设计标准
评论
0/150
提交评论