谈谈使用vfw在windows下编程控制摄像头

上传人:第*** 文档编号:32770652 上传时间:2018-02-12 格式:DOC 页数:22 大小:114KB
返回 下载 相关 举报
谈谈使用vfw在windows下编程控制摄像头_第1页
第1页 / 共22页
谈谈使用vfw在windows下编程控制摄像头_第2页
第2页 / 共22页
谈谈使用vfw在windows下编程控制摄像头_第3页
第3页 / 共22页
谈谈使用vfw在windows下编程控制摄像头_第4页
第4页 / 共22页
谈谈使用vfw在windows下编程控制摄像头_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《谈谈使用vfw在windows下编程控制摄像头》由会员分享,可在线阅读,更多相关《谈谈使用vfw在windows下编程控制摄像头(22页珍藏版)》请在金锄头文库上搜索。

1、谈谈使用 VFW 在 windows 下编程控制摄像头(一) 。 【孙涛】 收藏 这段时间闲来无事,看了看 MSDN 的文档,自己翻译了一下。一是为了学习,二是对空闲时间的打发。所以也希望大家在拍砖的同时,尊重我的劳动,如要转贴请注明转至 2005-8-6Microsoft Video for Windows (VFW) 提供的函数可以让应用程序去处理视频数据。 VFW 在 16 位 Windows 的时候就被引入了。它的许多重要功能已经被 DirectX 取代了。 要获得更多的信息,你可以参考 DirectX 的文档。下面讲介绍 VFW 的视频捕获:3.视频捕获你可以使用 windows 的

2、 AVICap 类轻松地完成视频捕获。AVICap 提供给应用程序一个简单的、基于消息的接口去访问视频设备和录音设备,并且可以控制处理视频流捕获。3.1 关于视频捕获 AVICap 支持实是视频流捕获和实时单帧图像捕获。另外,AVICap 提供了对视频源的控制(MCI 媒体控制接口设备) ,因此使用者可以通过应用程序控制一个视频源开始和结束的位置,并且可以加大对帧捕获的控制。你使用 AVICap 类可以完成如下的任务 : l 捕获声音和视频,并将他们写入到一个 AVI 文件中。 l 动态连接和断开视频和音频的输入设备。 l 使用覆盖或预览的方法去显示当前的视频信号。 l 指定一个文件用于捕获,

3、并且把这个捕获文件的内容拷贝给另一个文件。 l 设定捕获图像速度(好多帧) 。 l 显示对话框用于控制视频源和格式。 l 创建、保存、加载调色板。 l 拷贝图像和调色板到剪贴板中。 l 捕获并把图像作为一个 DIB 位图保存。 3.1.1 视频捕获:最简单的方法 视频捕获将数字化一个视频流和音频数据,并且将他们保存在硬盘和其他存储设备上。这里将描述如何在应用程序中简单地应用视频捕获,它通过三句代码实现。它还介绍了如何通过发送消息给视频捕获窗口来结束或中断一个视频会话。AVICap 捕获窗口可以把捕获的音视频信息写入一个 AVI 文件中。你的应用程序可以自由地处理这个 AVI 文件、管理缓存区的

4、音视频数据、还可以在底层访问音视频设备的驱动器。AVICap 为应用程序提供了一个灵活的接口。你可以使用下面的代码,在你的应用程序中加入视频捕获:HWndC = capCreateCaptureWindow ( My Own Capture Window, WS_CHILD | WS_VISIBLE , 0 , 0, 160, 120, hwndParent, nID); SendMessage ( hWndC, WM_CAP_DRIVER_CONNECT, 0 /* wIndex */, 0L); SendMessage ( hWndC, WM_CAP_SEQUENCE, 0, 0L);宏接

5、口同样有用,你可以选择是使用宏接口还是 SendMessage 函数来实现上面的功能,不过宏接口可以让你的代码更加容易理解。下面就使用了宏接口。HWndC = capCreateCaptureWindow ( My Own Capture Window , WS_CHILD | WS_VISIBLE , 0, 0, 160, 120, hwndParent, nID); capDriverConnect ( hWndC, 0); / 宏接口 capCaptureSequence ( hWndC); / 宏接口你的应用程序创建 AVICap 捕获窗口,并和视频设备建立连接后。你创建的这个捕获窗口

