当前位置:首页 > 消费电子 > 消费电子
[导读]文中详细介绍了如何利用VFW在Delphi中开发视频捕获程序的步骤,同时给出了程序实例。

摘要:许多关于视频的软件(如视频会议、可视电话等)开发都应用于视频捕获技术。微软为软件开发人员提供了一个专门用于视频捕获的VFW SDK,从而为在Windows系统中实现视频捕获提供了标准的接口,并大大降低了程序的开发难度。由于VFW SDK只有VC和VB版,没有Delphi版,因此需要在Delphi中一一声明DLL中的各个函数和变量。文中详细介绍了如何利用VFW在Delphi中开发视频捕获程序的步骤,同时给出了程序实例。

    关键词:Delphi Video for Windows 视频捕获

1 引言

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

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

表1 VFW功能模块

模  块 功      能
AVICAP.DLL 包含执行视频捕获的函数,它给AVI文件的I/O处理和视频、音频设备驱动程序提供一个高级接口
MSVIDEO.DLL 包含一套特殊的DrawDib函数,用来处理屏幕上的视频操作
MCIAVI.DRV 包括对VFW的MCI命令解释器的驱动程序
AVIFILE.DLL 包含由标准多媒体I/O(mmio)函数提供的更高的命令,用来访问.AVI文件
ICM 压缩管理器,用于管理的视频压缩/解压缩的编译码器(Codec)
ACM 音频压缩管理器,提供与ICM相似的服务,适用于波形音频

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窗口类的回调函数可以满足各种需求,但要注意从视频卡中捕获的视频数据的格式和图像的长宽要参考视频卡的参数。另外,有些视频卡通过设置可支持多种格式和图像长宽,所以,在还原图像时,要注意参考所用的视频卡的参数。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

上海2024年4月16日 /美通社/ -- 4月14日,为期四天的第89届中国国际医疗器械博览会(CMEF)盛大收官。澳鹏Appen很荣幸再次作为唯一的人工智能训练数据参展商参与此次"航母级"规模医疗...

关键字: APP 医疗器械 PEN 模型

移动通信对人类社会的影响,从来没有象今天这样深刻和广泛,从社交APP到掌上银行、从云会议到导航APP、从掌上理财到手机游戏等等

关键字: 移动通信 APP GSM

杭州2023年9月22日 /美通社/ -- 9月18日-22日,备受瞩目的第十四届中国国际石油化工大会在浙江宁波盛大开幕。大会以"驾驭不确定性 共促绿色复苏"为主题,汇聚了全球优秀的石油化工企业和专家...

关键字: 数字化 控制系统 智能化 APP

上海2023年9月21日 /美通社/ -- 9月21日,兄弟(中国)商业有限公司在北京举办以"启云In 慧工作 享生活"为主题的新品发布会,共三十余款产品...

关键字: 激光打印 缝纫机 数码 APP

北京2023年9月21日 /美通社/ -- 中国领先的科技益智产品企业洪恩(纽约证券交易所股票代码:IH)(“洪恩”或“公司”)今天公布了截至2023年6月30日的第二季度未...

关键字: BSP APP COM AN

亚特兰大2023年9月16日 /美通社/ -- 在2023年AppMarket解决方案大奖中,低代码软件开发领域的先驱和领导者Xebia荣获跨行业价值奖。 这一认可凸显了X...

关键字: APP MARKET PPM PI

(全球TMT2023年9月8日讯)全新宝丽来Polaroid I-2相机发布,配备品牌迄今为止最锐利的镜头和内置手动控制系统。I-2的核心,在于一个连续自动对焦的三镜片系统,能让使用一体式胶片的宝丽来相机带来令人印象深...

关键字: POLAR 相机 自动对焦 APP

商家可在WhatsApp建构商店,顾客更可透过对话下单(Chat-to-Order)功能选择取货门店,并使用WhatsApp传送付款链接 善用Meta不同的广告平台,能为商家带来更高的流量及转化率 3香港使用Wh...

关键字: APP SAP NI IC

深圳2023年8月31日 /美通社/ -- 9月1日,招商信诺人寿保险有限公司(以下简称为“招商信诺人寿”)2023年客户节正式在全国启动。本次客户节活动将持续为期两个月的时间,以“健康生活,诺+掌握”为主题,推出从理赔...

关键字: 医疗服务 APP BSP 温度

上海2023年8月30日 /美通社/ -- Brother发布新版标签编辑APP——iPrint&Label云共享版*。该版本创新推出"云共享标签"...

关键字: APP LABEL PRINT IP
关闭
关闭