Newer
Older
IRIS_COLLECT / IOM_cs / IrisCodeListMgr.cs
yangqianqian on 29 Dec 2020 10 KB first
//*****************************************************************************
//该版本每位用户对应6组虹膜编码(6个左眼,6个右眼)2015.9.1修改
//*****************************************************************************
using System;
using System.Windows.Forms;
using System.Collections;
using System.Data;
using IAiCamIrisLib;
using System.IO;
using System.Reflection;


namespace IOM_cs
{
    public class IrisCodeListMgr
    {
        private static byte[] m_byLeft = null;
        private static byte[] m_byRight = null;

        private Hashtable m_htblUsers = null;
        private int m_IrisCodeCount = 0;
        private iCamIrisClass m_iCamIrisLib = new iCamIrisClass();


        /// <summary>
        /// 数据库注册的用户总数
        /// </summary>
        public int TotalUsers
        {
            get { return m_IrisCodeCount; }
        }


        /// <summary>
        /// 创建匹配用虹膜模板list,每位用户对应:6组左眼虹膜编码 & 6组右眼虹膜编码
        /// </summary>
        /// <param name="ds"> Data set </param>
        public void CreateList(DataTable ds)
        {
            try
            {
                //获取数据集中的用户总数
                m_IrisCodeCount = ds.Rows.Count;

                //创建哈希表,用于存储用户Id信息
                m_htblUsers = new Hashtable();

                //创建匹配用的全部用户虹膜编码codeList  
                m_byLeft = new byte[1024 * m_IrisCodeCount * 2];
                m_byRight = new byte[1024 * m_IrisCodeCount * 2];

                for (int iCounter = 0; iCounter < ds.Rows.Count; iCounter++)
                {
                    //获取该用户全部虹膜编码
                    object icLeft = ds.Rows[iCounter]["IRIS_L1"];
                    object icRight = ds.Rows[iCounter]["IRIS_R1"];

                    object icLeft2 = ds.Rows[iCounter]["IRIS_L2"];
                    object icRight2 = ds.Rows[iCounter]["IRIS_R2"];


                    //获取该用户Id信息,添加到哈希表
                    string sUser = ds.Rows[iCounter]["PERSON_ID"].ToString();
                    m_htblUsers.Add(iCounter, sUser);

                    //将该用户的三组左眼虹膜编码依次粘贴至m_byLeft
                    if (System.DBNull.Value != icLeft)
                        Array.Copy((byte[])icLeft, 0, m_byLeft, iCounter * 2 * 1024, 1024);

                    if (System.DBNull.Value != icLeft2)
                        Array.Copy((byte[])icLeft2, 0, m_byLeft, (iCounter * 2 + 1) * 1024, 1024);



                    //将该用户的三组右眼虹膜编码依次粘贴至m_byRight
                    if (System.DBNull.Value != icRight)
                        Array.Copy((byte[])icRight, 0, m_byRight, iCounter * 2 * 1024, 1024);

                    if (System.DBNull.Value != icRight2)
                        Array.Copy((byte[])icRight2, 0, m_byRight, (iCounter * 2 + 1) * 1024, 1024);

                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType,ex.Message);
            }

        }


        /// <summary>
        /// 通过匹配出的iMatchNumber获取到用户Id 
        /// </summary>
        /// <param name="index"> 参数index输入为匹配出的iMatchNumber,取值范围为1,2, 3 ...m_IrisCodeCount*6*2;
        /// <中间变量 indexHash> 中间量indexHash代表index在哈希表中的排号,取值范围为0,1, 2...m_IrisCodeCount 
        /// <returns> </returns> indexHash对应的用户Id
        /// eg1: iMatchNumber:1-12, 对应indexHash:0;
        /// eg2: iMatchNumber:13-24,对应indexHash:1;
        public string GetUserForIndex(int index) 
        {
            int indexHash;

            if (index % 4 != 0) indexHash = index / 4;
            else indexHash = index / 4 - 1;

            if ((indexHash > m_htblUsers.Count + 1) || (indexHash < 0))
                return "";

            return m_htblUsers[indexHash].ToString();

        }


        /// <summary>
        /// 识别设备捕捉到一只眼睛时的匹配
        /// <param name="byImage">  Iris image </param>
        /// <param name="fHammingDistance"> Hamming distance </param>
        /// <param name=" LeftRight"> Left or Right </param>
        /// <returns> 0 or >0 </returns>
        public int MatchOneEye(byte[] byImage, out float fHammingDistance, out object iIrisCode)
        {
            int iRetval;
            int iMatchNumber = 0;            
            fHammingDistance = 1;
            int LeftRight = 0;

            
                //先利用4000对待识别图像进行长编码
                int RetCoding = m_iCamIrisLib.CreateLongIrisCode(byImage, out iIrisCode);

                if (RetCoding == 0)
                {
                    //与右眼逐一比对           
                    iRetval = m_iCamIrisLib.MatchByLongIrisCode(out iMatchNumber, (byte[])iIrisCode, m_byRight, m_IrisCodeCount * 2 * 2);

                    if (iRetval == 0 && iMatchNumber > 0)
                    {
                        m_iCamIrisLib.GetInformation(Constants.RECOGNITION_HD, out fHammingDistance);
                        LeftRight = 2;
                        return iMatchNumber;
                    }
                    else
                    {
                        //如果右眼未匹配,再对左眼进行逐一比对
                        iRetval = m_iCamIrisLib.MatchByLongIrisCode(out iMatchNumber, iIrisCode, m_byLeft, m_IrisCodeCount * 2 * 2);

                        if (iRetval == 0 && iMatchNumber > 0)
                        {
                            m_iCamIrisLib.GetInformation(Constants.RECOGNITION_HD, out fHammingDistance);
                            LeftRight = 1;
                            return iMatchNumber;
                        }

                    }

                }

                return 0;
            
        }