6、就准备捕获数据了。这时,你可以通过发送 WM_CAP_SEQUENCE 消息(或capCaptureSequence 宏)开始对数据进行捕获。WM_CAP_SEQUENCE 将使用默认设置,开始对视频和音频进行捕获,并把数据放在一个CAPTURE.AVI 的文件中,捕获动作将一直持续,除非有下面的事件发生:l 用户按了 ESC 键或者鼠标的按钮。 l 你的应用程序停止或者退出了捕获操作。 l 磁盘写满了。在应用程序中,你可以通过发送 WM_CAP_STOP 命令(或 capCaptureStop)给捕获窗口,让它停止向文件写数据。你还可以通过发送 WM_CAP_ABORT 命令(或 capCa

7、ptureAbort)给捕获窗口,让它中断捕获操作。3.1.2 捕获基本设置 通过对定义在 CAPTUREPARMS 结构中的捕获参数进行修改,你可以完成:l 改变捕获的帧频律(帧 /秒) ; l 指定用键盘或鼠标去结束一个捕获会话; l 为一个捕获会话指定时间周期; 捕获的帧频率 捕获的帧频率表示在一个捕获会话中,每秒要捕获多少帧。你通过WM_CAP_GET_SEQUENCE_SETUP 消息(capCaptureGetSetup 宏)可以得到当前捕获的帧频率。当前的帧频率被保存在 CAPTUREPARMS 结构的 dwRequestMicroSecPerFrame 成员中。你可以对该值进行

8、修改,从而去改变帧频率。该值为捕获一帧要用的时间(单位是微秒 1/1000000 秒),修改后,你可以发送 WM_CAP_SET_SEQUENCE_SETUP 消息(或capCaptureSetSetup 宏)给你的捕获窗体,来刷新 CAPTUREPARMS 结构。dwRequestMicroSecPerFrame 默认值是 66667 微秒,表示每秒 15 帧。 (1000000/15=66667) 退出数据捕获 你可以让用户按这几种方法退出一个捕获会话,按键盘上的一个键或几个组合键、或者按鼠标的左键或者是右键。如果用户退出一个实时的捕获会话,那么捕获文件中的内容将被系统丢弃掉。如果用户退出

9、一个步帧(step-frame)捕获的会话,捕获文件将保存到退出时刻前的所有数据。 你可以通过发 WM_CAP_GET_SEQUENCE_SETUP 消息(或 capCaptureGetSetup 宏)给捕获窗口,来获得捕获退出的设置信息。当前的退出按钮设置保存在 CAPTUREPARMS结构的 vKeyAbort 成员中,当前的退出鼠标设置保存在 fAbortLeftMouse 和 fAbortRightMouse 成员中。你可以改变这几个成员,实现对当前值的修改。当你修改完成后,你可以发送 WM_CAP_SET_SEQUENCE_SETUP 消息(或 capCaptureSetSetup

10、宏)给你的捕获窗体,来刷新 CAPTUREPARMS 结构。vKeyAbort 默认值是 VK_ESCAPE。在重新指定其他按键前,你必须调用 RegisterHotKey 函数。fAbortLeftMouse 和 fAbortRightMouse 是 TRUE。时间限定 通过使用 CAPTUREPARMS 结构的 fLimitEnabled 和 wTimeLimit 成员,你可以去限定一个捕获操作的时间周期。fLimitEnabled 表示是否要对捕获操作限定时间, wTimeLimit 用于指定限定时间的最大值。 你发 WM_CAP_GET_SEQUENCE_SETUP 消息(capCap

11、tureGetSetup 宏)给捕获窗口,就可以得到 fLimitEnabled 和 wTimeLimit 的值。 FLimitEnabled 为 TRUE 表示要指定时间周期。WTimeLimit 单位为秒。修改完成后,你可以发送WM_CAP_SET_SEQUENCE_SETUP 消息(或 capCaptureSetSetup 宏)给你的捕获窗体,来刷新 CAPTUREPARMS 结构。fLimitEnabled 默认值为 FALSE.3.1.3 捕获窗口 捕获窗体类似于一个标准控件(不如按钮、列表框) ,它一般使用 WS_CHILD 和 WS_VISIBLE 窗口类型。.创建一个 AVIC

