VFW在windows下编程控制摄像头2.doc_第1页
VFW在windows下编程控制摄像头2.doc_第2页
VFW在windows下编程控制摄像头2.doc_第3页
VFW在windows下编程控制摄像头2.doc_第4页
VFW在windows下编程控制摄像头2.doc_第5页
全文预览已结束

下载本文档

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

文档简介

摘要 在VC+6.0中利用VFW技术实现视频数据实时获取的过程中,针对回调函数的处理中所碰到的问题、图像采集中原始数据的获取以及捕获窗口的建立的问题进行了详细的讨论,并给出了具体的解决办法。关键词 VFW 图像采集 回调函数引言以光学为基础,融光电子学、计算机技术、激光技术、图像处理技术等现代科学技术为一体的图像测量技术在测量领域中形成了新的测量技术,基于数字图像处理技术的图像测量系统目前已广泛应用于几何量的测量、航空等遥感测量、精密复杂零件的微尺寸测量和外观测量,以及光波干涉图、应力应变场状态分布等和图像有关的技术领域中。在基于数字图像处理技术的图像测量系统中,必须解决的问题就是图像采集,即图像数据的获取,采集的图像数据用于后期的图像处理。 VFW库函数简介视频数据的实时采集主要是通过调用AVICap32.dll创建AVICap窗口类 ,由AVICap窗口类中的消息、宏函数、结构以及回调函数来完成。 AVICap在捕获视频方面具有明显的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很高,它也可将数字视频保存到事先建好的文件中。实际应用表明,通过这种方法,提高了视频采集的效果和程序运行的效率,同时也减少了对硬件的依赖性,提高了程序的兼容性和移植性。VFW的视频采集功能主要包括捕获视频流至AVI文件(capCaptureSequence)、捕获视频流至缓存(capCaptureSequenceNofile)、捕获视频流至AVI文件(capCaptureSingleFrame)、本地预览(capPreview/capOverlay)和捕获单帧预览(capGrabFrame/capGrabFrameNoStop)等。还提供了回调函数 ,允许应用程序精确控制视频流的捕获、检测错误、监控状态变化 ,以及在捕获两帧数据的空隙和每捕获新帧时对实时数据进行处理。几个实际问题的探讨1、回调函数处理的问题 回调函数是至今为止最有用的编程机制之一。在Windows中,回调函数更是窗口过程、钩子过程、异步过程调用所必需的,在整个回调过程中自始至终地使用回调方法。人们可以注册回调方法以获得加载/卸载通知,未处理异常通知,数据库/窗口状态修改通知,文件系统修改通知,菜单项选择,完成的异步操作通知,过滤一组条目等等。在VFW中有几条这样的宏函数,如用于设置在发生某事件后能作出反应的回调函数的宏函数,它和中断服务机制很相似,条件一满足,程序会自动进入相应的回调函数体中,该函数究竟要做些什么,全由开发者借助其参数自行编制程序来确定。利用VFW获取实时视频数据通常可以运用视频处理的回调机制(call-backmechanism) 获得实时数据缓冲区的首址和长度并对图像数据进行处理,同时也可以进行视频数据的直接传输,在这一方面很多文章都作了具体的介绍。但是按照大多数文章的介绍,在具体的应用过程中,对回调函数作如下定义时,程序总是无法通过编译: LRESULT CALLBACK FrameCallbackProc(HWND ghWnd,LPVIDEOHDR lpVData)unsigned char *data;data=lpVData-lpData;/获得视频数据首地址,并将数据存入data数组中以便处理通过研究,发现根本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C+的,可以将一个C函数直接作为回调函数,但是如果试图直接使用C+的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C+成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C+通过传递一个指向自身的指针给其成员函数从而实现程序函数可以访问C+的数据成员。这也可以理解为什么C+类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C+中使用回调函数所遇到的问题。这种方法具有通用性,适合于任何C+。(1) 不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变量,可以使用友元操作符(friend),在C+中将该C函数说明为类的友元即可。这种处理机制与普通的C编程中使用回调函数一样。 (2) 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。由于在C+中使用类成员函数作为回调函数的目的就是为了访问所有的成员变量和成员函数,如果作不到这一点将不具有实际意义。解决的办法也很简单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函数了。这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种方法稍稍麻烦,这里就不再赘述。因此,可以对回调函数作如下定义:static LRESULT CALLBACK FrameCallbackProc(HWND ghWnd,LPVIDEOHDR lpVData)unsigned char *data;data=lpVData-lpData;/获得视频数据首地址,并将数据存入data数组中以便处理2、图像采集中的问题视频数据的采集是整个应用的关键,根据应用的不同可以将视频帧采集到的文件或采集的缓存直接加以处理。利用VFW获取实时视频数据通常可以运用视频处理的回调机制(call-backmechanism) 获得实时数据缓冲区的首址和长度并对图像数据进行实时处理,但是在这个过程中图像处理程序不能太长,否则视频显示不流畅。另外,在实际采集过程中,有些图像采集卡驱动程序对通过回调机制所获取的数据进行了压缩,比如DC10,而在图像测量系统高精度的要求,压缩后的图像数据直接影响以后的图像处理工作。通过采用以下两种典型技术可以实现将没有压缩的视频帧的图像数据的采集。(1) 通过研究发现,尽管图像采集卡驱动程序对通过回调机制所获取的数据进行了压缩,但是利用VFW中的capEditCopy( )宏函数将帧图像缓冲区中的图像数据拷贝到剪贴板上时,并没有压缩图像数据,因此可以不采用回调机制而直接利用capGrabFrameNoStop()捕获一帧图像,然后将数据拷贝拷贝到剪贴板上,再通过DIB(Device Independent Bitmap)操作获取内存中图像数据首地址,进行后续的图像数据处理。具体的代码片段如下:/获得capEditCopy( )拷贝到剪贴板中的图像数据句柄,通过CF_DIB参数指定数据HANDLE hData;:GlobalFree (HGLOBAL)hData);hData=(HANDLE)CopyHandle(:GetCliPBoardData(CF_DIB);(2) 利用capFileSaveDIB将缓冲区中的图像数据转化为DIB位图直接保存为文件,需要处理时,再读取位图中的图像数据到内存进行后续的处理。这种方式因为有一个文件存储和读取的延迟,对于实时的图像处理来说,响应速度比前者要稍慢,经过多次实验证明,只要图像处理算法的计算量不是很大,仍然可以保证比较好的实时性。 3、图像采集窗口建立的问题在视频捕获之前需要创建一个捕获窗,所有的捕获操作及其设置都以它为基础。一个AVICap视窗口句柄描述了声频与视频流的细节,这样就使程序员的应用程序从AVI文件格式,声频视频缓冲管理,低层声频视频驱动访问等解脱出来。AVICap即是预定义的Windows窗口类,利用该窗口类创建的子窗口可以与视频采集设备的驱动程序相联系,该子窗口的客户区用来显示采集设备捕获的实时视频图像。但是在实际应用过程中,应用程序可能会基于单文档(SDI)、多文档或者是基于对话框的界面,由于三种类型的不同,捕获窗的具体创建应根据具体要求而有所区别。不管是采用哪种类型,根据实时视频的显示的具体要求,关键是如何获取捕获窗口的父窗口句柄。通常捕获窗口的创建可以如下两种方式:(1)获取动态创建的父窗口的句柄,动态的创建捕获窗口。具体的代码片段如下:CFrameWnd m_wndSource;if(!m_wndSource.CreateEx(WS_EX_TOPMOST,NULL,source,WS_CAPTION,CRect(100,100,150,180),NULL,0)return -1;m_wndSource.ShowWindow(SW_HIDE);m_WndCap=capCreateCaptureWindow(LPSTR) 视频捕捉测试程(2)获取显示的实时视频窗口的句柄,静态的创建捕获窗口。具体的代码片段如下:m_hCapWnd = capCreateCaptureWindow(LP

温馨提示

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

评论

0/150

提交评论