网站首页 | 经济学论文 | 证券金融 | 管理学 | 会计审计 | 法学论文 | 医药学论文 | 社会学论文 | 教育论文 | 计算机 | 艺术论文 | 哲学论文 | 财务管理 |
写论文网
  • 民法论文
  • 经济法论文
  • 国际法论文
  • 法学理论论文
  • 司法制度论文
  • 国家法论文
  • 宪法论文
  • 刑法论文
  • 行政法论文
  • 您的位置:写论文网 > 法学论文 > 行政法论文 > 捕获视频 基于Delphi的VFW视... 正文 2019-12-26 07:27:32

    捕获视频 基于Delphi的VFW视频捕获程序的开发

    相关热词搜索:

    基于Delphi的VFW视频捕获程序的开发

    基于Delphi的VFW视频捕获程序的开发 关键词:Delphi Video for Windows 视频捕获 1 引言 视频捕获与实时处理是目前图像处理系统中最关键的技术之一,能否准确 捕获指定的视频图像,进而实现精确地数据分析与处理,关系到整个系统的成败。

    笔者在开发“公路安全线轧压检测系统”时就遇到此情况。该系统主要研究在公路 关键地段,过往机动车辆是否瞬间轧压黄色安全线。因此车辆轧压安全线的一个 主要原因是车辆超车或逆向行使而违反了上下行规则,这是造成交通事故的最主 要、最直接的因素。本系统通过实时拍摄,抓取瞬间图像,并经过系统的分析和 处理来及时准确地检测车辆行驶情况,从而驱动控制设备以作出相关处理。

    显然,这个系统的关键之处是实时捕获视频图像。为此,采用微软公司推 出的关于数字视频的一个软件包VFW。它能使应用程序通过数字化设备从传统 的模拟视频源得到数字化的视频剪辑。VFW的一个关键思想是播放时不需要专 用硬件。为了解决数字视频数据量大的问题,需要对数据进行压缩,而VFW引 进了AVI的文件标准。该标准未规定如何对视频进行捕获、压缩及播放,仅规定 视频和音频该如何存储在硬盘上及在AVI文件中交替存储视频帧和与之相匹配 的音频数据。但VFW可使程序员通过发送消息或设置属性来捕获、播放和编辑 视频剪辑。当用户在安装VFW时,安装程序会自动地安装配置视频所需要的组 件,如设备驱动程序、视频压缩程序等。VFW主要由6个模块组成。具体如表1 所列。

    表1 VFW功能模块 2 视频捕获程序开发的基本步骤 2.1 使用AVICap窗口类 笔者使用的是AVICap窗口类来开发视频捕获程序。AVICap类支持实时视 频流捕获和单帧捕获,并提供对视频源的控制。通常使用的MCI控件虽然也提供 了数字视频服务。并为视频叠加提供了Overlay命令集等,但这些命令主要是基 于文件的操作,还不能满足实时地从视频缓存中提取数据的要求。对于使用没有 视频叠加能力的捕获卡的PC机来说,用MCI提供的命令集是无法捕获视频流的。而AVICap窗口类在捕获视频方面具有一定的优势,它能直接访问视频缓冲区, 而不需要生成中间文件,因而实时性很强,效率也很高。另外,它还可将数字视 频捕获到一个文件中。

    2.2 开发的基本步骤 开发视频捕获程序主要有以下四个步骤:
    (1)创建“捕获窗”。

    在进行视频捕获之前必需要先创建一个“捕获窗”,并应以此为基础进行所 有的捕获及设置操作。“捕获窗”可用AVICap窗口类的“Cap Create Capture Window”函数来创建,其窗口风格可设置为WSCHILD和WS_VISIBLE参数。

    “捕获窗”类似于标准控件,它具有下列功能:
    *将视频流和音频流捕获到一个AVI文件中;

    *动态地同视频和音频输入器件连接或断开;

    *以Overlay或Preview模式对输入的视频流进行实时显示;

    *在捕获时,可指定所用的文件名,并可将捕获文件的内容拷贝到另一个 文件;

    *设置捕获速率;

    *显示控制视频源、视频格式及视频压缩的对话框;

    *创建、保存或载入调色板;

    *将图像和相关的调色板拷贝到剪贴板;

    *将捕获的单帧图像保存到DIB格式文件。

    (2)关联捕获窗和驱动程序 单独定义的捕获窗是不能工作的,它须与一个设备相关联才能取得视频信 号。用函数CapDriver Connect可使捕获窗与其设备驱动程序相关联。(3)设置视频设备的属性 通过设置TcaptureParms结构变量的各个成员变量,可以控制设备的采样频 率、中断采样按键、状态行为。设置好TcaptureParms结构变量后,可以用函 CapCaptureSetSetup使设置生效。之后还可以用CapPreviewScale、CapPreviewRate 设置预览的比例与速度,也可以直接使用设备的默认值。

    (4)打开预览 利用函数CapOverlay可选择是否采用叠加模式预览,以使系统资源占用小, 视频显示速度加快。然后用CapPreview启动预览功能,这时就可以在屏幕上看到 来自摄像机的图像了。

    通过以上四步就可以建立一个基本的视频捕获程序,但如果想自己处理从 设备捕获到的视频数据,则要使用捕获窗回调函数来处理,比如一帧一帧地获得 视频数据或以流的方式获得视频数据等。

    3 基于Delphi的视频捕获程序 根据系统对系统访问、处理速度等方面的特殊需求,笔者选用Delphi作为 开发工具。下面以开发一个逐帧从视频设备上捕获视频数据的程序为例,来说明 每个函数的作用以及开发的具体过程。所给例程的功能是可以在屏幕上显示捕获 到的视频,并可以获得每一帧的图像数据。具体步骤如下:
    (1)新建一个工程,并将AVICAP32.PAS包含到USES中。

    (2)在Form1上放置一个Tpanel控件,设Name为“gCapVideoArea”,该控 件用于显示视频。之后再放置两个Tbutton控件,一个Name为“Openvideo”,另一个 Name为“Closevideo”。

    (3)定义全局变量 ghCapWnd:Thandle;

    //定义捕获窗句柄 VideoStr:LPVIDEOHDR;
    //可以得到视频数据指针的结构变量,用于回调 函数中 CapParms:TcaptureParms;

    //用于设置设备属性的结构变量(4)编写代码 在Name为“Openvideo”的Tbutton的Click事件中写入以下代码:
    procedure Tform1.OpenvidoClick(Sender:TObject);

    begin //使用Tpanel控件来创建捕获窗口 ghCapWnd:=CapCreateCaptureWindow(Pchar("KruwoSoft"), WS_CHILD or WS_VISIBLE, //窗口样式 0,//X坐标 0,//Y坐标 gCapVideoArea,Width, //窗口宽 gCapVideoArea,Handle, //窗口句柄 0);

    //一般为0 为了能够捕获视频,应启动一个捕获帧回调函数VideoStreamCallBack。捕 获一个视频流或当前设备状态时,应分别使用以下函数:
    CapSetCallbackOnVideoStream;
    //捕获一个视频流 CapSetCallbackOnError;

    //得到一个设备错误 CapSetCallbackOnStatus //得到一个设备状态 //定义一个帧捕获回调函数 CapSetCallbackOnFrame (ghCapWnd,LongInt(@VideoStreamCallBack));

    //将一个捕获窗口与一个设备驱动相关联,第二个参数是个序号,当系统 中装有多个显示驱动程序时,其值分别依次为0到总个数CapDreiverConnect(ghCapWnd,0);

    CapParms,dwRequestMicroSecPerFrame:=40000;

    CapParms.fLimitEnabled:=FALSE;

    CapParms.fCaptureAudio:=FALSE;//NO Audio CapParms.fMCIControl:=FALSE;
    CapParms.fYield:=TRUE;
    CapParms.vKeyAbort:=VK_ESCAPE;
    CapParms.fAbortLeftMouse:=FLASE;
    CapParms.fAbortRightMouse:=FALSE;
    //使设置生效 CapCaptureSetSetup(ghCapWnd,LongInt(@CapParms), sizeof(TCAPTUREPARMS));
    CapPreviewScale(ghCapWnd,1);
    CapPreviewRate(ghCapWnd,66);

    如果要捕获视频流,则要使用函数来指定不生成文件。否则将会自动生成 AVI文件:
    CapCaptureSequenceNoFile(ghCapWnd);

    指定是否使用叠加模式,1为使用,否则为0;

    CapOverlay(ghCapWnd,1);
    CapPreview(ghCapWnd,1);
    End;
    在Name为“Closevideo”的Tbutton的Click事件中写入以下代码:
    procedure TForm1.ClosevideoClick(Sender:Tobject);
    begin capCaptureAbort(ghCapWnd);
    //停止捕获 capDriveDisconnect(ghCapWnd);

    //将捕获窗同驱动器断开 end;

    定义捕获帧回调函数:
    function FrameCallBack(hWnd:HWND;lpVHdr:LongInt):LongInt;
    stdcall;

    var DataPoint:^byte;

    DibLen,RectWidth,RectHeight:integer;

    begin VideoStr:=LPVIDEOHDR(lpVHdr);
    DibLen:=VideoStr^.dwBufferLength;
    GetMem(DataPoint,64000);
    //将帧数据COPY到一个内存中,注意:DATAPOINT要先分配空间 CopyMemory(DataPoint,VideoStr^.lpData,Diblen);

    …… end;

    4 结束语 灵活地使用AVICap窗口类的回调函数可以满足各种需求,但要注意从视 频卡中捕获的视频数据的格式和图像的长宽要参考视频卡的参数。另外,有些视 频卡通过设置可支持多种格式和图像长宽,所以,在还原图像时,要注意参考所 用的视频卡的参数。

    • 范文大全
    • 教案
    • 优秀作文
    • 教师范文
    • 综合阅读
    • 读后感
    • 说说
    捕获视频 基于Delphi的VFW视频捕获程序的开发》由(写论文网)整理提供,版权归原作者、原出处所有。
    Copyright © 2019 写论文网 All Rights Reserved.