/// <summary>
        /// 人脸特征比对
        /// </summary>
        /// <param name="faceFeature1">特征1</param>
        /// <param name="faceFeature2">特征2</param>
        /// <param name="similarity">相似度</param>
        /// <param name="compareModel">ASF_LIFE_PHOTO:用于生活照之间的特征比对;ASF_ID_PHOTO:用于证件照或证件照和生活照之间的特征比对</param>
        /// <returns>返回0表示正常;返回负数请根据ErrorCodeUtil类注释查看;其他值请在官网-帮助中心查询</returns>
        public int ASFFaceFeatureCompare(FaceFeature faceFeature1, FaceFeature faceFeature2, out float similarity, ASF_CompareModel compareModel = ASF_CompareModel.ASF_LIFE_PHOTO)
        {
            similarity = 0f;
            if (faceFeature1 == null || faceFeature2 == null)
            {
                return(ErrorCodeUtil.FEATURE_IS_NULL);
            }
            #region 将特征对象转化为特征结构体,再转化为非托管内存
            ASF_FaceFeature asfFeatureStruct1 = new ASF_FaceFeature();
            asfFeatureStruct1.featureSize = faceFeature1.featureSize;
            asfFeatureStruct1.feature     = MemoryUtil.Malloc(asfFeatureStruct1.featureSize);
            MemoryUtil.Copy(faceFeature1.feature, 0, asfFeatureStruct1.feature, asfFeatureStruct1.featureSize);
            IntPtr pFeature1 = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_FaceFeature>());
            MemoryUtil.StructureToPtr(asfFeatureStruct1, pFeature1);

            ASF_FaceFeature asfFeatureStruct2 = new ASF_FaceFeature();
            asfFeatureStruct2.featureSize = faceFeature2.featureSize;
            asfFeatureStruct2.feature     = MemoryUtil.Malloc(asfFeatureStruct2.featureSize);
            MemoryUtil.Copy(faceFeature2.feature, 0, asfFeatureStruct2.feature, asfFeatureStruct2.featureSize);
            IntPtr pFeature2 = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_FaceFeature>());
            MemoryUtil.StructureToPtr(asfFeatureStruct2, pFeature2);
            #endregion
            //调用SDK接口
            int retCode = ASFFunctions.ASFFaceFeatureCompare(pEngine, pFeature1, pFeature2, ref similarity, compareModel);
            MemoryUtil.FreeArray(pFeature1, pFeature2, asfFeatureStruct1.feature, asfFeatureStruct2.feature);

            return(retCode);
        }
Esempio n. 2
0
        /// <summary>
        /// 提取单人脸特征
        /// </summary>
        /// <param name="pEngine">人脸识别引擎</param>
        /// <param name="image">图片</param>
        /// <param name="singleFaceInfo">单人脸信息</param>
        /// <returns>单人脸特征</returns>
        public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo)
        {
            FaceFeature faceFeature = null;

            try
            {
                MultiFaceInfo multiFaceInfo = new MultiFaceInfo();
                multiFaceInfo.faceNum             = 1;
                multiFaceInfo.faceOrients         = new int[1];
                multiFaceInfo.faceOrients[0]      = singleFaceInfo.faceOrient;
                multiFaceInfo.faceRects           = new MRECT[1];
                multiFaceInfo.faceRects[0]        = singleFaceInfo.faceRect;
                multiFaceInfo.faceDataInfoList    = new FaceDataInfo[1];
                multiFaceInfo.faceDataInfoList[0] = singleFaceInfo.faceDataInfo;
                //口罩检测
                int      retCode  = -1;
                MaskInfo maskInfo = MaskEstimation(faceEngine, image, singleFaceInfo, out retCode);
                if (retCode != 0 || maskInfo.maskArray == null || maskInfo.maskArray.Length <= 0)
                {
                    return(faceFeature);
                }
                bool isMask = maskInfo.maskArray[0].Equals(1);
                faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, ASF_RegisterOrNot.ASF_RECOGNITION, out faceFeature, 0, isMask);
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(faceFeature);
        }