12、ap 捕获窗口 使用 capCreateCaptureWindow 函数可以创建一个 AVICap 的捕获窗口。这个函数返回一个窗口句柄,这个句柄就是捕获窗口的句柄,后面其他操作就是通过发送消息给该句柄来实现。你可以在一个程序中创建多个捕获窗口,并且每个窗口连接到不同的捕获设备上。建立捕获窗口到捕获设备的连接 你可以动态地连接或断开捕获窗口与设备间的链接。通过使用WM_CAP_DRIVR_CONNECT 消息(或 capDriverConnect 宏) ,可以实现捕获窗体与设备驱动间的连接。当捕获窗体和捕获设备驱动连接后,你就可以发送针对设备的消息给该窗体了。如果你的系统安装了多个捕获设备,你

13、可以通过在发送 WM_CAP_DRIVER_CONNECT 消息时,设置 wPrarm 参数(integer ) 。来指定捕获窗口与那个具体的视频捕获设备相连接。WPrarm 参数是一个整数,它表示一个系统已经安装的视频捕获设备列表的索引(注册表中或这 System.ini drivers中的信息) 。该列表的索引从 0 开始。通过 capGetDriverDescription 函数可以获得安装的捕获驱动程序的名称和版本。你的应用程序可以使用这个函数列举除安装的所有捕获设备,让用户可以选择其中一个去与捕获窗口相联。 通过发送 WM_CAP_DRIVER_GET_NAME 消息(capDriv

14、erGetName 宏) ,可以获得与指定窗体连接的捕获设备的名称。通过发送 WM_CAP_DRIVER_GET_VERSION 消息(capDriverGetVersion 宏) ,可以获得与指定窗体连接的捕获设备的版本。 通过发送 WM_CAP_DRIVER_DISCONNECT 消息(capDriverGetDisconnect 宏) ,可以断开连接。当捕获窗体销毁后,任何连接的视频捕获设备都将自动断开。 父子窗体交付一些系统级的消息,比如 WM_PALETTECHANGED、WM_QUERYNEWPALETTE,只被发送到顶层(top-level) 和overlapped 窗口。如果一

15、个捕获窗体是一个资窗体,那它的父窗口应该来转寄这些消息。同样地,假如父窗口尺寸改变了,它可能需要发送一个通知消息给捕获窗口。相反,如果捕获视频尺寸变化了,捕获窗口可能需要发一个通知消息给父窗口。最简单的管理方法是让捕获窗口的尺寸等于捕获视频流的尺寸,随时把改变的尺寸告诉给父窗口。 捕获窗体状态 通过发送 WM_CAP_GET_STATUS 消息(capGetStatus 宏) ,可以获得当前捕获窗口的状态。这个消息得到一个 CAPSTATUS 结构体的拷贝,状态信息就在这个结构体的成员中。CAPSTATUS 结构体包含了图形尺寸大小、滚动位置(scroll position) 、是否覆盖(overlay)或者预览(preview)等信息。因为在 CAPSTATUS 中的信息是动态的,你的应用程序应该随时去刷新这个结构体中的内容。 改变捕获窗口的尺寸对实际的视频流的尺寸没有影响。3.1.4 捕获和音频驱动器 视频捕获可以做这几个方面的工作:访问 视频源、显示选项、格式和压缩选项。音频捕获包括指定音频格式和选择压缩方式。捕获驱动性能 通过发送 WM_CAP_DRIVER_GET_CAPS 消息(capDriverGetCaps 宏) ,可以获得当前连接的捕获设备的性能。发送该消息后,会返回一个 CAPDRIVERC

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号