人脸识别考勤系统中照片采集过程的分析与实现
来源:中国一卡通网 作者:中国一卡通收录 发布时间:2012-01-07 09:36:07 字体:[大 中 小]
关键字:人脸识别 考勤 数据采集
摘 要:本文主要介绍人脸识别考勤系统中人脸照片的采集和显示过程 ,开发环境为 Visual C+ + 6.0,以 Mi2 crosoft的 Video for Windows(VFW)为核心 ,利用摄像头进行人脸照片的采集并通过接口程序保存到数据库。
五、关键程序代码
(一) 采集照片
1. 在头文件中定义摄像头相关的控制成员变量
HWND m-hWndCap ; PP定义视频捕捉窗口
CAPDRIVERCAPS m-CapDriverCaps ; PP捕获驱动器的性能
CAPSTATUS m-CapStatus ; PP捕获窗口的当前状态
2. 启动摄像头
//创建视频捕捉窗口
m-hWndCap = capCreateCaptureWindow (- T ( ”人脸录入”) ,WS-CHILD| WS-VISIBLE , CAMERA-LEFT ,CAMERA- TOP , CAMERA-WIDTH , CAMERAHEIGHT,m-hWnd ,0) ;
/*第一个参数指定捕捉窗口的名称,第二个参数指定捕捉窗口的样式,第三、四个参数指定捕捉窗口的左上角的位置坐标,第五、六个参数指定捕捉窗口的宽度和高度,第七、八个参数分别是捕捉窗口的父窗口的句柄和编号。*/
/*将捕捉窗与默认摄像头连接,如果连接成功则获得捕获驱动的性能,放在结构变量m-Cap2 DriverCaps 中*/
if (capDriverConnect (m-hWndCap ,0) )
capDriverGetCaps ( m-hWndCap , &m-CapDriver2Caps ,sizeof (CAPDRIVERCAPS) ) ;
//如果摄像头支持叠加显示模式则启用叠加显示模式
if (m-CapDriverCaps. fHasOverlay)
capOverlay(m-hWndCap ,TRUE) ;
else
{
capPreviewRate (m-hWndCap ,66) ; //设置预览模式的显示速率
capPreview(m-hWndCap , TRUE) ; //启用预览模式
}
至此,如果摄像头正常安装了驱动,就能正常工作了。
3. 采集并预览照片
界面上左边是捕捉窗口,右边留有和捕捉窗口同样大小的区域用于预览或显示捕捉到的照片。
capGrabFrameNoStop (m-hWndCap ) ;//捕捉照片且捕捉窗口画面不停止
capFileSaveDIB ( m-hWndCap , ” \ employee.bmp”) ; //保存捕捉到的照片
//获得照片句柄用于在界面显示捕捉到的照片
m-hPhotoBmp = (HBITMAP) LoadImage (AfxGetIn2stanceHandle ( ) ,”\ employee. bmp”,IMAGE-BITMAP ,0 ,0 ,LR-CREATEDIBSECTION| LR-LOADFROMFILE) ;
/*第一个参数取应用程序实例句柄,第二个参数指定照片的路径及名称,第三个参数指定照片的类型,第四、五个参数指定照片的宽和高,为零则使用图像默认大小, 第六个参数LR- CREATEDIB2SECTION:当图像类型为IMAGE-BITMAP 时,使函数返回一个DIB 位图,而不是一个兼容的位图。LRLOADFROMFILE:根据照片的路径和名称装载图像。*/
Invalidate (FALSE) ; PP重绘窗口显示照片
为了在界面显示照片还需添加绘图函数On2Paint () :
//在界面添加picture 控件,命名为IDC-STATICPICTURE,并指定图片控件
CPaintDC dcPicture ( GetDlgItem( IDC-STATIC- PIC2TURE) ) ;
CRect rectPic ; //定义矩形区域
GetDlgItem( IDC-STATIC- PICTURE) - > GetClien2tRect (&rectPic) ; //指定在图片控件上
CDC memDC; //建立与显示设备兼容的内存设备场境
memDC. CreateCompatibleDC(&dcPicture) ;
memDC. SelectObject (m-hPhotoBmp) ; //将位图选入内存场境
//调用缺省的窗口过程来为没有处理的窗口消息提供缺省的处理
CWnd : :DefWindowProc (WM- PAINT , (WPARAM)memDC. m-hDC ,0) ;
dcPicture. BitBlt ( rectPic. left , rectPic. top , rectPic.Width() ,rectPic. Height () ,&memDC ,0 ,0 ,SRCCOPY) ;
/*显示位图。前四个参数分别指定显示图片的左上角顶点的位置坐标,和图片的宽高,第五个参数表示源设备场景的地址,第六七两个参数表示显示图片的左上角顶点在源设备环境的矩形区域中的坐标,最后一个参数表示将源矩形图象直接复制到目标矩形上。*/
4. 保存照片到数据库
先把捕捉到的位图文件转化成二进制数据,然后通过接口函数保存到数据库中。对数据库的操作请参考DAO 或ADO 编程。
CFile bmpFile ; //定义文件类变量
if (bmpFile. Open (”\ employee. bmp”,CFile : :mo2deRead) )//读模式打开照片文件
{ LONG nLength = bmpFile. GetLength() ; //获得照片的文件长度
unsigned char 3 pData = new unsigned char [ nLength ] ; //申请内存空间
//如果申请到空间就读数据到缓冲区,即得到二进制数据
bmpFile. Read(pData ,nLength) ;//读照片文件到缓冲区
bmpFile. Close () ; //关闭文件
}
Employee. SavePicture ( EmployeeID , &pData ,nLength) ;//对数据库访问接口
bmpFile. Remove (”\ employee. bmp”) ; //删除临时文件夹里生成的位图文件
delete[ ] pData ; //释放内存中申请的缓冲区
5. 断开摄像头
capDriverDisconnect (m-hWndCap) ; //断开摄像头(二) 显示数据库中的照片前面已经实现照片的预览功能,现在只要从数据库取出照片数据,生成位图文件,取得位图的句柄显示问题就解决了。
//通过数据库接口得到照片的文件长度(nLength) 和二进制照片数据的地址pData 。
unsigned char 3 pData = NULL ; //定义字符型指针变量
employee. GetPicture ( &pData , &nLength) ; //取照片数据
//如果取到照片数据则生成位图文件
CFile outFile ( ”\ employee. bmp”, CFile : : mode2Create| CFile : :modeWrite) ;
outFile.WriteHuge ( (LPSTR) pData ,nLength) ;
outFile. Close () ;
//取得生成图片的句柄
六、总结
Visual C + + 提供的AVICap 窗口类为VC 的数字视频采集提供了很大的方便,极大增强了VC 多媒体程序开发的能力。本文所描述的照片采集的过程便是基于此技术,并且已经在人脸识别考勤系统中作为人脸录入模块使用,该模块负责在系统最初运行时对人脸信息采集或是对已有人脸信息进行更新时使用。经过多次测试该模块运行稳定,可以满足需求。
新闻投稿合作邮箱:yktchina-admin@163.com 字体[大 中 小] [收藏] [进入论坛]