2024年3月29日发(作者:)

维普资讯

第22卷第3期 

黄石理工学院学报 

V01.22 No.3 

2006年5月 

JOURNAL OF HUANGSHI INSTITUTE OF TECHNOLOGY 

May 2006 

文章编号:1008—8245(2006)03—0030一o4 

Visual Foxpro6.0在控制USB摄像头中的应用 

祁文青 

(黄石理工学院计算机学院,湖北黄石435000) 

摘 要:详细介绍了使用Visual Foxpro6.0调用V聊接口API函数对USB摄像头进行控制的方法,并用VF 

逐步生成了一个实用的拍照示例程序,展示了摄像头在VF中的应用前景。 

关键词:摄像头;视频V聊;DLL函数调用;USB 

中图分类号:TP311.52 文献标识码:B 

The Method of Controlling USB PC 

Camera In Visual Foxpro6.0 

Qi Wenqing 

(School of Computer and Information Engineering,Huangshi Institute Of Technology Huangshi Hubei 435003) 

Abstract:This paper introduces the method of controlling USB PC camera by replacing VFW§API function with Vis- 

tud Foxpro6.0.Then the author use8 the Visual Foxpm6.0 to write a sample program to take photo by using PC c岫- 

era,and predicts the prospect of the PC e ̄llera in Visual Foxpro. 

Key words:PC Camera;video;VFW;DLL function calling;USB 

随着电脑应用的逐步普及,各种电脑外部设 VFw接口的动态链接库位于Windows系统的 

备的运用也El益丰富。现在USB接口的摄像头以 

system32目录下的avieap32.dU文件中。对摄像 

其百元左右的价位已经成为大众化的产品,只是 

头的控制需要用到其中的二个函数。 

目前多用于视频聊天中。其实在数据库管理系统 

函数1.eapGetDriverDeseriptionA获取视频设备 

中,USB摄像头也是大有可为的。下面就介绍一 

描述,返回结果为0或1。这个函数用于视频设 

下其在Windows系统中的控制方法和它在Visual- 

备的初始化,通常用0和空字符串作为参数代入, 

Foxpm6.0中的应用方法。 

也可以用一个nDriverlD从0到n的循环代入,记 

录返回值为1的nDriverlD,这些数字就是有效的 

1 VFW接口函数及其API调用介 

视频设备号。 

绍 

函数2.eapCreateCaptureWindowA生成一个视 

频预览窗口,返回窗口句柄。在这个函数运行之 

前。首先要得到视频设备号以及父窗口句柄,并确 

VFw是Video for Windows接口系统的简称。 

定窗口的外形和大小。成功运行后返回一个不为 

它支持所有符合WDM驱动框架的视频设备。提供 

0的整数。即视频窗口句柄。 

了一些实用的API函数调用方法以实现实时的视 

另外,由于Windows系统中采用消息传送机 

频控制。利用VFⅣ接口API函数,我们可以对 

制,要想控制这个视频设备,就必须向这个视频窗 

USB摄像头进行控制,实现视频预览、拍照、录像、 

口发送消息,这就需要使用user32.dll动态链接 

调节视频格式等功能。 

库中的二个函数:函数3.SendMessageA和函数 

收稿日期:2004—11—10 

作者简介:祁文青(1968一),女,湖北黄石人,副教授,硕士。 

维普资讯

第3期 

4.SendMessage。 

祁文青;Visual Foxpro6.0在控制USB摄像头中的应用 31 

流程来控制摄像头了。现在要解决如下二个问 

题: 

这二个函数的区别在第四个参数上,一个传 

送字符串,而另一个传送整形值,并且通常为0。 

它们向指定的窗口传送系统预定义的消息代码和 

参数,使目标窗口完成指定的动作。 

在VFw接口系统中预定义了很多消息代码, 

下面列出一些常用的,详细的可以查询VisualStu— 

第一,视频窗口在哪里生成?在VF中,标准 

的控件并没有提供窗口句柄,而且也不支持外部 

的动态图像,但是,在VF的安装过程中,它自动 

装入了一个ActiveX HWND控件,文件是system32 

目录下的foxhwnd.OOX。这个控件提供了一个窗 

dio6.0中的vfw.h头文件。 

WM

CAP

START=1024&&偏移量 

WM

CAPDRIVER

——

CONNECT=WM

CAP

— 

START+10&&将设备和窗口连接起来 

WM

CAP

DRIVER

DISCONNECT=WM

CAP 

START+1 1&&断开设备和窗口的连接 

WMCAPFILE

——

SAVEDIB=WM

CAP

— 

START+25&&窗口图像存为BMP文件 

WM

CAP

EDIT

COPY=WM

CAP

START 

+30夹&&窗口图像存到剪贴板 

WM

CAP

DLG

VIDEOFORMAT=WM

CAP

— 

START+41&&调出视频格式对话框 

WM

CAP

DLG

VIDEOSOURCE=WM

CAP

— 