        /// <summary>
        /// 与左眼进行匹配
        /// <param name="byImage">  Iris image </param>
        /// <param name="fHammingDistance"> Hamming distance </param>
        /// <param name=" LeftRight"> Left or Right </param>
        /// <returns> 0 on failure </returns> iMatchNumber on success match
        public int MatchLeftEye(byte[] byImage, out float fHammingDistance, out object iIrisCode)
        {
            int iRetval;
            int iMatchNumber = 0;
            fHammingDistance = 1;

            //先利用4000对待识别图像进行长编码
            int RetCoding = m_iCamIrisLib.CreateLongIrisCode(byImage, out iIrisCode);

            if (RetCoding == 0)//编码成功
            {
                //逐一比对           
                iRetval = m_iCamIrisLib.MatchByLongIrisCode(out iMatchNumber, (byte[])iIrisCode, m_byLeft, m_IrisCodeCount * 2 * 2);

                if (iRetval == 0 && 0 != iMatchNumber)
                {
                    m_iCamIrisLib.GetInformation(Constants.RECOGNITION_HD, out fHammingDistance);
                    return iMatchNumber;
                }

            }
            else 
            {
                iIrisCode = null;
                MessageBox.Show("左眼虹膜图片编码失败!");
            }

            return 0;

        }

        /// <summary>
        ///  与右眼进行匹配
        /// </summary>
        /// <param name="byImage"></param>
        /// <param name="fHammingDistance"></param>
        /// <returns></returns>
        public int MatchRightEye(byte[] byImage, out float fHammingDistance, out object iIrisCode)
        {
            int iRetval;
            int iMatchNumber = 0;
            fHammingDistance = 1;

            //先利用4000对待识别图像进行长编码
            int RetCoding = m_iCamIrisLib.CreateLongIrisCode(byImage, out iIrisCode);

            if (RetCoding == 0)//编码成功
            {
                //逐一比对           
                iRetval = m_iCamIrisLib.MatchByLongIrisCode(out iMatchNumber, (byte[])iIrisCode, m_byRight, m_IrisCodeCount * 2 * 2);

                if (iRetval == 0 && 0 != iMatchNumber)
                {
                    m_iCamIrisLib.GetInformation(Constants.RECOGNITION_HD, out fHammingDistance);
                    return iMatchNumber;
                }

            }
            else
            {
                iIrisCode = null;
                MessageBox.Show("右眼虹膜图片编码失败!");
            }

            return 0;

        }


        /// <summary>
        ///  与任意一只眼睛进行匹配
        /// </summary>
        /// <param name="byImage"></param>
        /// <param name="fHammingDistance"></param>
        /// <returns></returns>
        /// <summary>        
        public int MatchEitherEye(byte[] byImage, out float fHammingDistance)
        {
            int iRetval;
            object iIrisCode;
            int iMatchNumber = 0;
            fHammingDistance = 1;
            //LeftRight = 0;

            //先利用4000对待识别图像进行长编码
            int RetCoding = m_iCamIrisLib.CreateLongIrisCode(byImage, out iIrisCode);

            if (RetCoding == 0)
            {
                //与右眼逐一比对           
                iRetval = m_iCamIrisLib.MatchByLongIrisCode(out iMatchNumber, (byte[])iIrisCode, m_byRight, m_IrisCodeCount * 2 * 2);

                if (iRetval == 0 && iMatchNumber > 0)
                {
                    m_iCamIrisLib.GetInformation(Constants.RECOGNITION_HD, out fHammingDistance);
                    //LeftRight = 2;
                    return iMatchNumber;
                }

               //如果右眼未匹配,再对左眼进行逐一比对
                else
                {
                    iRetval = m_iCamIrisLib.MatchByLongIrisCode(out iMatchNumber, iIrisCode, m_byLeft, m_IrisCodeCount * 2 * 2);

                    if (iRetval == 0 && iMatchNumber > 0)
                    {
                        m_iCamIrisLib.GetInformation(Constants.RECOGNITION_HD, out fHammingDistance);
                        //LeftRight = 1;
                        return iMatchNumber;
                    }

                }

            }

            return 0;
        }


    }
}