在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 人脸识别

C# 人脸识别

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:2.50M
  • 下载次数:634
  • 浏览次数:2556
  • 发布时间:2019-01-10
  • 实例类别:C#语言基础
  • 发 布 人:彭攀
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 人脸识别 识别 人脸

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

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
    }
}

实例下载地址

C# 人脸识别

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 2872456100 发表于: 2020-09-03 09:11 09
根本就不能用

支持(0) 盖楼(回复)

第 2 楼 jkyy 发表于: 2022-08-07 15:46 25
可以运行,看上去不错

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有2条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警