START+42&&调出视频源对话框 

WMCAP

SET

PREVIEW=WM

START 

CAP

+50&&视频窗口预览开关 

WMCAP

SET

PREVIEWRATE=WM

———

CAP

— 

START+52&&设置视频预览帧率 

WMCAPSETSCALE=WM

——

CAP

START+ 

53&&视频窗口缩放开关 

综上所述,使用API函数控制摄像头应采用 

如下流程: 

(1)调用capGetDriverDescriptionA函数,找到摄 

像头的设备ID各设备描述。 

(2)调用capCreateCaptureWindowA函数生成视 

频预览窗口。 

(3)使用Windows消息传递机制,对视频预览 

窗口发出各种控制消息代码(命令),完成我们指 

定的功能。 

下面就来介绍如何在VisualFoxpm中控制摄像 

头。 

2在Visual Foxpro6.0中控制摄像 

头的方法 

在VisualFoxpm6.0中可以像使用内部函数一 

样使用API函数,这样我们就可以按上面提到的 

口,其他的ActiveX控件和程序可在其中显示图 

象、图标和Windows元文件,关键是它还提供了窗 

口句柄用于API的应用。这样,我们可以用一个 

HWND控件,在其内生成视频预览窗口l 。 

第二,如何调用API函数?在VF中可以用 

Declare命令定义32位API函数,然后在程序中就 

如同使用一般的内部函数一样进行调用。Declare 

的命令格式如下: 

DECLARE[cFunctionType]FunctionName IN Li— 

braryName[AS AliasName] 

[cParamType1[@]ParamName1,cParamType2 

[@]ParamName2,...] 

参数说明如下: 

cFunctionType表明32位Windows.DLL函数 

是否有返回值。如果函数有返回值,则包含 

cFunctionType,否则省略。 

FunctionName指定在VF中要注册的DLL函数 

名。注意Function_Name区分大小写。DLL函数名 

可以与Win32 API手册中规定的不同。如果指定 

的DLL函数与一个VF函数同名,或者函数名不 

是合法的VF函数名,则将DLL函数名作为Func— 

tionName,并用As子句给该函数赋一个合法的VF 

函数别名。 

IN LibraryName指定外部DLL的名称,该动态 

链接库包含FunctionName指定的32位DLL函数。 

如果LibraryName指定为WIN32API,则VF就在 

kernel32.dll、gdi32.dl1、user32.dll、mpr.dll和ad— 

vapi32.dll中搜索32位DLL函数。 

AS AliasName为一个与VF函数同名或不合法 

的32位DLL函数名指定别名。AliasName不能是 

VP的保留字或已经由VF注册的DLL函数名。 

可使用AliasName去调用DLL函数。AliasName不 

区分大小写。 

cParmaeterType 1[@]ParmaName 1,cParameter- 

Type2[@]ParamName2,...指定传递给Win— 

dows 32位.DLL函数的参数类型。 

如果参数不是DLL函数所需要类型,VF产生 

个错误。Null值可以作为字符串传递。 

维普资讯

32 黄石理工学院学报 2006年 

调用函数时,若按引用传递一个参数,必须在 

这条命令的参数cParameterType后面、在调用函数 

相应变量前面包含@。如果在DECLARE中或在 

调用函数中没有包含@,参数就按值传递。因为 

API函数都是用C语言定义的,在VF中运用时就 

要特别注意变量类型方面的的问题。有关引用 

DLL函数的详细内容,请参阅《Microsoft Win32编 

程指南>一书。 。 

下面我们在VF中编写一个使用USB摄像头 

进行拍照的例子。 

首先启动VF6.0,生成一个新表单,在其中加 

入三个按钮,一个图片框和一个HWND控件,如 

图1所示。 

图1 示例程序表单界面 

HWND控件的加入方法是:选中VF的“工 

具”菜单,选择“选项”,在出现的选项对话框中选 

择控件页面,如图2所示,点添加按钮,在出现的 

对话框中选择Windows系统目录中的System32目 

录下的foxhwnd.OCx文件,再在如图2中找到 

HWND控件,确定即可在VF的控件工具栏里加入 

HWND控件【引。 

表单中的HWND控件和image控件的大小都 

设为320 240,HWND控件命名为player,三个命 

令按钮的Caption属性分别设为“Capture”、 

“Source”、“Format”,功能为“拍照”、“选择视频 

源”和“选择视频格式”。 

双击表单空白处,在Form1的Load过程中输 

入如下初始化代码: 

public WM

. 

CAP

——

START,WM

——

CAP.。DRIVER

—— 

CONNECT,WMCAP..SETSCALE 

_

..

public WM

..

CAP

..

DRIVER

—.

DISCONNECT,WM 

CAP FILE SAVEDIB 

图2添加ActiveX控件 

public WM—CAP

SET

PREVIEW,WM

CAP

— 

SET PREVIEWR A IE 

public WM

CAP

DLG

VIDEOFORMAT,WM