Esempio n. 3
0
        /// <summary>
        /// 提取人脸特征,多人脸默认取第一个人脸特征
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="image">图像</param>
        /// <returns>保存人脸特征结构体指针</returns>
        public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, out SingleFaceInfo singleFaceInfo, ref int retCode, int faceIndex = 0)
        {
            FaceFeature faceFeature = new FaceFeature();

            singleFaceInfo = new SingleFaceInfo();
            try
            {
                if (image == null)
                {
                    return(faceFeature);
                }
                MultiFaceInfo multiFaceInfo = new MultiFaceInfo();
                //人脸检测
                retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo);
                if (retCode != 0)
                {
                    return(faceFeature);
                }
                singleFaceInfo.faceOrient = multiFaceInfo.faceOrients[faceIndex];
                singleFaceInfo.faceRect   = multiFaceInfo.faceRects[faceIndex];
                retCode = faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, out faceFeature, faceIndex);
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(faceFeature);
        }
Esempio n. 4
0
 //IplImageから特徴量作成
 private bool FeatureFromIpl()
 {
     foreach (IplImage ipl_image in this.FaceIplList)
     {
         FaceFeature.MakeFeatureFromIpl(ipl_image, 0);
     }
     return(true);
 }
Esempio n. 5
0
        /// <summary>
        /// 提取人脸特征,多人脸默认取第一个人脸特征
        /// </summary>
        /// <param name="pEngine">引擎Handle</param>
        /// <param name="image">图像</param>
        /// <param name="thresold">图像质量检测阈值</param>
        /// <returns>保存人脸特征结构体指针</returns>
        public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, float thresoldImg, float thresoleImgMask, ASF_RegisterOrNot registerOrNot, out SingleFaceInfo singleFaceInfo, out bool isMask, ref string featureResult, out int retCode, int faceIndex = 0)
        {
            FaceFeature faceFeature = new FaceFeature();

            singleFaceInfo = new SingleFaceInfo();
            isMask         = false;
            retCode        = -1;
            try
            {
                if (image == null)
                {
                    return(faceFeature);
                }
                MultiFaceInfo multiFaceInfo;
                //人脸检测
                retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo);
                if (retCode != 0 || multiFaceInfo.faceNum <= 0)
                {
                    featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "人脸检测失败" : "检测到的人脸数为0");
                    return(faceFeature);
                }

                singleFaceInfo.faceOrient   = multiFaceInfo.faceOrients[faceIndex];
                singleFaceInfo.faceRect     = multiFaceInfo.faceRects[faceIndex];
                singleFaceInfo.faceDataInfo = multiFaceInfo.faceDataInfoList[faceIndex];

                //口罩检测
                MaskInfo maskInfo = MaskEstimation(faceEngine, image, singleFaceInfo, out retCode);
                if (retCode != 0 || maskInfo.maskArray == null || maskInfo.maskArray.Length <= 0)
                {
                    featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "口罩检测失败" : "检测到的口罩结果为空");
                    return(faceFeature);
                }
                isMask = maskInfo.maskArray[0].Equals(1);
                //图像质量检测
                float confidenceLevel = 0.0f;
                retCode = faceEngine.ASFImageQualityDetectEx(image, multiFaceInfo, out confidenceLevel, faceIndex, isMask);
                if (retCode != 0 || confidenceLevel < (isMask ? thresoleImgMask : thresoldImg))
                {
                    featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "图像质量检测失败" : "图像质量过低");
                    return(faceFeature);
                }
                //特征提取
                retCode = faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, registerOrNot, out faceFeature, faceIndex, isMask);
                if (retCode != 0)
                {
                    featureResult = string.Format("特征提取失败,接口返回值:{0}", retCode);
                }
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(faceFeature);
        }
        /// <summary>
        /// 单人脸特征提取
        /// </summary>
        /// <param name="imageFormat">图片格式</param>
        /// <param name="image">图片</param>
        /// <param name="multiFaceInfo">人脸框对象</param>
        /// <param name="faceIndex">人脸索引</param>
        /// <param name="faceFeature">[out]特征结果</param>
        /// <returns>返回0表示正常;返回负数请根据ErrorCodeUtil类注释查看;其他值请在官网-帮助中心查询</returns>
        public int ASFFaceFeatureExtractEx(Image image, MultiFaceInfo multiFaceInfo, out FaceFeature faceFeature, int faceIndex = 0, ASF_ImagePixelFormat imageFormat = ASF_ImagePixelFormat.ASVL_PAF_RGB24_B8G8R8)
        {
            int retCode = -1;

            faceFeature = new FaceFeature();
            if (multiFaceInfo == null)
            {
                return(ErrorCodeUtil.MULPTIFACEINFO_IS_NULL);
            }
            if (faceIndex >= multiFaceInfo.faceNum)
            {
                return(ErrorCodeUtil.FACEINDEX_INVALID);
            }
            if (image == null)
            {
                return(ErrorCodeUtil.IMAGE_IS_NULL);
            }
            ImageInfo imageInfo = new ImageInfo();

            imageInfo = ASF_ImagePixelFormat.ASVL_PAF_RGB24_B8G8R8.Equals(imageFormat) ? ImageUtil.ReadBMP(image) : ImageUtil.ReadBMP_IR(image);
            if (imageInfo == null)
            {
                return(ErrorCodeUtil.IMAGE_DATA_READ_FAIL);
            }
            //转化单人脸信息
            SingleFaceInfo singleFaceInfo  = new SingleFaceInfo();
            IntPtr         pSIngleFaceInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf <SingleFaceInfo>());

            singleFaceInfo.faceRect   = multiFaceInfo.faceRects[faceIndex];
            singleFaceInfo.faceOrient = multiFaceInfo.faceOrients[faceIndex];
            MemoryUtil.StructureToPtr(singleFaceInfo, pSIngleFaceInfo);
            IntPtr pAsfFaceFeature = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_FaceFeature>());

            ASF_ImageData asfInfoData = CommonUtil.TransImageDataStructByImageInfo(imageInfo);
            IntPtr        pImageInfo  = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_ImageData>());

            MemoryUtil.StructureToPtr(asfInfoData, pImageInfo);

            //调用SDK接口
            retCode = ASFFunctions.ASFFaceFeatureExtractEx(pEngine, pImageInfo, pSIngleFaceInfo, pAsfFaceFeature);
            if (retCode != 0)
            {
                MemoryUtil.FreeArray(pSIngleFaceInfo, pAsfFaceFeature, imageInfo.imgData, pImageInfo);
                return(retCode);
            }
            ASF_FaceFeature asfFeature = MemoryUtil.PtrToStructure <ASF_FaceFeature>(pAsfFaceFeature);

            byte[] feature = new byte[asfFeature.featureSize];
            MemoryUtil.Copy(asfFeature.feature, feature, 0, asfFeature.featureSize);
            faceFeature.featureSize = asfFeature.featureSize;
            faceFeature.feature     = feature;
            MemoryUtil.FreeArray(pSIngleFaceInfo, pAsfFaceFeature, imageInfo.imgData, pImageInfo);
            return(retCode);
        }
