WPF:汉王人脸通通用人脸采集程序

运行环境:

.NET Framework 4 Client Profile

软件包清单(有简体中文版和繁体中文版):

Enroll.exe
Enroll.ini
EnrollService.dll

配置文件 Enroll.ini 内容:

; 登录设置
[LOGIN]
SERVICE=
USER=
TIMEOUT=5000

; 登记机设置
[DEVICE]
IP=
PORT=9922
CODEPAGE=65001
TEMPLATES=18
IDREADER=1

; 员工工号
[STAFFID]
LENGTH=18
MAXLENGTH=18
CASESENSITIVE=0
SILENTSUCCESS=1
STRANGER=1

配置文件 Enroll.ini 说明:

SERVICE 服务器端提供的Web Services服务连接地址
USER 用于自动保存最近的登录人员列表
TIMEOUT 设置登录Web Services的超时等待时间,默认5000毫秒
IP 用于自动保存最近连接的设备IP地址
PORT 人脸通设备的命令接收端口,默认为9922
CODEPAGE 设备的通信字符集编码,简体中文为936,繁体中文为950
TEMPLATES 单个人员的模板采集数,由人脸通设备决定
IDREADER 是否允许通过身份证读卡器自动输入信息。1:允许 0:不允许
LENGTH 工号固定长度,如果长度不固定,其值设为0
MAXLENGTH 工号长度不固定时,允许的最大长度
CASESENSITIVE 工号字母是否区分大小写。1:区分大小写 0:不区分大小写
SILENTSUCCESS 登记成功时不弹窗提示。1:不提示 0:提示
STRANGER 是否允许陌生人登记。1:允许 0:不允许

说明:目前身份证读卡器只支持北京昌贸技术有限公司的CM008系列

供用户实现的C#动态库 EnrollService.dll 参考代码(用户需要自己实现 EnrollService 类的5个方法):

/* ----------------------------------------------------------
 * 文件名称:EnrollService.cs
 * 
 * 作者:秦建辉
 * 
 * QQ:36748897
 * 
 * 博客:http://www.firstsolver.com/wordpress/
 * 
 * 开发环境:
 *      Visual Studio V2012
 *      .NET Framework 4 Client Profile
 *      
 * 版本历史:
 *      V1.0	2013年06月27日
 *              供用户实现的人脸登记服务动态库参考代码
------------------------------------------------------------ */
using Splash.Linq;
using System;

namespace Hanvon
{
    /// <summary>
    /// 人员信息
    /// </summary>
    public class EnrolledEmployee
    {
        /// <summary>
        /// 员工工号
        /// </summary>
        public String EmployeeId { get; set; }

        /// <summary>
        /// 员工姓名
        /// </summary>
        public String RealName { get; set; }     // 显示名称

        /// <summary>
        /// 员工昵称
        /// </summary>
        public String NickName { get; set; }     // 用于语音播报,如果为空,则播报姓名

        /// <summary>
        /// 人脸模板数据
        /// </summary>
        public String[] Templates { get; set; }  // Base64编码

        /// <summary>
        /// 人员照片
        /// </summary>
        public String Photo { get; set; }        // Base64编码
    }

    /// <summary>
    /// 人脸采集模块网络服务接口
    /// </summary>
    public class EnrollService
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="ServicesUrl">Web Services 服务连接地址</param>
        /// <param name="LoginTimeout">Web Services 连接超时时间</param>
        public EnrollService(String ServicesUrl, Int32 LoginTimeout)
        {
            // 完成Web Services接口调用初始化
        }

        /// <summary>
        /// 操作员登录校验
        /// </summary>
        /// <param name="UserName">采集人员账号</param>
        /// <param name="Password">采集人员密码</param>
        /// <param name="ErrorMessage">输出:错误信息提示</param>
        /// <returns>错误代码,0表示成功</returns>
        public Int32 Login(String UserName, String Password, out String ErrorMessage)
        {
            if (String.IsNullOrEmpty(UserName) || String.IsNullOrEmpty(Password))
            {
                ErrorMessage = "用户名和密码不能为空!";
                return -1;
            }
            else
            {   // 密码限定为“123456”
                if (Password.Equals("123456"))
                {
                    ErrorMessage = "登录成功!";
                    return 0;
                }
                else
                {
                    ErrorMessage = "密码错误!";
                    return -2;
                }
            }
        }

        /// <summary>
        /// 操作员退出登录
        /// </summary>
        /// <param name="ErrorMessage">输出:错误信息提示</param>
        /// <returns>错误代码,0表示成功</returns>
        public Int32 Logout(out String ErrorMessage)
        {
            ErrorMessage = "退出登录成功!";
            return 0;
        }

        /// <summary>
        /// 获取员工姓名
        /// </summary>
        /// <param name="EmployeeId">要查询的员工工号</param>
        /// <param name="RealName">输出:员工姓名,用于设备显示</param>
        /// <param name="NickName">输出:员工昵称,昵称用于语音播报,如果没有,则播报姓名</param>
        /// <param name="TemplateCount">输出:已采集的人脸模板数。如果大于0,则程序会提示此人已登记人脸,确认是否重新登记</param>
        /// <param name="ErrorMessage">输出:错误信息提示</param>
        /// <returns>错误代码,0表示成功</returns>
        public Int32 GetEmployeeName(String EmployeeId, out String RealName, out String NickName, out Int32 TemplateCount, out String ErrorMessage)
        {
            if (String.IsNullOrEmpty(EmployeeId))
            {
                RealName = null;
                NickName = null;
                TemplateCount = 0;
                ErrorMessage = "员工工号错误!";
                return -1;
            }
            else
            {
                RealName = "秦建辉";
                NickName = "秦司令";
                TemplateCount = 0;
                ErrorMessage = "操作成功!";                
                return 0;
            }
        }
        
        /// <summary>
        /// 存储人脸采集数据
        /// </summary>
        /// <param name="Employee">要存储的人脸数据,包括工号、姓名、昵称、模板、照片</param>
        /// <param name="ErrorMessage">输出:错误信息提示</param>
        /// <returns>错误代码,0表示成功</returns>
        public Int32 SaveEnrolledEmployee(EnrolledEmployee Employee, out String ErrorMessage)
        {
            // 人脸数据存储目录
            String SAVE_FOLDER = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\Hanvon\\Enroll\\";

            LINQToINI iniFile = new LINQToINI();

            // 写入人员信息
            iniFile.WriteProfileString("PERSON", "EmployeeId", Employee.EmployeeId);  // 工号
            iniFile.WriteProfileString("PERSON", "RealName", Employee.RealName);      // 姓名
            iniFile.WriteProfileString("PERSON", "NickName", Employee.NickName);      // 昵称
            iniFile.WriteProfileString("PERSON", "Photo", Employee.Photo);            // 照片

            // 写入模板
            for (Int32 i = 0; i < Employee.Templates.Length; i++)
            {
                iniFile.WriteProfileString("TEMPLATES", i.ToString(), Employee.Templates[i]);
            }

            // 存储人脸数据
            if (iniFile.Save(SAVE_FOLDER + Guid.NewGuid().ToString() + ".dat"))
            {
                ErrorMessage = "存储人脸登记数据成功!";
                return 0;
            }
            else
            {
                ErrorMessage = "存储人脸登记数据失败!";
                return -1;
            }
        }
    }
}

软件界面:
Enroll-1
Enroll-2
Enroll-3

Comments are closed.