— 

CAP

DLG

VIDEOS0URCE 

WM

CAP—S I'ART=1 024 

WM

CAP

D砒VERCAP

CONNECT=WM

— 

s1【'ART+10 

WM

DRIVER

CAP

——

DISCONNECT=WM

CAP 

sTART+l1 

WM

CAPFILE

SAVEDm=WM

CAP

— 

——

START+25 

WM

DLG

CAP

VIDEOF0RMAT=WM

CAP

— 

S IIART+41 

WM

CAP—DLG

VIDEOSOURCE=WM—CAP

— 

s1【'ART+42 

WM

CAP

SET

PREVIEW=WM

CAP

S姒RT 

+5O 

WM

CAP

SET

PREVIEWRA rE=WM

CAP

— 

S I.ART+52 

WM

CAP

SET

SCALE=WMCAPS rART+ 

53 

declare integer capGetDriverDescriptionA in avi- 

cap32.dIl; 

integer nDriverlD,string@cDfiverName,integer 

nNameLength,; 

string@cDriverVersion.integer nVersionLength 

declare integer capCreateCaptureWindowA in avi— 

cap32.dll; 

string cWindowName,integer nDwStyle,; 

integer x,integer y,integer nWid山,integer 

nHeight,; 

integer hWndParent,integer nDriverlD 

维普资讯

第3期 祁文青:Visual Foxpro6.0在控制USB摄像头中的应用 

declare integer SendMessageA in user3 2; 

integer hwndPlay,integer nMsg,; 

integer nParam,string clParam 

declrae integer SendMessage in user3 2; 

integer hwndPlay,integer nMsg,; 

integer nParam,integer nlParam 

在Form1的Init过程中输入如下代码: 

Public hwndC&&视频窗口句柄 

lpszName=space(100) 

IpszVer=space(100) 

IResult : capGetDriverDescriptionA(0, @ 

lpszName,1O0,@lpszVer,100) 

IpszName:alltrim(strtran(1pszName,chr(0), 

,)) 

lpszVer=alhrim(strtran(IpszVer,chr(0),’) 

hwndC= 

capCreateCaptureWindowA (@ IpszName, 

I342963712,0,0,320,240,thisform.player. 

hWnd,0) 

cMsgStatuBuffer=space(255) 

cMsgErrorBuffer=space(255) 

=sendMessage(hwndC,WM—CAP—DRⅣER— 

CONNECT,0,0) 

=SendMessage(hwndC,WM—CAP—SET— 

SCALE,1,0) 

=SendMessage(hwndC,WM—CAP—SET—PRE- 

VIEWRATE,66,0) 

=SendMessage(hwndC,WM—CAP—SET—PRE- 

V正W,1,0) 

在拍照按钮的Click过程中输入如下代码: 

SendMessageA(hwndC,WM—CAP—FILE— 

SAVEDIB,0,“bmpfile.bmp”) 

 ̄isform.image1.picture=“bmpfilename.bmp” 

生成一个名为bmpfile.bmp的图像文件,并将 

它在图像控件中显示出来。 

在Format按钮的Click过程中输入如下代码: 

SendMessage(hwndC,WM—CAP—DLG— 

VIDEOFORMAT,0,0) 

显示视频格式对话框,可调整图像格式。 

在Source按钮的Click过程中输入如下代码: 

SendMessgae(hwndc,WM—CAP—DLG—VID— 

EOSOURCE,0,0) 

显示视频源对话框,如有多个视频源,可选择 

不同的设备。 

至此,这个表单编写完毕,保存运行就可以用 

摄像头进行抓拍了。 

3 结束语 

VFw接口系统是微软最初在Windows3.1系 

统中推出的,其主要缺点是视频流的速度不够快, 

它的功能将逐步为DirectX技术所替代,但在对技 

术要求不高的低成本系统中仍有广泛的应用,所 

以目前仍保留在Windows98、Windows2000、XP及 

Windows2003系统中。如果想用DirectX方法来使 

用摄像头,最好是用VC调用DirectX的API编一 

个控制摄像头的ActiveX控件,这样,在各种Win- 

dows的开发系统中都能方便地使用了。 

USB接口的摄像头价格便宜,使用方便,而 

VF是应用广泛的小型数据库系统,二者相结合互 

相补充,能完满地应用于各种多媒体数据库应用 

系统中。例如,在学生报名时,使用摄像头拍下学 

生的照片和各种证件存档;替代扫描仪用于图文 

数据库的录入;使用数据库系统管理实时录象文 

件和抓拍照片的文件,可建成简易的监控系统,等 

等。希望本文对想进行摄像头视频应用的人们有 

些帮助。 

参考文献 

[1]李春葆.Visual Foxpro6.0高级编程(ActiveX控件、 

多媒体和lnternet应用篇)[M].北京:科学出版社, 

2001:35—68 

[2]MicroSoft Corp.MSDN Library Visual Studio6.0[OL]