下载本文示例代码
引言 以光学为基础,融光电子学、计算机技术、激光技术、图像处理技术等现代科学技术为一体的图像测量技术在测量领域中形成了新的测量技术,基于数字图像处理技术的图像测量系统目前已广泛应用于几何量的测量、航空等遥感测量、精密复杂零件的微尺寸测量和外观测量,以及光波干涉图、应力应变场状态分布等和图像有关的技术领域中。在基于数字图像处理技术的图像测量系统中,必须解决的问题就是图像采集,即图像数据的获取,采集的图像数据用于后期的图像处理。 视频图像捕获一般来讲有两种方法,一种是利用视频捕获卡所附带的SDK开发工具,这种捕获方法的实现是与设备有关的,依赖于视频捕获卡与摄像头的类型,不利于灵活应用;另外一种捕获方法是Microsoft的Visual C 自从4.0版就开始支持Video for Windows(简称VFW),这给视频捕获编程带来了很大的方便,利用VFW技术的可以提高视频捕获的灵活性,减少了对视频设备的依赖。在VC 6.0中,含有MCIAVI、DRAWDIB、AVIFILE和AVICAP等组件。通过它们之间的协调工作,可以完成播放、编辑、文件管理和视频捕获等功能,为视频图像处理和分析带来非常大的便利,本文就利用VFW进行视频数据的实时采集中的碰到的几个实际问题进行探讨。 VFW库函数简介 视频数据的实时采集主要是通过调用AVICap32.dll创建AVICap窗口类 ,由AVICap窗口类中的消息、宏函数、结构以及回调函数来完成。 AVICap在捕获视频方面具有明显的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很高,它也可将数字视频保存到事先建好的文件中。实际应用表明,通过这种方法,提高了视频采集的效果和程序运行的效率,同时也减少了对硬件的依赖性,提高了程序的兼容性和移植性。 VFW的视频采集功能主要包括捕获视频流至AVI文件(capCaptureSequence)、捕获视频流至缓存(capCaptureSequenceNofile)、捕获视频流至AVI文件(capCaptureSingleFrame)、本地预览(capPreview/capOverlay)和捕获单帧预览(capGrabFrame/capGrabFrameNoStop)等。VFW还提供了回调函数 ,允许应用程序精确控制视频流的捕获、检测错误、监控状态变化 ,以及在捕获两帧数据的空隙和每捕获新帧时对实时数据进行处理。 几个实际问题的探讨 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数组中以便处理}
编辑推荐:用DirectShow实现QQ的音视频聊天功能 共2页。 1 2 :
引言 以光学为基础,融光电子学、计算机技术、激光技术、图像处理技术等现代科学技术为一体的图像测量技术在测量领域中形成了新的测量技术,基于数字图像处理技术的图像测量系统目前已广泛应用于几何量的测量、航空等遥感测量、精密复杂零件的微尺寸测量和外观测量,以及光波干涉图、应力应变场状态分布等和图像有关的技术领域中。在基于数字图像处理技术的图像测量系统中,必须解决的问题就是图像采集,即图像数据的获取,采集的图像数据用于后期的图像处理。 视频图像捕获一般来讲有两种方法,一种是利用视频捕获卡所附带的SDK开发工具,这种捕获方法的实现是与设备有关的,依赖于视频捕获卡与摄像头的类型,不利于灵活应用;另外一种捕获方法是Microsoft的Visual C 自从4.0版就开始支持Video for Windows(简称VFW),这给视频捕获编程带来了很大的方便,利用VFW技术的可以提高视频捕获的灵活性,减少了对视频设备的依赖。在VC 6.0中,含有MCIAVI、DRAWDIB、AVIFILE和AVICAP等组件。通过它们之间的协调工作,可以完成播放、编辑、文件管理和视频捕获等功能,为视频图像处理和分析带来非常大的便利,本文就利用VFW进行视频数据的实时采集中的碰到的几个实际问题进行探讨。 VFW库函数简介 视频数据的实时采集主要是通过调用AVICap32.dll创建AVICap窗口类 ,由AVICap窗口类中的消息、宏函数、结构以及回调函数来完成。 AVICap在捕获视频方面具有明显的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很高,它也可将数字视频保存到事先建好的文件中。实际应用表明,通过这种方法,提高了视频采集的效果和程序运行的效率,同时也减少了对硬件的依赖性,提高了程序的兼容性和移植性。 VFW的视频采集功能主要包括捕获视频流至AVI文件(capCaptureSequence)、捕获视频流至缓存(capCaptureSequenceNofile)、捕获视频流至AVI文件(capCaptureSingleFrame)、本地预览(capPreview/capOverlay)和捕获单帧预览(capGrabFrame/capGrabFrameNoStop)等。VFW还提供了回调函数 ,允许应用程序精确控制视频流的捕获、检测错误、监控状态变化 ,以及在捕获两帧数据的空隙和每捕获新帧时对实时数据进行处理。 几个实际问题的探讨 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数组中以便处理}
编辑推荐:用DirectShow实现QQ的音视频聊天功能 共2页。 1 2 :
下载本文示例代码
VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨VC 6.0实现视频数据实时获取的探讨
阅读(103) | 评论(0) | 转发(0) |