Esempio n. 7
0
        /// <summary>
        /// 提取单人脸特征
        /// </summary>
        /// <param name="pEngine">人脸识别引擎</param>
        /// <param name="image">图片</param>
        /// <param name="singleFaceInfo">单人脸信息</param>
        /// <returns>单人脸特征</returns>
        public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo)
        {
            FaceFeature faceFeature = new FaceFeature();

            try
            {
                MultiFaceInfo multiFaceInfo = new MultiFaceInfo();
                multiFaceInfo.faceNum        = 1;
                multiFaceInfo.faceOrients    = new int[1];
                multiFaceInfo.faceOrients[0] = singleFaceInfo.faceOrient;
                multiFaceInfo.faceRects      = new MRECT[1];
                multiFaceInfo.faceRects[0]   = singleFaceInfo.faceRect;
                //图片质量检测完成,进行特征提取
                faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, out faceFeature);
            }
            catch (Exception ex)
            {
                LogUtil.LogInfo(typeof(FaceUtil), ex);
            }
            return(faceFeature);
        }
Esempio n. 8
0
    private static void UpdateUVs(Config[] configs)
    {
        foreach (var config in configs)
        {
            var armorMeshFolderPath  = "Assets/Character_Editor/Meshes/" + config.folderName + "/Armor/";
            var weaponMeshFolderPath = "Assets/Character_Editor/Meshes/" + config.folderName + "/Weapon/";

            var meshPaths = new Dictionary <int, string>()
            {
                { Arm.GetMerheOrder(MeshType.ArmRight), armorMeshFolderPath + "Armor_Arm/ArmRight" },
                { Arm.GetMerheOrder(MeshType.ArmLeft), armorMeshFolderPath + "Armor_Arm/ArmLeft" },
                { Belt.GetMerheOrder(), armorMeshFolderPath + "Armor_Belt" },
                { BeltAdd.GetMerheOrder(), armorMeshFolderPath + "Armor_BeltAdd" },
                { Hair.GetMerheOrder(), armorMeshFolderPath + "Armor_Hair" },
                { Helm.GetMerheOrder(), armorMeshFolderPath + "Armor_Helm" },
                { Beard.GetMerheOrder(), armorMeshFolderPath + "Armor_Jaw" },
                { FaceFeature.GetMerheOrder(), armorMeshFolderPath + "Armor_Feature" },
                { Leg.GetMerheOrder(MeshType.LegRight), armorMeshFolderPath + "Armor_Leg/LegRight" },
                { Leg.GetMerheOrder(MeshType.LegLeft), armorMeshFolderPath + "Armor_Leg/LegLeft" },
                { Shoulder.GetMerheOrder(MeshType.ShoulderRight), armorMeshFolderPath + "Armor_Shoulder/ShoulderRight" },
                { Shoulder.GetMerheOrder(MeshType.ShoulderLeft), armorMeshFolderPath + "Armor_Shoulder/ShoulderLeft" },
                { Torso.GetMerheOrder(), armorMeshFolderPath + "Armor_Torso" },
                { TorsoAdd.GetMerheOrder(), armorMeshFolderPath + "Armor_TorsoAdd" },
                { Hand.GetMerheOrder(MeshType.HandRight), weaponMeshFolderPath + "HandRight" },
                { Hand.GetMerheOrder(MeshType.HandLeft), weaponMeshFolderPath + "HandLeft" },
            };


            var myList = meshPaths.ToList();
            myList.Sort((pair1, pair2) => pair1.Key.CompareTo(pair2.Key));

            int   atlasSize = 4;
            float uvsStep   = 1f / atlasSize;

            for (int itemNum = 0; itemNum < myList.Count; itemNum++)
            {
                if (!AssetDatabase.IsValidFolder(myList[itemNum].Value))
                {
                    continue;
                }

                var meshGUIDs = AssetDatabase.FindAssets("t:GameObject", new string[] { myList[itemNum].Value });
                for (int meshNum = 0; meshNum < meshGUIDs.Length; meshNum++)
                {
                    var tempMesh = AssetDatabase.LoadAssetAtPath <GameObject>(AssetDatabase.GUIDToAssetPath(meshGUIDs[meshNum]));
                    // Mesh tempMesh = UnityEngine.Object.Instantiate(meshObject);

                    //Update LOD parts for each armor item
                    var armorsParts = tempMesh.GetComponentsInChildren <MeshFilter>();
                    for (var armLOD = 0; armLOD < armorsParts.Length; armLOD++)
                    {
                        if (armorsParts[armLOD] != null)
                        {
                            var mTempMesh = (Mesh)GameObject.Instantiate(armorsParts[armLOD].sharedMesh);

                            //Update UVS for new atlas
                            Vector2[] uvs = mTempMesh.uv;
                            for (int i = 0; i < uvs.Length; i++)
                            {
                                uvs[i] = new Vector2(uvs[i].x / atlasSize + uvsStep * (itemNum % atlasSize),
                                                     uvs[i].y / atlasSize + uvsStep * (atlasSize - 1 - (itemNum / atlasSize)));
                            }

                            mTempMesh.uv = uvs;
                            //assigne the selected LOD Mesh with new UV's to the new mesh to be exported
                            if (!Directory.Exists(myList[itemNum].Value + "/Meshes/"))
                            {
                                Directory.CreateDirectory(myList[itemNum].Value + "/Meshes/");
                            }

                            CreateOrReplaceAsset <Mesh>(mTempMesh,
                                                        myList[itemNum].Value + "/Meshes/" + armorsParts[armLOD].sharedMesh.name + "_New.asset");

                            AssetDatabase.SaveAssets();
                        }
                    }
                }
            }

            var prefabsPath = "Assets/Character_Editor/Prefabs/" + config.folderName;
            var prefabGUIDs = AssetDatabase.FindAssets("t:Prefab", new string[] { prefabsPath });
            for (int prefNum = 0; prefNum < prefabGUIDs.Length; prefNum++)
            {
                var pPath = AssetDatabase.GUIDToAssetPath(prefabGUIDs[prefNum]);
                if (pPath.Contains("/Model/"))
                {
                    var originalPrefab         = AssetDatabase.LoadAssetAtPath <GameObject>(pPath);
                    var originalPrefabInstance = GameObject.Instantiate(originalPrefab);
                    originalPrefabInstance.name = originalPrefab.name;

                    foreach (var filter in originalPrefabInstance.GetComponentsInChildren <MeshFilter>())
                    {
                        var lodMeshPath = AssetDatabase.GetAssetPath(filter.sharedMesh);
                        var index       = lodMeshPath.LastIndexOf("/");
                        if (index != -1)
                        {
                            lodMeshPath = lodMeshPath.Substring(0, index) + "/Meshes/" + filter.sharedMesh.name + "_New.asset";

                            var changedMesh = AssetDatabase.LoadAssetAtPath <Mesh>(lodMeshPath);
                            filter.mesh = changedMesh;

                            var newDirPath  = pPath.Substring(0, pPath.IndexOf("Model/")) + "StaticModel/";
                            var fullDirPath = Application.dataPath.Substring(0, Application.dataPath.Length - 6) + newDirPath;
                            if (Directory.Exists(fullDirPath))
                            {
                                Directory.Delete(fullDirPath, true);
                            }

                            Directory.CreateDirectory(fullDirPath);

                            Object prefab = PrefabUtility.CreateEmptyPrefab(newDirPath + originalPrefabInstance.name + ".prefab");
                            PrefabUtility.ReplacePrefab(originalPrefabInstance, prefab, ReplacePrefabOptions.ConnectToPrefab);

                            AssetDatabase.SaveAssets();
                        }
                    }
                    GameObject.DestroyImmediate(originalPrefabInstance);
                }
            }
        }
    }
