硬件准备
1. 能运行Windows 98或更高的计算机。
2. USB接口摄像头一只。
将USB摄像头接入电脑,安装好驱动程序和应用软件,打开应用软件,在Video Format设置中将其Image Size(图像尺寸)设为CIF(352×288)。
软件准备
1. Visual Foxpro(6.0以上版本,以下简称VFP)。
2. AvCap.ocx控件
AvCap是一个基于DirectShow过滤器的音/视频捕捉和预览的ActiveX控件。在应用程序或页面中放一个AvCap,只需很少的代码就可让您的软件支持音/视频捕捉了。
3. PicClp32.ocx控件(类名PictureClip)。
本控件位于Windows的System或System32文件夹内,在安装VFP时被自动安装。
由于使用AvCap控件所捕捉的图像尺寸与实际应用时的图像尺寸不太一致,因此需用PictureClip控件将其剪裁为指定尺寸。用它的Picture属性将源位图加载到控件中,再用ClipX和ClipY属性指定剪裁区域的左上角。用 ClipHeight和ClipWidth属性指定剪裁区域的范围。然后利用VFP的SavePicture函数将其写入到指定的位图文件中。
编程
1. 准备工作
(1)为便于管理,在某驱动器(如D盘)的根目录下建一子目录Photo,将下载的AcCap.ocx控件拷入该目录,用“画笔”程序画一图像,高×宽=288×216(如图1),命名为Default.bmp,将其保存入Photo目录。在本目录下再建一子目录Bmp,用于存放拍照的照片。
图1 默认图片
(2)建一数据库表Student.dbf,将其存入Photo目录,表结构如图2。
图2 数据表
在图2所示表中,索引类型设为“候选索引”的目的是保证学生在数据库表中的惟一性。在电子照相时,以学号作为该学生的照片文件名,可避免重复。xh(学号)字段的8位可按如下格式输入,如20040001,其中前四位代表入学年级,后四位代表学生序列,学号范围从20040001至20049999。
(3)注册控件:可在命令行方式下注册两个控件,如:regsvr32 AvCap.ocx、regsvr32 PicClp32.ocx,也可在VFP环境中,通过菜单“工具→选项→控件→ActiveX控件”方式来注册。
2. 制作表单
(1)运行VFP,建立如图3所示的表单集Formset1,添加两个表单Form1和Form2。设置Form1的Caption属性为预览窗口,在其内添加AvCap控件,控件的Name属性设为OleAvCap;设置Form2的Caption属性为照相窗口,在其内添加如图3所示的6个控件(图像剪裁控件PictureClip、图像控件Image、列表框控件List、命令按钮控件CommandButton三个),控件的Name属性分别设为OlePicClip 、Image1、List1、CmdPhoto、CmdNext、CmdQuit。
图3 制作表单
(2)将数据库表Student.dbf添加到该表单集的数据环境中去,将CurSor1的Order属性设为xh。
(3)编写程序代码:
在Formset1的Init Event(即Formset1.Init)中添加以下代码:
IF thisformset.form1.oleAvCap.CurVcd=0
thisformset.form1.oleAvCap.PlayState
=1
ELSE
=Messagebox("视频设备连接不上! "+chr(13)+"请检查电源线或数据线!", 0+16,"错误信息!")
RETU .F.
ENDIF
thisformset.form2.CmdPhoto.setfocus
在Form1的Init Event(即Form1.Init)中添加以下代码:
this.Left=3
this.Top=1
this.Width=216 &&&&&&与下面要拍照的照片宽度一致
this.Height=312
this.MaxButton=.F.
this.MinButton=.F.
this.ControlBox=.F.
this.BorderStyle=1
this.Caption="预览窗口"
*****以下设置AvCap控件的大小及位置
this.OleAvCap.Top=12
this.OleAvCap.Width=352
this.OleAvCap.Height=288
this.OleAvCap.Left=-(352-216)/2
&&&&&&将本控件居中,保证视频流中人像居中
在Form2的Init Event(即Form2.Init)中添加以下代码:
this.Left=228
this.Top=1
this.Width=394
this.Height=394
this.MaxButton=.F.
this.MinButton=.F.
this.ControlBox=.F.
this.BorderStyle=1
this.Caption="照相窗口"
*****以下设置image控件的大小、位置等属性
this.image1.Left=10
this.image1.Top=12
this.image1.Width=216
this.image1.Height=288
this.image1.BorderStyle=1
IF file('bmp/'+xh+'.bmp')
this.image1.picture='bmp/'+xh+'.bmp'
ELSE
this.image1.picture='default.bmp'
ENDIF
*****以下设置List控件的大小、位置等属性
this.List1.ColumnCount=2
this.List1.Left=236
this.List1.Top=12
this.List1.Width=148
this.List1.Height=288
this.List1.FontSize=12
this.List1.RowSourceType=0
this.List1.RowSource="student.xh,xm"
this.List1.RowSourceType=6
this.List1.ListItemId=1
在List1的InteractiveChange Event中添加以下代码:
*****以下代码保证记录变动后,学生照片跟着刷新
IF file('bmp/'+xh+'.bmp')
thisform.image1.picture='bmp/'+xh+'.bmp'
ELSE
thisform.image1.picture='default.bmp'
ENDIF
thisform.CmdPhoto.setfocus
在CmdPhoto的Click Event(CmdPhoto.Click)中添加以下代码:
IF file('bmp/'+xh+'.bmp')
?chr(7)
nChoice=Messagebox("照片已存在!"+chr(13)+chr(13)+"替换吗?", 4+32+256,"提示信息!")
IF nChoice=6 &&&&&&&&&&&&&&&&&&选择YES
****以下代码先抓取当前视频流中的一幅图像将其保存为大照片 ****
thisformset.form1.OleAvCap.TakePictureToFile('bmp/'+xh+'.bmp')
****以下代码通过PicClip32.ocx控件将大照片剪裁为小照片*******
thisform.OlePicClip.picture=loadpicture('bmp/'+xh+'.bmp')
thisform.OlePicClip.clipx=(352-216)/2+1
thisform.OlePicClip.clipy=0
thisform.OlePicClip.clipheight=288
thisform.OlePicClip.clipwidth=216
SavePicture(thisform.OlePicClip.clip,'bmp/'+xh+'.bmp')
ENDIF
ELSE
thisformset.form1.OleAvCap.TakePictureToFile('bmp/'+xh+'.bmp')
thisform.OlePicClip.picture=loadpicture('bmp/'+xh+'.bmp')
thisform.OlePicClip.clipx=(352-216)/2+1
thisform.OlePicClip.clipy=0
thisform.OlePicClip.clipheight=288
thisform.OlePicClip.clipwidth=216
SavePicture(thisform.OlePicClip.clip,'bmp/'+xh+'.bmp')
ENDIF
thisform.List1.InteractiveChange &&&&刷新照片
this.parent.CmdNext.setfocus &&&&与CmdNext按钮转换焦点实现轻松拍照
在CmdNext的Click Event(CmdNext.Click)中添加以下代码:
thisform.List1.ListItemId=thisform.List1.ListItemId+1
thisform.List1.InteractiveChange &&&&刷新照片
this.parent.CmdPhoto.setfocus &&&&与Cmdphoto按钮转换焦点实现轻松拍照
在CmdQuit的Click Event(CmdQuit.
Click)中添加以下代码:
thisformset.release
至此,程序编写完毕,按按钮运行程序就可进行电子照相了。照相过程非常方便,只需按回车键或空格键就可轻松采集照片。要保证照片质量,USB摄像头最好固定,并且保证光线明亮、均匀、自然、柔和。