




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
III基于VFW技术的视频采集程序设计摘 要本文针对厂家在生产活动中对视频采集的需要,设计了一个摄像头的视频采集程序。设计采用了VFW技术来实现视频采集, VFW是Microsoft公司开发的关于数字视频的一个软件包,通过VFW技术能把模拟视频转化为数字信号并进行播放。该视频采集程序设计的特点有:利用Visual C+作为开发平台,Visual C+软件平台可以对VFW技术完美支持且可以实现可视化编程,使设计结果便于观察和参数便于更改等;通过枚举方式将所有可用的视频采集硬件设备以列表形式显示出来供用户进行选择,并根据不同视频采集硬件设备的驱动能力对视频进行相应的设置以达到较好的采集效果。经过实验证明,该基于VFW技术的视频采集程序设计方案是切实可行的。该程序不仅可以实现同视频采集设备进行良好的连接、获取其驱动的性能,还实现了对视频的采集、设置以及保存等功能且性能稳定。关键词:VFW,视频采集,实时预览,图像采集Design of Video Capture Program Based on VFW TechnologyABSTRACTThis paper manufacturers the situation that need to video capture in the production designed a camera video capture program.The Design of video capture program used the VFW technology to achieve. VFW is a Microsoft developed a software package on digital video, analog video via VFW technology can converted into digital signals and play. The features of the design of video capture program are: the use of Visual C + + as a development platform, Visual C + + software platform can VFW technical perfect support and can achieve visual programming, the design results are easy to observe and parameters to facilitate change and so on; by enumerating the ways all of the available video capture hardware device to display a list for the user to choose, and according to different video capture hardware video driver the ability to make the appropriate settings to achieve better collection results. The experiments show that the design of the video capture program based on VFW technique is feasible. The program not only enables video capture devices with good connections to get their driving performance, but also realize the video collection, settings, and save functions and stable performance.KEY WORDS:VFW,video capture,live preview,picture capture目 录摘 要IABSTRACTII1 绪论11.1 课题意义11.2 国内外发展现状及发展趋势12 系统的总体设计32.1 设计任务32.2 系统设计思路与平台选择32.2.1 统设计思路42.2.2 统设计平台选择42.3 系统设计的方法42.4 VFW简介52.4.1 VFW的结构组成62.4.2 AVIcap窗口类的基本功能72.4.3 AVIcap在显示视频的两种模式82.4.4 AVIcap窗口类中常用的结构82.4.5 AVIcap中的回调机制93 系统设计的实现103.1系统流程图103.2 操作主窗口和采集窗的程序设计103.2.1操作主窗口程序设计113.2.2视频采集窗口程序设计123.3 视频采集的设置143.3.1 采集驱动程序143.3.2 视频采集设置对话框153.3.3 视频预览模式173.3.4 视/音频格式183.4 视频采集操作的设置193.4.1 修改采集频率193.4.2 设定用于结束采集过程的鼠标或者键盘控制203.4.3 设置采集时间203.4.4 采集窗口的状态203.5 采集文件的保存213.5.1 把采集数据保存为一个新的文件213.5.2 为采集文件分配磁盘空间223.5.3 视频缓冲233.5.4 加入一个信息块233.6 回调函数简介233.6.1 把回调函数加入一个应用程序233.6.2 构造回调函数244 程序运行结果275 总结30致 谢31参考文献32附录3339基于VFW技术的视频采集程序设计1 绪论1.1 课题意义 近年来,随着通信技术与多媒体技术的飞速发展,越来越多的应用不仅要求传输与处理事先存储下来的图象数据,还要求应用系统能够实时获取通信对方的活动图象信息,如可视电话系统,桌面视频会议系统,人体识别系统,运动检测系统,交通安全监控系统等的多媒体应用中。因此如何实时获取数字视频数据就成为该类应用中的重要环节和关键前提1。同时随着计算机运算、处理性能的飞速发展,原来许多需要专用硬件设备才能实现的技术,现在已经完全可以利用 CPU 的高性能通过软件来实现。例如现在的 PSTN 可视电话系统已经完全可以通过 PC 机用软件方案实现。在其软件实现方案中, Windows 环境下的实时视频采集就成为系统实现的重要前提。视频采集是将视频或者音频信号数字化,然后存储或者实时处理的过程。在远程视频监控、桌面视频会议、可视电话等多媒体应用中,获得数字视频都是一个关键的前提2。Microsoft公司提供了两种视频捕获的技术方案:VFW(video for windows)与DirectShow,在不能使用com技术的环境下,VFW还是必然的选择,同时VFW支持软件平台小,节省系统硬件,运行稳定可靠,此外VFW的核心是AVI文件标准,AVI(Audio Video Interleave)文件中的音、视频数据帧交错存放,围绕AVI文件,VFW推出了一整套完整的视频采集、压缩、解压缩、回放和编辑的应用程序接口(API)。VFW为AVI文件提供了丰富的处理函数和宏定义,AVI文件的特点在于它是典型的数据流文件,它由视频流、音频流、文本流组成。所以对AVI文件的处理主要是处理文件流。由于AVI文件格式推出较早且在数字视频技术中有广泛的应用,所以VFW仍然有很大的实用价值,而且进一步发展的趋势。因此基于VFW技术的视频采集正在被广泛地应用。随着现代化和信息化建设的进一步深化,基于VFW的视频采集技术必将在各行业领域作出更大的贡献,促进和推动国家的现代化事业。1.2 国内外发展现状及发展趋势在VFW出现之前,捕获数字视频是一项极其复杂的工作。Microsoft 的Visual C+自从4.0版就开始支持VFW,这给视频捕获编程带来了很大的方便。此后Visual C+的版本不断更新,VFW的功能也随之日趋完善,一度成为视频采集开发工具的首选3。国外在此技术的开发与应用上起步较早,取得了显著的成就,如视频会议的产生,就是得益于此技术而迅速发展起来的,此外,在医疗领域,次技术也使得远程手术成为可能,使患者免于因为看病而四处奔波之苦。国内在此技术领域也发展迅速,取得了一系列的显著成果,例如在农产品的生产控制与采集领域中:国内设计、开发了采用VFW方法进行实时采集系统的西红柿采摘机器人的双目立体视觉系统,这为机器人自动化采摘作业提供条件。利用VFW视频采集技术采集鸡蛋图像,然后由模式识别,判别出被检蛋品质等级等。再如在人体各部分的识别领域中:使用VFW技术进行图像采集,并使用基于肤色的算法来实现人脸区域的检测;基于VFW的滚动按捺指纹拼接系统;特别值得一提的是我国自主创新发明的掌脉识别系统,是目前唯一一种可以检测是否为活体的人体识别技术,具有国际领先水平,也可也以应用VFW技术来采集人体的掌脉信息。除此之外,国内基于VFW的视频采集技术的视频会议也发展迅速,在医疗方面实现对远程专家会诊系统中病人客户端音频、视频数据的采集和记录,通过实时传输,辅助医生进行诊断分析该系统能够实现对远程专家会诊系统中病人客户端音频、视频数据的采集和记录,通过实时传输,辅助医生进行诊断分析等4。近些年来,凡事需要图像视频信息的系统中如交通安全系统中的图像视频采集、各种工程控制和环境监测中的信息采集系统中的视频信息采集、可视电话等等都能看到VFW技术的身影或者可以通过VFW技术实现。2 系统的总体设计2.1 设计任务根据设计任务书的要求,我的设计任务就是结合学过的关于信号处理和程序设计等知识,开发一个摄像头的视频采集程序。通过VFW技术能把模拟视频转换为数字信号并进行播放。设计任务主要包括了对VFW技术的掌握和图像采集设备对图像信息的处理编辑等功能的设计。因此,我的设计目标就是在一个适当的软件平台下利用Microsoft公司提供的VFW工具包实现对视频源的识别、连接,并进行实时预览,当用户按下视频采集按键时进行视频采集,当结束采集键被按下是结束视频采集并将采集到的视频文件进行保存,当图像捕获键按下时,对视频进行单帧采集。根据以上设计目标,结合相关参考文献,提出自己的设计方案。2.2 系统设计思路与平台选择2.2.1 统设计思路 视频程序可采用MCI(Media Control Interface)或VFW(Video for Windows)开发,它们之间的关系如图2-1所示。 图 2-1 VFW和MCI的关系图MCI为用户提供了高层开发手段,开发人员在开发过程中不需要考虑硬件设备细节只需将其当做MCI设备直接操作即可。但在使用MCI开发程序时,对于媒体设备的操作局限在文件级别上,如视频所对应的AVI文件、音频所对应的WAV文件以及MIDI所对应的MID等,而这对于视频采集绝大多数情况是不合适的,而VFW与MCI一样提供硬件无关性,并具有更大的灵活性5。本系统可以在一个适当的软件平台上先创建一个人机交互的操作对话窗口,在这个窗口内添加相应的操作按钮以及用于创建视频采集子窗口的区域,然后可以用VFW中相应的函数创建一个视频采集窗口,这些都完成后,设计将视频采集的硬件设备同本程序连接起来的程序然后对获取的视频源进行相应的采集和处理操作。当用户采集完成时要能将采集到的信息进行保存,同时断开同硬件设备的连接完成整个人机交互的视频采集过程。2.2.2 系统设计平台选择下面来讨论一下系统设计平台的选择,从上面已经得知,Visual C+4.0已经开始支持VFW,但是Visual C+并不是唯一支持VFW的开发工具,此外,也可以用Delphi、Visual Basic来去进行视频捕获的开发。至于利用Direct Show进行视频采集,也存在着类似的情况。不过综合各种因素,本毕业设计选用了C+语言作为程序语言,采用Visual C+作为开发工具,事实上,也理应选用Visual C+作为开发工具,这主要是基于以下的考虑:(1)C+语言作为目前最流行的语言,具有强大的功能,简洁的形式以及丰富的编程思想。(2)Visual C+在数字图象处理和视频捕获上,具有得天独厚的优势。比起目前比较流行的Delphi、Java开发平台来说,由于多年来的积累,它能够提供强大的支持视频捕获功能的接口,同时在进行其他处理和操作上也非常方便。而且相对而言,它能够取得更快的处理速度,而这,对于对实时性要求非常严格的图象处理和视频应用来说,无疑是Visual C+最大的优势6。(3)DirectShow主要应用于C+开发,这更是一个不容忽视的重要原因。 当使用Microsoft Visual Basic时, 可以访问一个 DirectShow API的大子集, 但是其对Visual Basic的支持并不完全。如果使用Microsoft JScript或Visual Basic脚本语言,DirectShow 只能支持基于脚本的 DVD 应用程序。而Direct Show虽然对Borland Delphi也同样支持,但是在具体的应用上往往缺乏相应的技术支持文档而使得开发举步维艰。(4)无论是VFW,还是Direct Show,抑或Visual C+,Windows PC系统,都是微软的产品,出于兼容性和稳定性的考虑,也理应选用Visual C+。2.3 系统设计的方法 通过查阅大量资料和自己的思考,本系统将采用VFW软件包在Visual C+6.0软件平台下使用AVIcap窗口类提供的关于视频采集的大量函数进行设计。由于本系统可以分成几个部分,因此可将系统分为以下几块分别进行设计,然后最后再统一整合调试。包括需要创建一个便于用户操作主窗口,一个启动时生成的视频采集窗口,还有视频实时预览的程序设计设计、视频和图像采集的程序设计以及对采集到的视频进行相关处理等操作的程序设计等。2.4 VFW简介在桌面视频会议、可视电话等多媒体应用之中,获得数字视频是一个关键的前提。在Video for Windows(VFW)出现之前,采集数字视频是一项极其复杂的工作。VFW是Microsoft公司在1992年推出的关于数字视频的一个软件包,它能够灵活地实现从模拟视频源采集数字视频信号,并将其存储到文件中或直接对视频缓存进行处理。VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩7。于是,它引进了AVI文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW给程序员提供.VBX和AVIcap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。VFW的出现给视频采集编程带来了很大的方便。现在用户不必专门安装VFW了,Windows95本身包括了Video for Windows1.1,当用户在安装Windows操作系统时,安装程序会自动安装配置视频所需的组件,如设备驱动程序、视频压缩程序等。VFW主要包括vfw.h头文件和vfw32.lib函数库。2.4.1 VFW的结构组成VFW主要由以下6个模块组成。(1)AVICAP.DLL:包含了执行视频捕获的函数,它给AVI文件I/O和视频、音频设备驱动提供一个高级接口;(2)MSVIDEO.DLL:用一套特殊的DrawDib函数来处理屏幕上的视频操作;(3)MCIAVI.DRV:此驱动程序包括对VFW的MCI命令的解释器;(4)AVIFILE.DLL:支持有标准多媒体I/O(MMIO)函数提供的更高的命令来访问.AVI文件;(5)压缩管理器(ICM):管理用于视频压缩-解压缩的编解码器(CODEC);(6)音频压缩管理器ACM:提供与ICM相似的服务,不同的是它适用于波形音频。 这几个模块之间的联系与合作关系如图2-2所示。 图 2-2 VFW各模块间联系图 VFW 主要是由一系列动态链接库(DLL) 和驱动程序模块组成。其中,AVICap.DLL 包含了执行视频捕获的函数,它给AVI 文件I/O 和视频、音频设备驱动程序提供一个高级接口; ICM管理用于视频压缩和解压缩的CODEC( 编解码器) ; ACM提供的服务与ICM的比较类似, 不过它的适用对象是波形音频;MCIAVI.DRV 为驱动程序, 完成对VFW 中MCI 命令的解释;MSVIDEO.DLL 用一套DrawDib 函数来处理监控屏幕上的视频操作。通过以上几个模块的相互协调合作, 可以比较方便和灵活的完成对视频流的捕获、操作和管理。特别是AVICap.DLL 中提供了功能强大、简单易行的窗口类AVICap。下面就以比较详细的介绍一下AVICap 类在视频采集方面的应用。2.4.2 AVIcap窗口类由于VFW函数可以方便地实现视频、音频数据流到AVI文件的存储,在Visual C+中也将Video for Windows函数称为AVIcap窗口类函数。通过使用AVIcap窗口类函数,可以在应用中方便地继承视频采集功能。AVIcap为应用提供了一个访问视频采集硬件简便的、基于消息的界面,使之能够访问视频和波形音频硬件,并且能够控制视频流数据存储到磁盘的过程8。这些接口函数, 是高级的, 经过了优化的, 我们利用它们来创建自己的应用程序具有较大的灵活性。表2-1列出了VFW 中视频采集编程常用的一些AVIcap窗口类函数和宏。表 2-1 视频采集常用到的VFW函数和宏VFW函数和宏功能描述消息capCreatCaptureWindow创建捕获窗口capDriverConnect连接窗口与驱动器WM_CAP_DRIVER_CONNECTcapDriverDisconnect断开窗口与驱动器的连接WM_CAP_DRIVER_DISCONNECTcapDiverGetCaps得到驱动器的性能WM_CAP_DRIVER_GET_CAPScapGetStatus得到捕获窗口的状态WM_CAP_GET_STATUScapPreviewRate设置预视帧率WM_CAP_SET_PREVIEWRATEcapPreview设置为预览模式WM_CAP_SET_PREVIEWcapOverlay设置为叠加模式WM_CAP_SET_OVERLAYcapDlgVideoFormat设置格式对话框WM_CAP_DLG_VIDEOFORMATcapDlgVideoSource设置视频源对话框WM_CAP_DLG_VIDEOSOURCEcapDlgVideoCompression设置压缩对话框WM_CAP_DLG_VIDEOCOMPRESSIONcapCaptureGetSetup得到设置参数WM_CAP_GET_SEQUENCE_SETUPcapCaptureSetSetup设置参数WM_CAP_SET_SEQUENCE_SETUPcapFileSetCaptureFile设置捕捉文件WM_CAP_FILE_SET_CAPTURE_FILEcapCaptureSequence捕捉到文件WM_CAP_SEQUENCEcapCaptureStop停止捕捉WM_CAP_STOPcapGrabFrameNoStop截取当前图像WM_CAP_GRAB_FRAME_NOSTOPcapEditCopy把图像考入剪贴板WM_CAP_EDIT_COPY2.4.3 AVIcap窗口类的基本功能AVIcap窗口类是完成由视频捕获硬件获取数据,并按照需要的格式进行存储、转换的重要手段,它提供的主要功能包括如下。(1)动态地同视频和音频输入器连接或断开;(2)设置视频捕获速率;(3)提供设置视频源,视频格式以及是否采用视频压缩的对话框;(4)设置视频采集的显示模式为叠加(Overlay)或者预览(PreView)模式;(5)实时获取每一帧数字视频数据;(6)将一视频流和音频流捕获并保存到一个AVI文件中;(7)按用户要求捕获某一帧数字的视频数据,并将单帧图像以DIB格式文件保存;(8)创建,保存或载入RGB格式下的调色板;(9)将捕获图像和相关的调色板拷贝到剪切板;(10)指定捕获数据的文件名,并能够将捕获的内容拷贝到另一个文件。微软公司的AVI文件格式是一种有RWF指定的应用程序,用来对音频视频流进行捕捉、编辑和播放的文件格式,并已成为视频图像的Windows系统标准。AVI文件包含不同类型的多重数据流。大多数AVI文件里都包含有音频和视频流。有些简单的AVI文件可能只包含视频流,而有些更为特殊的AVI文件可能只包括一个控制道或MIDI道作为一个附加的数据流9。本文要介绍的是同时包含音频和视频数据的。AVI文件。AVIRIFF的文件结构如下:RIFF(AVI LIST(hdrlavih()/主AVI 信息头数据LIST (strlstrh()/流的头信息数据strf()/流的格式信息数据strd(Aditional Header Data)/可选的额外的头信息数据strn(Optional Stream Name)/可选的流的名字)LI ST (moviSubChunk |LIST(recSubChunklSubChunk2) )idxl(AVIIndex)/可选的AVI索引数据块)LIST块和索引数据块是RIFF“AVI”数据块的子数据块。LIST“hdrl”数据快定义了数据格式,LIST“movi”数据块包含了AVI流的数据,LIST“idxl”数据块是可选择的数据块。AVI文件须对以上三个分量以适当的顺序保存10。在AVI文件的主首部结构MainAVIHeader中,有几个重要的成员变量定义如下:(1)dwMicroSecPerForm:指定视频流的两个帧之间的间隔;(2)dwMaxBytePerSec :指定文件的最大传输速率,该数值指出了系统为了显示AVI流每秒钟必须处理的字节数;(3)dwTotalFrames:指定文件里的数据帧总数;(4)dwStreams:指定文件中的流的数目,本文中同时有音频和视频流,所以该变量的值为2;(5)dwSuggestedBufferSize:为读取文件指定缓冲区的大小。该值应包含文件的最大数据块。如果设定为0或太小,播放软件必须在播放期间重新分配内存,从而影响播放性能。(6)dwWidth和dwHeight:指定AVI文件的画面的宽度和高度,以像素为单位;(7)dwStart和dwLength:指定AVI文件的开始时间和文件总长度。dwStart通常设置为0。 限于篇幅,对于AVI文件的其他数据结构不在此详述,读者可参考MSDN联机文档。2.4.4 AVIcap在显示视频的两种模式AVIcap在显示视频时提供两种模式。Preview和Overlay。在预览模式中,视频帧先从视频捕获卡传到系统内存,接着采用GDI函数在捕获窗口中显示,要占用CPU资源,该显示模式所支持的视频采集格式为RGB格式。通过capPreview宏实现。叠加模式中视频捕获将VGA卡的输出信号和自身的输出信号叠加后形成组合信号显示在计算机监视器上,不需占用CPU资源,该显示模式所支持的视频采集格式为YUV格式。通过capOverlay宏完成。叠加模式速度较预览模式快,但如果需要在视频显示前对视频信号进行处理,则必须使用预览模式11。Preview模式和Overlay模式都只是用以显示。与采集的过程并无多大关系。它重要应用于采集帧的本地回显。2.4.5 AVIcap窗口类中常用的结构 在AVI擦破窗口类中有4中常用的结构。(1)CAPSTATUS:定义了捕捉窗口的当前状态,如:以象素为单位表示图像的高、宽、预览和重叠方式的标志量,尺寸缩放的标志量等。因为捕捉窗口的状态随各种各样的消息而改变,所以当应用程序需要功能菜单项,决定捕捉窗口的真实状态或者调用视频格式对话框时,都应该更新这一结构中的信息。(2)CAPDRIVERCAPS: 定义了视频捕捉驱动程序的功能,如:驱动程序的数目索引是否支持视频叠加功能等。当应用程序将捕捉窗口与视频捕捉驱动 程序相连接时,应该发送消息WM_CAP_DREVER_GET_CAPS或者调用宏capDriverGetCaps将驱动程序的功能拷贝一份到该结构中。(3)CAPTUREPARMS:包括控制视频流捕捉过程的参数,这一结构被用来得到和设置影响捕捉速率、捕捉时的缓冲区数目、以及捕捉如何结束时的参数。(4)VIDEOHDR:定义了视频数据块的头信息,其数据成员lpData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小),我们在编写回调函数时常用到。 其中前3钟结构都有相应的函数来设置和获得结构包含的信息。2.4.6 AVIcap中的回调机制如果准备对采集的数据进行实时处理就用到AVIcap中的回调函数。回调函数是一类特殊的函数,功能类似于中断函数。其调用过程由系统完成,而回调函数的具体内容则由用户自己设定。在系统中当某一回调函数被设定后,在某一特定的雕件满足时,系统自动调用该回调函数12。在AVIcap窗口类中的回调函数主要包括状态回调、错误回调和视频回调等,其中前两种比较简单,我们对视频回调做详细说明。视频回调包括单帧回调和视频流回调两种,该类函数在使用之前需要先由用户设定函数的内容,然后分别以capSetCallbackOnFrame和capSetCallbackOnVideoStream宏函数将其注册到系统中,判断调用条件是否满足以及对该函数的调用则都由系统自动完成,不需要显示调用命令。(1)capSetCallbackOnFrame(hwnd,fpFrameProc),注册单帧回调函数,它只要一启动视频捕获,一帧结束就立刻产生回调动作,而究竟是哪一个回调函数响应,就由登记在设置宏函数中的fpPro参数来决定。它是一帧一帧地再同一个缓冲区内进行刷新的,即每帧数据的首地址不变。自然开发者可借助这一特点来编写图像处理程序,但不能过长,否则视频显示不流畅。另外,回调函数要提前定义,即在程序的头部进行定义。(2)capSetCallbackOnVideoStream(hwnd,fpVideoProc),与上面不同的是它要和capCaptureSequenceNoFile(hwnd)或capCaptureSequence(hwnd)配合使用,只有当其中的一个被执行后,回调动作才会产生。它同样是一帧结束便产生回调,但每次数据都追加在上一阵数据的后面,知道所分配的数据缓冲区用完为止(即缓冲区无效)。同样,开发者可按照这一特点来编程。3 系统设计的实现3.1 系统流程图图 3-1 系统流程图3.2 操作主窗口和采集窗的程序设计操作主窗口和视频采集窗口的关系是父窗口和子窗口的关系,即采集窗是主窗口的一个子窗口,它们之间的信息传递是通过交互来完成的,对于父窗口和子窗口的交互,一些系统级消息,如WM_PALETTECHANGED和WM_QUERYNEWPALETTE,只会发送到最上层的窗口。如果一个捕捉窗口是某个窗口的子窗口,那么它的父窗口就必须对该消息进行接力传递。同样,如果父窗口改变了大小,它也因该发送通知性的消息给捕捉窗口。反过来,如果被捕捉的视频大小改变了,捕捉窗口也要发送通知性消息给它的父窗口。实现这一交互的最简单的方法就是保持捕捉窗口和父窗口相同大小,每当两者之一改变时,都通知对方。3.2.1 操作主窗口程序设计视频采集的主窗口是整个系统的主要操作界面,它的本质是一个人机交互的对话框,因此,对于它的设计要简洁大方,使操作人员能够一目了然,便于用户的操作。在Visual C+6.0软件平台下,软件为应用程序提供了3个类型的模板,如图3-2:图 3-2 应用程序的三个类型在创建视频采集操作主窗口时,我们既可以采用Visual C+6.0中提供的MFC应用程序向导来创建一个基本对话框然后根据自己的设计进行修改,也可以直接使用C+语言进行编写添加标准控件13。如创建一个主窗口可以用CreateWindow宏(或WM_CREATE消息)来创建窗口并对其样式进行设置,通过button按钮类来创建按钮例如窗口的关闭按钮、最小化按钮以及控制按钮等。本设计采用的是利用MFC应用程序向导创建了一个基本对话框,然有手动添加了所需的按钮。图3-3为一个创建好的主窗口:图 3-3 操作的主窗口3.2.2 视频采集窗口程序设计采集窗口概念上和按钮、列表框和滚动条等标准控件是一样的。通常把采集窗口设置为WS_CHILD和WS_VISIBLE样式。创建一个AVIcap采集窗口,可以用capCreateCaptureWindow函数创建一个AVIcap窗口类的捕捉窗口。这个函数返回一个窗口句柄,这个句柄用来识别这个窗口,以便后面应用程序向它发送消息。可以在一个应用程序中创建多个采集窗口并且把它们连接到不同的捕捉设备。下面这个例子使用capCreateCaptureWindow函数创建一个捕捉窗口。HWND VFWAPI capCreateCaptureWindow( LPCSTR lpszWindowName,/ 捕捉窗口名字 DWORD dwStyle,/ 捕捉窗口的风格 int x,/ 窗口左上角x轴坐标 int y,/ 窗口左上角y轴坐标 int nWidth,/ 窗口的宽度 int nHeight,/ 窗口的高度 HWND HWnd,/ 父窗口句柄 Int nID / 捕捉窗口的ID号);如果该函数调用成功 则函数返回窗口的句柄 否则函数返回NULL。运行程序后将会在主窗口的空白区域创建一个视频采集窗口。但此时的采集窗只是一个黑色的方块,没有任何信息,如需进行视频采集还需该窗口和视频采集的硬件设备进行连接。把视频采集窗口连接到一个采集设备上,要求可以动态地把一个采集窗口和一个采集设备进行连接或者断开连接。连接可以用WM_CAP_DRIVER_CONNECT消息(或者capDriverConnect宏)来实现。当两者连接起来以后,就可以通过向捕捉窗口发送消息来向对应的捕捉设备发送设备相关的消息了。下面这个例子演示了采集窗口通过句柄hWndC和MSVIDEO驱动器进行连接然后用capDriverDisconnect宏断开连接。 fOK=SendMessage(hWndC,WM_CAP_DRIVER_CONNECT,0,0L);/建立连接 /进行捕捉的代码capDriverDisconnect(hWndC);/断开连接可以用capGetDriverDescription函数来得到机器上所安装的捕捉驱动程序的名字和版本号。应用程序中通常用这个方法来枚举出安装过的所有设备和驱动程序,以便用户可以从中选择一个来和捕捉窗口连接。可以用WM_CAP_DRIVER_GET_NAME消息(或者capDriverGetName宏)来得到已连接到某个捕捉窗口的捕捉设备驱动程序的名字。而要得到它的版本号,就要用WM_CAP_DRIVER_GET_VERSION消息(capDriverGetVersion宏)了。可以用WM_CAP_DRIVER_DISCONNECT消息(或者capDriverDisconnect宏)来断开捕捉驱动器和捕捉窗口之间的连接。下例展示了用capGetDriverDescription函数来得到已经安装的采集驱动器的名字和版本号。 char szDeviceName80; char szDeviceVersion80; for (wIndex = 0;wIndex 10;wIndex+) if (capGetDriverDescription (wIndex,szDeviceName,sizeof (szDeviceName),szDeviceVersion,sizeof (szDeviceVersion) /把得到的名字加入已安装采集驱动器的名字列表里 /以便让用户选择要使用的驱动器 当一个捕捉窗口被销毁以后。所有连接到它上面的捕捉设备驱动器都会自动断开连接。图 3-4 获取到的视频采集设备列表3.3 视频采集的设置前文介绍了如何将视频采集窗口和采集的硬件设备进行连接,并介绍了如何获取视频采集设备的驱动程序的名字和版本号,但在视频采集过程中,我们往往还需要对采集到的视频进行相关的一些处理,而这些处理都是基于采集设备驱动程序的性能之上的,因此,如何获取视频采集设备的驱动程序也是本系统所要处理的。3.3.1 采集驱动程序采集驱动程序和相应的底层硬件决定了视频捕捉的方方面面,包括可接受的视频源、显示方式、格式以及压缩方式。一个音频驱动程序会指定被捕捉到的音频数据的存储格式和压缩方式。视频采集驱动程序的性能可以用WM_CAP_DRIVER_GET_CAPS消息(或者capDriverGetCaps宏)来者到连接到当前捕捉窗口的硬件的性能。这个消息通过CAPDRIVERCAPS结构返回设备驱动程序和硬件的性能信息。因此,每当一个应用程序连接一个新的采集驱动器到采集窗口时,都应该更新CAPDRIVERCAPS结构。 下例使用capDriverGetCaps宏获得采集驱动器能力。CAPDRIVERCAPS CapDrvCaps;SendMessage(hWndC,WM_CAP_DRIVER_GET_CAPS,sizeof (CAPDRIVERCAPS),(LPVOID)&CapDrvCaps);/或使用宏得到驱动器能力。/capDriverGetCaps(hWndC,&CapDrvCaps,sizeof(CAPDRIVERCAPS);3.3.2 视频采集设置对话框每个捕捉驱动器都可以提供3个对话框来控制视频的数字化和采集过程,为了减少视频数据的大小,他们还会定义视频的压缩属性。视频源对话框用于控制视频输入频道的选择和一些影响视频图像被数字化的帧缓冲的参数选择。这个对话框枚举连接视频源的捕捉卡的信号种类,并且控制颜色、对比度、饱和度的改变12。如果视频捕捉驱动程序支持,还可以用WM_CAP_DLG_VIDEOSOURCE消息(或者capDlgVideoSource宏)来更新和显示这个对话框。视频格式对话框控制对数字化后的视频帧的大小和图像深度,以及被捕捉视频的压缩方式的选择。如果视频捕捉驱动支持,可以用WM_CAP_DLG_VIDEOFORMAT消息(或者capDlgVideoFormat宏)对它进行更新和显示。视频显示对话框控制视频捕捉过程中视频在显示器上的显示。这一控制对捕捉的数据毫无影响,但它会影响数字信号的表达。比如,如果捕捉设备支持叠加,那就意味着允许灵活调整色彩、饱和度、关键颜色或者叠加的位置关系。如果视频捕捉驱动程序支持,可以用WM_CAP_DLG_VIDEODISPALY消息(或者capDlgVideoDisplay宏)来对他进行更新和显示。视频压缩对话框控制捕捉视频的压缩属性。如果视频捕捉驱动程序支持,可以用WM_CAP_DLG_VIDEOCOMPRESSION消息(或者capDlgVideoCompression宏)来对它进行更新和显示。下例示范了该如何分别显示这3个对话框。在每个对话框显示之前,例子调用capDriverGetCaps宏并且建厂返回的CAPDRIVERCAPS结构看看采集驱动器是否显示它。CAPDRIVERCAPS CapStatus;capDriverGetCaps(hWndC,&CapDrvCaps,sizeof(CAPDRIVERCAPS);/视频源对话框If(CapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(hWndC);/视频格式对话框If(CapDriverCaps.fHasDlgVideoFormat) capDlgVideoFormat(hWndC); /Are there new image dimensions? capGetStatus(hWndC,&Capstatus,sizeof(CAPSTATUS); /if so,notify the parent of a size change。/视频显示对话框If(CapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(hWndC);图 3-5 视频显示对话框 图 3-6 视频格式对话框图 3-7 视频压缩对话框3.3.3 视频预览模式文章前面简单介绍过视频显示的两种模式,下面对此进行详细说明以及如何使用。一个捕捉驱动程序能提供两个方法来显示输入视频流:预览模式和叠加模式。如果两个方法都提供了,用户就可以从中选择一种使用了。预览模式将数字化帧从捕捉设备传到系统内存,然后用图形设备接口(GUI)函数来把这些帧显示到捕捉窗口上。当父窗口失去焦点时,应用程序会减小预览频率,而当父窗口得到焦点时,应用程序会增加预览频率14。因为预览操作比较消耗CPU资源,这一操作会减少系统的整体响应时间。有3条消息用来控制预览操作。(1)通过把WM_CAP_SET_PREVIEW消息(或capPreview宏)发送给捕捉窗口来使预览模式有效或者失效。(2)通过把WM_CAP_SET_PREVIEWRATE消息(或capPreviewRate宏)发送给捕捉窗口来设置在预览模式下帧的显示频率。(3)用WM_CAP_SET_SHCALE消息(或者capPreviewScale宏)来使预览模式的缩放有效或者无效。当预览和缩放同时有效时,被捕捉的视频被拉伸到捕捉窗口的大小。设置预览模式有效自动会是叠加模式失效。叠加模式是一个硬件功能,它可以不适用CPU资源而直接把捕捉缓冲去里的内容显示在显示器上。可以发送WM_CAP_SET_OVERLAY消息(或者用capOverlay宏)来使视频窗口处于叠加模式。是叠加模式有效也会自动使预览模式失效。如果是在预览模式或者叠加模式,还可以通过把WM_CAP_SET_SCROLL消息(或者capSetScrollPos宏)发送给捕捉窗口,在窗口里的用户区域设置视频帧的滚动条位置。下例使用capPreviewRate宏为预览模式设定帧的播放速度为每66毫秒播放一帧,然后使用capPreview宏使采集窗口为预览模式。然后用capDriverGetCaps宏来查看采集驱动器是否有叠加功能,如果有,则调用capOverlay宏是叠加有效。capPreviewRate(hWndC,66); /预览速度,单位是毫秒capPreview(hWndC,TURE); /开始预览capPreview(hWndC,FALSE); /停止预览CAPDRIVERCAPS CapDrvCaps;capDriverGetCaps(hWndC,&CapDrvCaps,sizeof(CAPDRIVERCAPS); capOverlay(hWndC,TURE);3.3.4 视/音频格式可以发送WM_CAP_GET_VIDEOFORMAT消息给捕捉窗口(或者用capGetVideoFormat和capGetVideoFormatSize宏)来得到视频格式的结构和该结构的大小。而向捕捉窗口发送WM_CAP_SET_VIDEOFORMAT消息(或者用capGetVideoFormat宏)则可以设置视频格式。为了适应标准和被压缩的数据格式,BITMAPINFO结构有可变的长度。因为这一个结构是有可变的长度,应用程序在得到当前的视频格式之前总是会查询这个结构的大小,然后分配内存给它。下例使用capGetVideoFormatSize宏得到缓冲区大小然后调用capGetVideoFormat得到当前的视频格式。LPBITMAPINFO lpbi;DWORD dwSize;dwSize=capGetVideoFormatSize(hWndC);lpbi=GlobalAllocPtr(GHND,dwSize);capGetVideoFormat(hWndC,lpbi,dwSize);/Access the video format and then free the allocated memory应用程序可以用capGetVideoFormat宏(或者WM_CAP_SET_VIDEOFORMAT消息)把BITMAPINFO头结构送给采集窗口。由于视频格式是由设备决定的,应用程序必须检查返回值以便确定指定的格式是否被接受。对于音频格式,可以发送WM_CAP_GET_AUDIOFORMAT消息给捕捉窗口(或者用capGetAudioFormat和capGetAudioForm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 61000-6-1:2005 FR-D Electromagnetic compatibility (EMC) - Part 6-1: Generic standards - Immunity for residential,commercial and light-industrial environments
- 校园防盗安全知识培训课件
- 新测绘法试题及答案
- 校园安防消防知识培训课件
- 防腐廉洁面试题及答案
- 编导运营面试题及答案
- 报账员考试题及答案
- 球馆分级考试题及答案
- 流管员面试题及答案
- 方程运算面试题及答案
- 2020低压交流配网不停电作业技术导则
- 易制毒、易制爆化学品安全培训
- 麻醉药品应急处理制度及流程
- 附件2:慢病管理中心评审实施细则2024年修订版
- 【建筑专业】16J914-1公用建筑卫生间(完整)
- DL∕T 5776-2018 水平定向钻敷设电力管线技术规定
- 邮政市场业务员(中级)理论考试复习题库(附答案)
- DZ∕T 0070-2016 时间域激发极化法技术规程(正式版)
- 消化内镜进修总结汇报
- 兽医检验题库与答案
- 换电柜地租赁合同范本
评论
0/150
提交评论