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]
发布评论