Esempio n. 9
0
 public FaceFeat()
 {
     t = entTypes.Face;
     addDef();
     f = smf.FaceFeatures.Add(def);
 }
Esempio n. 10
0
        //リストから学習を行う
        private void buttonTrainFile_Click(object sender, EventArgs e)
        {
            //ファイルを選択
            OpenFileDialog ofd = new OpenFileDialog();

            //はじめのファイル名を指定する
            //はじめに「ファイル名」で表示される文字列を指定する
            ofd.FileName = "";
            //はじめに表示されるフォルダを指定する
            //指定しない(空の文字列)の時は、現在のディレクトリが表示される
            ofd.InitialDirectory = @"";
            //[ファイルの種類]に表示される選択肢を指定する
            //指定しないとすべてのファイルが表示される
            ofd.Filter =
                "学習用ファイルリスト|*.txt";
            //[ファイルの種類]ではじめに
            //「すべてのファイル」が選択されているようにする
            ofd.FilterIndex = 2;
            //タイトルを設定する
            ofd.Title            = "判定する画像ファイルを選択して下さい";
            ofd.RestoreDirectory = true;
            ofd.CheckFileExists  = true;
            ofd.CheckPathExists  = true;

            //ダイアログを表示する
            if (ofd.ShowDialog() == DialogResult.OK)
            {
            }

            //出力用のフォルダを設定する
            InputFileList = ofd.FileName;
            OutPutFolda   = @"D:\myprog\github\svm_out"; // 仮設定

            //学習するファイルを読み込む
            ReadFileList();

            FaceFeature face_feature = new FaceFeature();

            face_feature.FaceList    = this.FaceList;
            face_feature.IDList      = this.IDList;
            face_feature.OutPutFolda = this.OutPutFolda;

            //学習実行
            SVMManage svm_manage = new SVMManage();

            //特徴点を出す
            face_feature.DetectFacePoint();

            if (APPSetting.NORMALIZE_USE)
            {
                //特徴点を正規化する
                face_feature.NormalizeFeature();
                svm_manage.TrainingExec(face_feature.ScaleFeatuerValueList);
            }
            else
            {
                svm_manage.TrainingExec(face_feature.FeatuerValueList);
            }

            //エラー表示
            MessageBox.Show("lisvm_model.xmlを作成しました",
                            "完了",
                            MessageBoxButtons.OK
                            );
        }
Esempio n. 11
0
 public override string GetFolderPath()
 {
     return(FaceFeature.GetFolderPath(CharacterRace));
 }