精华内容
下载资源
问答
  • VFW

    2014-04-28 16:27:04
    VFW 2010-07-13 23:54 2429人阅读 评论(12) 收藏 举报 callback存储struct编译器windowsvideo  ...
    
    VFW
    2429人阅读 评论(12)收藏 举报

     http://d.download.csdn.net/down/2306686/shentuhongfeng http://hi.baidu.com/cometww/blog/item/4c54b71f2b914465f624e4d5.html http://d.download.csdn.net/down/2243476/zhouzhixiangcn http://d.download.csdn.net/down/2040458/simeone18 孙鑫视频教程

     

     

    刚刚做了一个利用VFW(Video ForWindows)的视频采集程序,就想写出来,给需要的人分享一下。程序并不复杂,
    关键是在没人指导的情况下,学习是比较痛苦和漫长的过程,我经历了这个过程,如果大家想避免走弯路,直接看我
    下面的解释就好了。由于我仅仅作出了结果,对很多东西的理解也许并不完全正确或者是完全错误,愿请指教。

    提前说一句,我的程序是在Visual C++6.0平台下写的。

    下面我慢慢说,你也慢慢听。

    1什么是VFW

    VFW微软的一个软件包,至少可以用来开发视频采集程序,当然还有别的用处,但不是我想关心的。VFW提供了

    基于消息的接口,而这些接口,也可以利用它本省定义的宏来实现。

    2怎么使用VFW

    写之前提示一句,可以参照MSDN看下面的内容,一定会更好。

    (1)创建一个基于对话框的程序,工程名称Grasp

    因为要用VFW,所以要包含头文件

    可在GraspDlg.h中加入 #include<Vfw.h>,然后Project->Settings,link标签页的Object/library modules :里面加入Vfw32.lib

    (2)CGraspDlg类中添加一个窗口句柄

    HWND m_hVideo;

    (3)利用capCreateCaptureWindow函数创建窗口,并且得到返回的窗口句柄。

    m_hVideo=::capCreateCaptureWindow("Me",WS_CHILD | WS_VISIBLE,
    0,0,500,500,m_hWnd,0);

    上面这个函数写在BOOL CGraspDlg::OnInitDialog()中。参数m_hWnd是你的工程中

    对话框的句柄,窗口类中都有这个成员变量,而对话框的类是窗口类的子类,记得?

    (4)capSetCallbackOnFrame宏注册回调函数,也写在BOOL CGraspDlg::OnInitDialog()中。

    capSetCallbackOnFrame(m_hVideo, FrameCallbackProc);

    上面第二个参数是回调函数的地址,名字可以自己来定义,但是回调函数必须有如下参数和返回值。

    LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr);
    人家规定的,咱们也没办法,就照着写就好啦。

    解释一下,什么是回调函数呢,它有什么用处?

    回调函数,就是你自己写的函数,符合规定的参数和返回值类型,符合规定的调用约定,比如上面这个函数
    就是回调函数,参数和返回值类型都是规定好的,调用约定为CALLBACKCALLBACK其实是一个宏
    #define CALLBACK__stdcall
    满足一定条件时,此函数可以被系统自动调用,在回调函数当中,你可以写自己的代码完成一定功能。
    比如在这里,用capSetCallbackOnFrame(m_hVideo, FrameCallbackProc)注册后,当每得到一桢数据后,系统就
    调用函数FrameCallbackProc
    (5)因为注册了回调函数,所以,当然要自己写出这个函数了。在GraspDlg.cpp中,且在
    BOOL CGraspDlg::OnInitDialog()函数之前写下面代码:

    LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
    {
    if (!ghVideo)
    return FALSE;

    return (LRESULT) TRUE ;
    }
    目前为止,该回调函数还没有什么作用,一会儿我们再来编写函数当中的代码,现在我就写的话,你也不见得看懂,
    不是么。一会儿写的话,你就可以轻松明白了。
    注意在这个函数中的ghVideo了么?其实就和上面的m_hVideo一样,可是这里是全局函数,m_hVideo是对话框类的成员变量,
    我写m_hVideo编译器是不认识的,对吧,所以,我又在GraspDlg.cpp当中定义了一个全局变量
    HWND ghVideo;
    并且,在m_hVideo=::capCreateCaptureWindow("Me",WS_CHILD | WS_VISIBLE,
    0,0,500,500,m_hWnd,0);
    之后加上一句ghVideo=m_hVideo;这样就可以用ghVideo了。
    (6)BOOL CGraspDlg::OnInitDialog()中继续添加如下代码:
    char szDeviceName[80];
    char szDeviceVersion[80];
    int wIndex;

    for (wIndex = 0; wIndex < 10; wIndex++)
    {
    if (capGetDriverDescription (wIndex, szDeviceName,
    sizeof (szDeviceName), szDeviceVersion,
    sizeof (szDeviceVersion)) )
    {
    if(capDriverConnect(m_hVideo,wIndex))
    {

    }
    }

    }
    上面代码中,capGetDriverDescription是列举所有可用视频的驱动程序,如果列举成功,用capDriverConnect进行连接。
    其实,我的机器上就装了一个摄像头,所以,只有当wIndex=0的时候,列举成功,并且连接也成功。这段代码好像很奇怪,因为
    列举成功之后,不论是否连接上,都没有做任何事情。其实可以用下面代码代替:

    char szDeviceName[80];
    char szDeviceVersion[80];

    //Get Driver description
    //and the code can also be deleted as you want.
    capGetDriverDescription (0 szDeviceName,
    sizeof (szDeviceName), szDeviceVersion,
    sizeof (szDeviceVersion));
    //connect window to driver
    capDriverConnect(m_hVideo,0);
    (7)到这里,再加下面两句话你就会有成就感了,BOOL CGraspDlg::OnInitDialog()中继续添加如下代码:
    capPreviewRate(m_hVideo,40);//设置Preview模式的显示速率
    capPreview(m_hVideo,TRUE);//启动Preview模式
    如果到此为止,已经完成了视频采集的全过程,你运行一下,就可以看到摄像头拍摄的画面了,显示在你的对话框上。
    但是,我的目的还没有达到,我其实想在每一桢显示之前,能处理一下这一桢的数据,那么,去哪里找这桢数据存
    放的位置呢?
    (8)为了完成我的目标,我把步骤(7)中的两句代码先注释掉。在对话框上加一个按钮,并在对单击做出响应的响应函数
    中写下面代码:
    capGrabFrame(m_hVideo);
    这是一个宏,将鼠标移动到这段代码上,右键单击,选择Go To Definition of capGrabFrame,你会看到
    #define capGrabFrame(hwnd)((BOOL)AVICapSM(hwnd, WM_CAP_GRAB_FRAME, (WPARAM)0, (LPARAM)0L))
    而继续察看AVICapSM宏你会看到其实是在调用SendMessage函数呢,对吧,其实就是在发送消息。至于消息谁处理了,我们就不去关心了,我们关心的是,发送消息后,系统会调用我们刚才注册的回调函数
    LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr) ;
    (9)好了,如果你单击按钮,capGrabFrame(m_hVideo)就发送消息了,然后,我们就进入回调函数了,这太好了。
    看到回调函数传递的两个参数了么?我们更关心第二个参数,这个就是单击按钮我们捕捉到的一桢数据的入口啊!
    LPVIDEOHDR是结构体VIDEOHDR的指针,而在MSDN中察看结构体VIDEOHDR,我们就可以找到桢数据的存贮位置指针了。

    VIDEOHDR定义如下:
    typedef struct videohdr_tag {
    LPBYTElpData;
    DWORDdwBufferLength;
    DWORDdwBytesUsed;
    DWORDdwTimeCaptured;
    DWORDdwUser;
    DWORDdwFlags;
    DWORD_PTRdwReserved[4];
    } VIDEOHDR, NEAR *PVIDEOHDR, FAR * LPVIDEOHDR;
    看到结构体中第一个参数了么?这个就是我们想要的桢数据的指针!后面参数,包括缓冲区长度等。
    (10)终于得到了缓冲区的数据,可是,又一个问题出现了,缓冲区中的数据到底具体是啥含义啊?
    这桢图像多大啊?size是多少乘多少的啊?就是我们想要的像素信息么?
    好的,我先告诉你,缓冲区中全部是像素信息,我们照着我的步骤这样做,其实是默认了一些参数,包括图像的
    长度,宽度,色彩数,等等,那么,这个默认的值是多少呢?
    (11)用一下capGetVideoFormat宏吧,你会得到想要的东西。
    BOOL CGraspDlg::OnInitDialog()中继续添加如下代码:
    BITMAPINFO bmpInfo;
    capGetVideoFormat(m_hVideo,&bmpInfo,sizeof(BITMAPINFO));
    BITMAPINFO结构体内容自己看MSDN.定义如下

    typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUADbmiColors[1];
    } BITMAPINFO, *PBITMAPINFO;

    BITMAPINFOHEADER定义如下:

    typedef struct tagBITMAPINFOHEADER{
    DWORDbiSize;
    LONGbiWidth;
    LONGbiHeight;
    WORDbiPlanes;
    WORDbiBitCount;
    DWORDbiCompression;
    DWORDbiSizeImage;
    LONGbiXPelsPerMeter;
    LONGbiYPelsPerMeter;
    DWORDbiClrUsed;
    DWORDbiClrImportant;
    } BITMAPINFOHEADER, *PBITMAPINFOHEADER;

    加入步骤(11)的两句话,调试运行,我发现,bmpInfo.bmiHeader.biWidth320,就是采集的图像宽度;
    bmpInfo.bmiHeader.biHeight240,就是采集的图像高度,这些都是默认值,也可以改变这些值,通过
    capSetVideoFormat宏来实现。
    (12)那么,我们在步骤(9)中,回调函数第二个参数对应的结构体VIDEOHDR中,图像数据缓冲区的大小
    dwBufferLength是多少呢?我们可以在回调函数中加一个MessageBox函数,输出这个值,
    我们就可以发现,为230400,这个数很好,正好等于图像宽度X图像高度的3倍,
    也就是说,是图像像素数目的3倍,这就对了,每个像素用3个字节存储的嘛。好啦,我们知道了,桢缓冲区中,存储
    的完全是图像的像素信息,那么,具体哪个值对应哪个像素呢?
    存储顺序是这样的:先从图像最下面一行开始,从左向右,依次存储,每一个像素用连续的3个字节,分别为B(蓝色分量)
    G(绿色分量)R(红色分量)。然后存储倒数第二行,仍然按照图像从左向右存储,然后倒数第三行,
    倒数第四行。。。。。。等等,最后存储正数第一行。

    3 .关键函数:

    (1)capCreateCaptureWindow()::创建视频窗体

    (2)capDriverConnect(): 连接驱动

    (3)capGetStatus():获得视频状态

    (4)capPreviewRate():设置预览速率

    (5)capFileSaveAs():将视频转换成AVI文件

    (6)capFileSaveDIB():将视频转换成BMP文件

    (7)capGetUserData():获取用户定义的数据

    (8)capGetVideoFormat(): 获取视频格式

    (9)capGrabFrame():获取当前帧

    (10)capDlgVideoDisplay():设置显示的对话框

    (11)capCaptureSetSetup():设置视频捕获

    (12)capSetCallbackOnFrame():设置每帧的回调函数

    (13)capSetCallbackOnVideoStream():设置视频流的回调函数

    (14)capSetCallbackOnWaveStream():设置声音流的回调函数

     

    好啦,我所有想说的都说完啦,你明白了么?好累,现在是晚上,快10点钟了,我正好要去跑步去了。

    
    展开全文
  • vfw 摄像头

    2013-01-14 12:54:06
    vfw 摄像头
  • delphi vfw vfw.pas

    2012-05-09 18:04:18
    delphi 开发视频、音频程序必备,微软没有提供的vfw delphi版高人做的一个 delphivfw.pas
  • 驱动VFW工具

    2019-06-18 15:43:33
    关于vfw驱动摄像头 ,对于想要应用c++语言创建视频发开可作为参考
  • VFW视频捕捉

    2018-01-18 16:50:25
    摄像头视频采集常见的有两种方式:VFW方式和DirectxShow方式,上传一个典型的VFW视频捕捉例子供观摩。
  • x264vfw.zip

    2021-07-28 11:04:01
    x264vfw
  • VFW 视频通话

    2015-11-03 18:18:41
    VFW 视频通话.
  • VFW-示例 福赛大学 VFW 学生的课堂示例。 每个示例代表一个单独的 Titanium Studio 项目,可以导入和检查该项目以进一步理解该概念。
  • VFW视频捕获

    2013-07-31 10:37:55
    VFW视频捕获
  • 使用vfw生成视频时,所需要的一个依赖库
  • vfw开发总结.pdf

    2021-10-14 11:39:54
    vfw开发总结.pdf
  • VFW视频捕捉系统

    2017-11-30 13:31:07
    基于VFW的视频捕卡 VFW技术受到的很多批评,因它捕获的数据保存到磁盘上会占用大量磁盘空间,每秒数据量超过20M,(有人试验640*480窗口1s大约需要10M), 同时需要大量的客户端支撑软件,VFW体系架构上的不足在...
  • VFW(delphi摄像头视频控件),VFW(delphi摄像头视频控件),VFW(delphi摄像头视频控件)
  • vfw视频捕获

    2014-11-12 16:17:44
    用vc自带的vfw编写的摄像头视频捕获程序
  • VFW学习笔记

    2012-11-19 20:05:03
    VFW一些介绍 可以很好帮助初学者入门VFW
  • vfw相关知识

    2013-01-03 19:46:47
    vfw技术,学习vfw相关知识可以看看!视频相关!!
  • vfw技术显示摄像头

    2018-01-25 09:55:32
    基于vfw技术显示摄像头的MFC程序,能用,需要的可以参考一下
  • delphi vfw

    2011-05-05 10:13:08
    delphi 用vfw进行捕捉生成视频使用的是AVICap窗口类来开发视频捕获程序。AVICap类支持实时视频流捕获和单帧捕获,并提供对视频源的控制。通常使用的MCI控件虽然也提供了数字视频服务。并为视频叠加提供了Overlay命令...
  • vfw教材

    2008-06-25 04:35:39
    vfw vidio for windows 视频捕捉教材
  • VFW.pas_Delphi版VFW SDK

    热门讨论 2008-10-04 02:03:02
    微软的VFW SDK只有VC和VB版,并没有Delphi版vfw.pas 就是vfw.h的pas声明我找了很久了,公布出来。
  • vfw跟踪算法

    2012-10-18 21:05:18
    基于vfw的视频采集系统的设计与实现 基于vfw的视频采集系统的设计与实现 可以实时采集图像信息的算法 思想通俗易懂适合新手学习是不可多得的资料
  • VFW开发.doc

    2016-01-01 23:32:30
    VFW开发.doc很好用的资料 .doc
  • VFW介绍

    千次阅读 2013-05-19 23:48:40
    VFW VFW(Video for Windows)是Microsoft推出的关于数字视频的一个  VFW logo 软件开发包,VFW的核心是AVI文件标准。AVI(Audio Video Interleave)文件中的音、视频数据帧交错存放。围绕AVI文件,VFW推出了一...

    VFW

    VFW(Video for Windows)是Microsoft推出的关于数字视频的一个
    VFW logo

      VFW logo

    软件开发包,VFW的核心是AVI文件标准。AVI(Audio Video Interleave)文件中的音、视频 数据帧交错存放。围绕AVI文件,VFW推出了一整套完整的 视频采集、压缩、 解压缩、回放和编辑的 应用程序接口(API)。它引进 AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,在AVI文件中交替存储视频帧和与之相匹配的音频数据。VFW给 程序员提供.VBX和AVICap 窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。现在用户不必专门安装VFW了,Windows95本身包括了Video   for   Windows1.1,当用户在安装Windows时,安装程序会自动地安装配置视频所需的组件,如设备驱动程序、视频压缩程序等。 由于AVI 文件格式推出较早且在数字视频技术中有广泛的应用,所以VFW仍然有很大的实用价值,而且进一步发展的趋势。
    VFW主要由以下六个模块组成:  
    (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相似的服务,不同的是它适于波形音频。  
    Visual   C++在支持VFW方面提供有vfw32.lib、   msacm32.lib   、winmm.lib等类似的库。特别是它提供了功能强大、简单易行、类似于MCIWnd的 窗口类AVICap。AVICap为应用程序提供了一个简单的、基于消息的接口,使之能访问视频和波形音频硬件,并能在将 视频流捕获到硬盘上的过程中进行控制
    在VC++开发环境中调用VFW和使用其它开发包没有什么不同,只是需要将VFW32.lib文件加入工程中,但在开放视频捕捉与压缩管理程序时需要其它软件硬件设置。VFW为AVI文件提供了丰富的处理函数和宏定义,AVI文件的特点在于它是典型的 数据流文件,它由 视频流音频流、文本流组成。所以对AVI文件的处理主要是处理文件流。
    展开全文
  • vfw图像理解

    2012-04-22 10:54:16
    图像理解,视频开发,vfw,好书,directshow

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,329
精华内容 2,131
关键字:

vfw