实例介绍
【实例简介】
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace FaceRecognition
{
public partial class FrmMain : Form
{
public FrmMain() {
InitializeComponent();
}
#region 结构体
unsafe public struct DLL_1CN_RECOG_OUT_STRUCT
{
public byte address; //'无意义,传址用的
public float VALUE; //'相似度值
public fixed byte Template_ID[33]; //'相似的ID
public fixed byte TemplateFileName[256]; //'这个ID对应的模板的图像文件名称
};
unsafe public struct DLL_OUT_FACE_STRUCT
{
public byte address; //无意义,传址的
public Int32 eye1_x;
public Int32 eye1_y;
public Int32 eye2_x;
public Int32 eye2_y; //两眼坐标
public Int32 left;
public Int32 top;
public Int32 right;
public Int32 bottom; //人脸矩形
public Int32 angle; //人脸平面角度 (正面垂直时为90度)
public float tally; //得分 ,100分制,即人脸的置信度。
public Int32 is_small_face;// '是小脸还是大脸,1为小脸,是启用了小脸检测的结果,但小脸不能进行后续的人脸识别
//'当是小脸时,只输出人脸矩形,即只有人脸矩形有效,其它值无效
//'下面的值要进行了人眼定位与人脸检测的后期处理才有效
public Int32 skin_color_R; //'采样肤色COLORREF。(RGB)
public Int32 skin_color_G; //'采样肤色COLORREF。(RGB)
public Int32 skin_color_B; //'采样肤色COLORREF。(RGB)
public Int32 skin_hd_bright; //'采样肤色的灰度亮度。
public Int32 left_face_len; //'从左眼开始计算的左脸估计长度。
public Int32 right_face_len; //'从右眼开始计算的右脸估计长度。
public float face_width_rely; // '脸宽的信任度[0,1)。
public Int32 nose_x; // '在原图像中的鼻尖位置。
public Int32 nose_y; //'在原图像中的鼻尖位置。
public float nose_rely; //'鼻尖位置:可信任度[0,1)。
public Int32 month_x; // '在原图像中的嘴中心位置。
public Int32 month_y; // '在原图像中的嘴中心位置。
public float month_rely; // '嘴心位置:可信任度[0,1)。
public float glass_rely; //'可能眼镜的置信度[0,1)
public Int32 eye1_w;
public Int32 eye1_h;
public Int32 eye2_w;
public Int32 eye2_h; //人眼球大小,要示姿势端正,眼距为100以上的人脸,且眼球无反光的情况下才正确
public Int32 CloseEyeBelievable; //闭眼的可能性系数输出,值域[0,1000]
};//END STRUCT DEF
#endregion
#region 变量与API定义
public bool is_usb_ok;
public Int32 OID;
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zInitialize(string UserName);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zUnInitialize();
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zCreateOneThreadObject(Int32 is_load_tzlib, string datafilepath);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zDeleteOneThreadObject(Int32 OID);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zGetLastError(Int32 OID, byte* outstr);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zFaceLocate(Int32 OID, string FileName, Int32 MAX_OUT_NUMS, float Threshold, DLL_OUT_FACE_STRUCT* pofs);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zFlagFace(Int32 OID, Int32 draw_window_hwnd, Int32 order, Int32 offset_x, Int32 offset_y);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zFaceLocate_FreeMemory(Int32 OID);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zRecog1C1(Int32 OID, string vid, Int32 order, float* VALUE, string TemplateFileName);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zRecog1C1_Fast(Int32 OID, string vid, Int32 order, float* VALUE, string TemplateFileName);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zRecog1CN(Int32 OID, Int32 order, Int32 max_out_num, DLL_1CN_RECOG_OUT_STRUCT* pout);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 UsbVideo_Init(Int32 DEVICE_ID, Int32 play_window_hwnd, Int32 Base_Height);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 UsbVideo_Get_Width();
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 UsbVideo_Get_Height();
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 UsbVideo_CapOneBmp(string bmpFileName);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 UsbVideo_EndAll();
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zAddFaceTemplate(Int32 OID, string TID, Int32 order);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zDelTemplateA(Int32 OID, string TID, string template_filename);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zDelTemplateB(Int32 OID, string TID, Int32 BH);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zDelAllTemplate(Int32 OID);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zUpdateMemory(Int32 OID);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zCountMemoryTidTotaleNums(Int32 OID);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zDrawOneTemplatePhoto(Int32 OID, string TID, Int32 BH, Int32 object_window_hwnd, Int32 start_x, Int32 start_y, Int32 IS_FLAG_EYE);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zCountTemplateTotaleNums(Int32 OID, string TID);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zEnumMemoryTid(Int32 OID, byte* alltid);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zEnumTid(Int32 OID, byte* alltid);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zGetA(Int32 OID, Int32 PARA_NAME_ORDER);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zSetA(Int32 OID, Int32 PARA_NAME_ORDER, Int32 VALUE);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zSetB(Int32 OID, Int32 PARA_NAME_ORDER, float VALUE);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zInitCheck(Int32 OID, Int32 order);
[DllImport("SunLightFace.dll")]
public static unsafe extern Int32 zFrameCheck(Int32 OID, string bmpFileName);
[DllImport("kernel32.dll")]
public static unsafe extern Int32 Beep(Int32 dwFreq, Int32 dwDuration);
#endregion
#region 重写Dispose
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing) {
if (disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
//当关窗口时,放出内存
if (OID > 0) zDeleteOneThreadObject(OID); //回收对象内存
zUnInitialize(); //反初始化
if (is_usb_ok == true) UsbVideo_EndAll();
}
#endregion
#region 窗体载入初始化时
//载入初始化时
private void FrmMain_Load(object sender, System.EventArgs e) {
OID = -1;
is_usb_ok = true;
if (UsbVideo_Init(0, pictureBox1.Handle.ToInt32(), 240) != 1) {
MessageBox.Show("本范例程序需要有USB摄像头的支持!");
is_usb_ok = false;
Dispose(true);
}
//int vw = UsbVideo_Get_Width();
//int vh = UsbVideo_Get_Height();
//pictureBox1.Width = vw;
//pictureBox1.Height = vh;
zInitialize("阳光人脸识别二次开发包<青铜版>:此版为免费正式版本,最大用户数1000,许可商用.");
OID = zCreateOneThreadObject(1, Application.StartupPath "\\zdata");
if (OID < 1) MessageBox.Show("载入人脸数据失败!");
}//END FUNC
#endregion
#region 功能函数
//功能函数,把VC的byte *转为C#的string
unsafe private string byte2string(byte* p, Int32 len) {
byte[] ba = new byte[len];
for (int i = 0; i < len; i ) ba[i] = p[i];
string outr = System.Text.Encoding.Default.GetString(ba);
int at = outr.IndexOf("\0");//去掉尾部的C语言结束符
if (at == -1) return string.Empty;
return outr.Substring(0, at);
}//end func :len长度是空间长度,但空间的尾部可能并未填满,再之前则是C语言结束符
#endregion
#region 控件事件
#region 人脸检测 - button1_Click
//人脸检测
unsafe private void button1_Click(object sender, System.EventArgs e) {
Int32 i;
//1.先捉一张图
if (UsbVideo_CapOneBmp("temp.bmp") != 1) return;
//2.人脸定位
DLL_OUT_FACE_STRUCT* pofs = stackalloc DLL_OUT_FACE_STRUCT[32 1];
Int32 ret = zFaceLocate(OID, "temp.bmp", 32, 0.4f, pofs);
if (ret < 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
return;
}
//else if(ret>0)MessageBox.Show("OK");
//3.标出人脸
pictureBox2.Image = Image.FromFile("temp.bmp");
pictureBox2.Refresh();
pictureBox2.Image.Dispose();
for (i = 0; i < ret; i ) zFlagFace(OID, pictureBox2.Handle.ToInt32(), i, 0, 0);
//4.清除人脸检测内存
zFaceLocate_FreeMemory(OID);
}//END FUNC
#endregion
#region 人脸认证 - button2_Click
//人脸认证
unsafe private void button2_Click(object sender, System.EventArgs e) {
Int32 i;
//1.先捉一张图
if (UsbVideo_CapOneBmp("temp.bmp") != 1) return;
//2.人脸定位
DLL_OUT_FACE_STRUCT* pofs = stackalloc DLL_OUT_FACE_STRUCT[32 1];
Int32 ret = zFaceLocate(OID, "temp.bmp", 32, 0.5f, pofs);
if (ret < 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
return;
}
//3.标出人脸
pictureBox2.Image = Image.FromFile("temp.bmp");
pictureBox2.Refresh();
pictureBox2.Image.Dispose();
for (i = 0; i < ret; i ) zFlagFace(OID, pictureBox2.Handle.ToInt32(), i, 0, 0);
//4.人脸认证
float xsd;
ret = zRecog1C1_Fast(OID, t1.Text, 0, &xsd, null);
if (ret < 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
}
label2.Text = xsd.ToString();
if (zGetA(OID, 8) == 1) zUpdateMemory(OID);//让动态模板更新生效
//5.清除人脸检测内存
zFaceLocate_FreeMemory(OID);
}
#endregion
#region 人脸识别 - button3_Click
//人脸识别
unsafe private void button3_Click(object sender, System.EventArgs e) {
Int32 i;
//1.先捉一张图
if (UsbVideo_CapOneBmp("temp.bmp") != 1) return;
//2.人脸定位
DLL_OUT_FACE_STRUCT* pofs = stackalloc DLL_OUT_FACE_STRUCT[32 1];
Int32 ret = zFaceLocate(OID, "temp.bmp", 32, 0.5f, pofs);
if (ret < 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
return;
}
//3.标出人脸
pictureBox2.Image = Image.FromFile("temp.bmp");
pictureBox2.Refresh();
pictureBox2.Image.Dispose();
for (i = 0; i < ret; i ) zFlagFace(OID, pictureBox2.Handle.ToInt32(), i, 0, 0);
//4.人脸识别
DLL_1CN_RECOG_OUT_STRUCT rout;
ret = zRecog1CN(OID, 0, 1, &rout);
if (ret >= 1) {
label2.Text = " v:" rout.VALUE.ToString();
label2.Text = " id:" byte2string(rout.Template_ID, 33);
label2.Text = " fn:" byte2string(rout.TemplateFileName, 256);
}
if (ret < 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
}
if (zGetA(OID, 8) == 1) zUpdateMemory(OID);//让动态模板更新生效
//5.清除人脸检测内存
zFaceLocate_FreeMemory(OID);
}//END FUNC
#endregion
#region 添加一个模板 - button4_Click
//添加一个模板
unsafe private void button4_Click(object sender, EventArgs e) {
Int32 i;
//1.先捉一张图
if (UsbVideo_CapOneBmp("tempAAA.bmp") != 1) return;
//2.人脸定位
DLL_OUT_FACE_STRUCT* pofs = stackalloc DLL_OUT_FACE_STRUCT[32 1];
Int32 ret = zFaceLocate(OID, "tempAAA.bmp", 32, 0.5f, pofs);
if (ret < 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
return;
}
//3.标出人脸
pictureBox2.Image = Image.FromFile("tempAAA.bmp");
pictureBox2.Refresh();
pictureBox2.Image.Dispose();
for (i = 0; i < ret; i ) zFlagFace(OID, pictureBox2.Handle.ToInt32(), i, 0, 0);
//4.开始加模板,并让添加立即生效。
if (zAddFaceTemplate(OID, t1.Text, 0) == 1) zUpdateMemory(OID);
//5.清除人脸检测内存
zFaceLocate_FreeMemory(OID);
}//END FUNC
#endregion
#region 删除指定ID的第1个模板 - button5_Click
//删除指定ID的第1个模板
private void button5_Click(object sender, EventArgs e) {
if (t1.Text.Length > 0)//ID已输入
{
zDelTemplateB(OID, t1.Text, 0); //删除第1个模板,如果最后一个参数为2,就是删除第三个模板
}
}//END FUNC
#endregion
#region 画出指定ID的模板照片 - button6_Click
//画出指定ID的模板照片
private void button6_Click(object sender, EventArgs e) {
if (t1.Text.Length == 0) return;
Int32 ret1 = zCountTemplateTotaleNums(OID, t1.Text);
Int32 SY = 280;
Int32 i, SX;
for (i = 0; i < ret1; i ) {
SX = 10 i * 120;
if (i >= 5) {
SY = 420;
SX = 10 (i - 5) * 120;
}
zDrawOneTemplatePhoto(OID, t1.Text, i, this.Handle.ToInt32(), SX, SY, 0);
}
}//end func
#endregion
#region 是否选择了动态模板更新 - checkBox1_CheckedChanged
//是否选择了动态模板更新
private void checkBox1_CheckedChanged(object sender, EventArgs e) {
if (checkBox1.Checked == true)
zSetA(OID, 23, 1);
else
zSetA(OID, 23, 0);
}
#endregion
#region 活体识别 - button7_Click
//活体识别
unsafe private void button7_Click(object sender, EventArgs e) {
label2.Text = "";
Int32 i;
//1.先捉一张图
if (UsbVideo_CapOneBmp("temp.bmp") != 1) return;
//2.人脸定位
DLL_OUT_FACE_STRUCT* pofs = stackalloc DLL_OUT_FACE_STRUCT[32 1];
Int32 ret = zFaceLocate(OID, "temp.bmp", 1, 0.5f, pofs);
if (ret <= 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
return;
}
//3.标出人脸
zFlagFace(OID, pictureBox1.Handle.ToInt32(), 0, 0, 0);
//////////////////////////////////////
//下面是插入的活体识别代码
bool is_ht_ok = false;
zInitCheck(OID, 0); //初始化活体检测
/////////////////////////////////////////////////////////////////////////////
//注意:请在这个位置向被识别用户给出眨眼的提示---------------------<ADD CODE>
/////////////////////////////////////////////////////////////////////////////
//向用户提示闭眼,建议用图显提示法,比如语音提示或图形标志提示
Beep(1000, 50);
for (i = 0; i < 20; i )// 这个20次循环,乘上下面每次循环的时间,就是活体识别的等待总时间,可由开发人员自行调节。
{
if (UsbVideo_CapOneBmp("temp.bmp") != 1) continue;
int ret4 = zFrameCheck(OID, "temp.bmp"); //进行连续帧检测
if (ret4 == 1) { is_ht_ok = true; break; }
if (ret4 < 0) break; //发现"作假"
// '如果返回值RET4=0,表示还没判断出来,继续循环...
}
/////////////////////////////////////////////////////////////////////////////
//注意:请在这个位置向被识别用户给出眨眼的提示---------------------<ADD CODE>
/////////////////////////////////////////////////////////////////////////////
Beep(1000, 50); //向用户提示可以睁眼了
//////////////////////////////////////
//////////////////////////////////////
//上面是插入的活体识别代码
//4.人脸认证
if (is_ht_ok == true) {
float xsd;
ret = zRecog1C1_Fast(OID, t1.Text, 0, &xsd, null);
if (ret < 0) {
byte* ermsg = stackalloc byte[256];
zGetLastError(OID, ermsg);
MessageBox.Show(byte2string(ermsg, 256));
}
label2.Text = xsd.ToString();
if (zGetA(OID, 8) == 1) zUpdateMemory(OID);//让动态模板更新生效
}
//5.清除人脸检测内存
zFaceLocate_FreeMemory(OID);
}//end func
#endregion
#region 枚举所有ID - button8_Click
//枚举所有ID
private void button8_Click(object sender, EventArgs e) {
string[] tidarray = null;
unsafe {
Int32 num = zCountTemplateTotaleNums(OID, null);
byte* outbuf = stackalloc byte[33 * num];
zEnumTid(OID, outbuf);
string alltid = byte2string(outbuf, 33 * num);
tidarray = alltid.Split(',');
MessageBox.Show(alltid);
}
if (tidarray != null) {
for (int i = 0; i < tidarray.Length; i ) Console.WriteLine(tidarray[i]);
}
}//END FUNC
#endregion
#endregion
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)
支持(0) 盖楼(回复)