/// <summary> /// 人脸3D角度检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="imageInfo">图像数据</param> /// <param name="multiFaceInfo">检测的人脸信息</param> /// <returns>人脸3D角度检测结果结构体</returns> public static Face3DAngle Face3DAngleDetection(FaceEngine faceEngine, Image image, MultiFaceInfo multiFaceInfo, out int retCode) { retCode = -1; Face3DAngle face3DAngle = new Face3DAngle(); try { if (multiFaceInfo.faceNum <= 0) { return(face3DAngle); } //人脸信息检测 retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_FACE3DANGLE); if (retCode == 0) { //获取人脸3D角度 retCode = faceEngine.ASFGetFace3DAngle(out face3DAngle); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(face3DAngle); }
/// <summary> /// 性别检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="imageInfo">图像数据</param> /// <param name="multiFaceInfo">检测的人脸信息</param> /// <returns>性别检测结果结构体</returns> public static GenderInfo GenderEstimation(FaceEngine faceEngine, Image image, MultiFaceInfo multiFaceInfo, out int retCode) { retCode = -1; GenderInfo genderInfo = new GenderInfo(); try { if (multiFaceInfo.faceNum <= 0) { return(genderInfo); } //人脸信息检测 retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_GENDER); if (retCode == 0) { //获取性别信息 retCode = faceEngine.ASFGetGender(out genderInfo); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(genderInfo); }
/// <summary> /// 年龄检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="imageInfo">图像数据</param> /// <param name="multiFaceInfo">人脸检测结果</param> /// <returns>年龄检测结构体</returns> public static AgeInfo AgeEstimation(FaceEngine faceEngine, Image image, MultiFaceInfo multiFaceInfo, out int retCode) { retCode = -1; AgeInfo ageInfo = new AgeInfo(); try { if (multiFaceInfo.faceNum <= 0) { return(ageInfo); } //人脸信息检测 retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_AGE); if (retCode == 0) { //获取年龄信息 retCode = faceEngine.ASFGetAge(out ageInfo); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(ageInfo); }
/// <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); }
/// <summary> /// 红外活体检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="imageInfo">图像数据</param> /// <param name="singleFaceInfo">单人脸信息</param> /// <returns>活体检测结果</returns> public static LivenessInfo LivenessInfo_IR(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo, out int retCode) { LivenessInfo livenessInfo = new LivenessInfo(); retCode = -1; 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; //人脸信息处理 retCode = faceEngine.ASFProcessEx_IR(image, multiFaceInfo, FaceEngineMask.ASF_IR_LIVENESS); if (retCode == 0) { //获取IR活体检测结果 retCode = faceEngine.ASFGetLivenessScore_IR(out livenessInfo); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(livenessInfo); }
/// <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> /// IR图片人脸检测 /// </summary> /// <param name="pEngine"></param> /// <param name="image"></param> /// <returns></returns> public static MultiFaceInfo DetectFaceIR(FaceEngine faceEngine, Bitmap image) { MultiFaceInfo multiFaceInfo = null; try { faceEngine.ASFDetectFacesEx(image, out multiFaceInfo, ASF_ImagePixelFormat.ASVL_PAF_GRAY); } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(multiFaceInfo); }
/// <summary> /// 人脸检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="image">图像</param> /// <returns></returns> public static MultiFaceInfo DetectFace(FaceEngine faceEngine, Image image) { MultiFaceInfo multiFaceInfo = new MultiFaceInfo(); try { faceEngine.ASFDetectFacesEx(image, out multiFaceInfo); } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(multiFaceInfo); }
/// <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); }
/// <summary> /// 人脸检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="image">图像</param> /// <returns></returns> public static MultiFaceInfo DetectFaceAndLandMark(FaceEngine faceEngine, Image image) { MultiFaceInfo multiFaceInfo = null; try { int retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo); if (retCode == 0) { LandMarkInfo landmarkInfo = LandMarkEstimation(faceEngine, image, multiFaceInfo, out retCode); if (retCode == 0) { multiFaceInfo.pointAyy = landmarkInfo.pointAyy; } } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(multiFaceInfo); }
static void Main(string[] args) { var faceengine = new FaceEngine(ASF_RegisterOrNot.ASF_REGISTER, 2); //faceengine.OnlineActivation("", "", ""); FaceEngine.OnlineActivationFree("", ""); //faceengine.OfflineActivation(); faceengine.InitEngine(ASF_DetectMode.ASF_DETECT_MODE_IMAGE, ArcSoftFace_OrientPriority.ASF_OP_0_ONLY, 1, ASF_Mask.ASF_FACE_DETECT | ASF_Mask.ASF_FACERECOGNITION | ASF_Mask.ASF_AGE | ASF_Mask.ASF_LIVENESS); Console.WriteLine(faceengine.Version.BuildDate); Console.WriteLine(faceengine.Version.CopyRight); Console.WriteLine(faceengine.Version.Version); OpenCvSharp.VideoCapture videoCapture = new OpenCvSharp.VideoCapture(); videoCapture.Open(0); var activeFile = FaceEngine.GetActiveFileInfo(); ////Console.WriteLine(FaceEngine.GetActiveDeviceInfo()); Stopwatch stopwatch = new Stopwatch(); stopwatch.Restart(); //faceengine.InitEngine(ASF_DetectMode.ASF_DETECT_MODE_IMAGE, ArcSoftFace_OrientPriority.ASF_OP_ALL_OUT, 9, // ASF_Mask.ASF_AGE | ASF_Mask.ASF_FACE3DANGLE | ASF_Mask.ASF_FACELANDMARK | ASF_Mask.ASF_FACERECOGNITION | ASF_Mask.ASF_FACESHELTER | ASF_Mask.ASF_FACE_DETECT | // ASF_Mask.ASF_GENDER | ASF_Mask.ASF_IMAGEQUALITY | ASF_Mask.ASF_IR_LIVENESS | ASF_Mask.ASF_LIVENESS | ASF_Mask.ASF_MASKDETECT | ASF_Mask.ASF_UPDATE_FACEDATA); //Console.WriteLine($"引擎初始化: {stopwatch.ElapsedMilliseconds}ms"); Mat mat = new Mat(); //Mat mat = new Mat(@"C:\Users\Jch\Desktop\2.jpg"); while (true) { stopwatch.Restart(); if (videoCapture.Read(mat)) { using (var img = mat.ToBitmap()) using (var imgInfo = ImageInfo.ReadBMP(img)) { Console.WriteLine($"图片处理:{stopwatch.ElapsedMilliseconds}ms"); stopwatch.Restart(); var detectResult = faceengine.DetectFacesEx(imgInfo); Console.WriteLine($"人脸定位:{stopwatch.ElapsedMilliseconds}ms"); if (detectResult != null) { foreach (var item in detectResult.FaceInfos) { Console.WriteLine($"Age: {item.Age}"); Console.WriteLine($"FaceID: {item.FaceID}"); Console.WriteLine($"FaceOrient: {item.FaceOrient}"); Console.WriteLine($"FaceShelter: {item.FaceShelter}"); Console.WriteLine($"Gender: {item.Gender}"); Console.WriteLine($"LeftEyeClosed: {item.LeftEyeClosed}"); Console.WriteLine($"Liveness: {item.Liveness}"); Console.WriteLine($"Mask: {item.Mask}"); Console.WriteLine($"RightEyeClosed: {item.RightEyeClosed}"); Console.WriteLine($"WearGlasses: {item.WearGlasses}"); Console.WriteLine($"FaceRect: bottom->{item.FaceRect.bottom} left->{item.FaceRect.left} right->{item.FaceRect.right} top->{item.FaceRect.top}"); Console.WriteLine($"FaceLandmark: x->{item.FaceLandmark.x} y->{item.FaceLandmark.x}"); Console.WriteLine($"Face3DAngle: {item.Face3DAngle.roll} {item.Face3DAngle.yaw} {item.Face3DAngle.pitch} {item.Face3DAngle.status}"); stopwatch.Restart(); var feature = faceengine.FaceFeatureExtractEx(imgInfo, item); Console.WriteLine($"提取特征值: {stopwatch.ElapsedMilliseconds}ms"); if (feature != null) { Console.WriteLine($"feature: {feature.Size}"); } Console.WriteLine(faceengine.FaceFeatureCompare(feature.ASFFaceFeature, feature.ASFFaceFeature)); var score = faceengine.ImageQualityDetectEx(imgInfo, item); Console.WriteLine($"人脸质量: {score}"); Console.WriteLine("--------------------------------------------"); } } } } } Console.ReadLine(); }
public BodyEngine AttchHandleEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe, BodyEngine be, Image <Gray, byte> img, List <Vector2> axis, bool iscurve) { BodyEngine he = gb.AddComponent <BodyEngine>() as BodyEngine; bool isHandle = true; he.CreateHandleEngine(viewer, ge, proj, re, fe, be, axis, img, iscurve, isHandle); return(he); }
public BodyEngine AttchBodyEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe, List <Vector2> axis, bool iscurve) { BodyEngine be = gb.AddComponent <BodyEngine>() as BodyEngine; be.CreateBodyEngine(viewer, ge, proj, re, fe, axis, iscurve); return(be); }
public void ReconstructAllGeometries() { UpdateEngine(); int i_inst = 0; // Fix null detection result if (geometries.Count == 0 && exper_isCubeExper) { SaveInstanceSeg(); } foreach (var geo in geometries) { i_inst++; // Creat GameObject GameObject inst = new GameObject("Instance" + i_inst); inst.transform.parent = this.gameObject.transform; this.m_Inst_list.Add(inst); // Creat FaceEngine FaceEngine faceEngine = AttchFaceEngineToObject(inst, m_projector, m_renderEngine); List <Image <Rgb, byte> > face_imgs = geo.GetFaceImage(); List <Image <Rgb, byte> > handle_imgs = geo.GetHandleImage(); this.m_faceEngine_list.Add(faceEngine); // Creat MeshViwer GameObject meshViewer = GameObject.Instantiate(m_meshViewer); meshViewer.name = m_ImgName + '_' + i_inst; this.m_meshViewer_list.Add(meshViewer); if (geo.label == Label.Cube) { Image <Rgb, byte> body_img = geo.GetBodyImage(true); // skeleton extractor SkeletonExtractor se = new SkeletonExtractor(geo.GetBodyImage(), face_imgs[0], i_inst); bool iscurve = false; List <Vector2> axis = se.ExtractCubeSkeleton(out iscurve); faceEngine.axis = axis; faceEngine.body_img = body_img.Convert <Gray, byte>(); this.FitTopRect(faceEngine, face_imgs[0].Convert <Gray, byte>()); BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve); this.m_bodyEngine_list.Add(bodyEngine); //--------------------------------------------------- //this.FitBody(bodyEngine); //--------------------------------------------------- // Handle List <BodyEngine> m_handleEngine_list = new List <BodyEngine>(); List <GameObject> m_handleViewer_list = new List <GameObject>(); int handle_i_inst = 0; foreach (Image <Rgb, byte> hi in handle_imgs) { GameObject handleViewer = GameObject.Instantiate(m_meshViewer); handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst; m_handleViewer_list.Add(handleViewer); SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst); seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi); bool ishcurve = false; List <Vector2> axis_h = seh.ExtractSkeleton(out ishcurve); BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this, m_projector, m_renderEngine, faceEngine, bodyEngine, hi.Convert <Gray, byte>(), axis_h, ishcurve); m_handleEngine_list.Add(handleEngine); handle_i_inst++; } this.m_handleViewer_lists.Add(m_handleViewer_list); this.m_handleEngine_lists.Add(m_handleEngine_list); } else if (geo.label == Label.Cylinder) { List <List <Vector2> > face_points = geo.Faces(); double minerror = double.MaxValue; int best_face_idx = 0; for (int i = 0; i < face_points.Count; i++) { double error = faceEngine.LikeAEllipse(face_points[i]); if (error < minerror) { minerror = error; best_face_idx = i; } } Image <Rgb, byte> body_img = geo.GetBodyImage(true); //body_img = MaskParser.FillBodyWithHandle(body_img, handle_imgs); // skeleton extractor bool iscurve = false; SkeletonExtractor se = new SkeletonExtractor(geo.GetBodyImage(), face_imgs, best_face_idx, i_inst); List <Vector2> axis = se.ExtractSkeleton(out iscurve); faceEngine.axis = axis; faceEngine.body_img = body_img.Convert <Gray, byte>(); this.FitTopCircle(faceEngine, face_imgs[best_face_idx].Convert <Gray, byte>()); BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve); this.m_bodyEngine_list.Add(bodyEngine); //--------------------------------------------------- //this.FitBody(bodyEngine); //--------------------------------------------------- // Handle List <BodyEngine> m_handleEngine_list = new List <BodyEngine>(); List <GameObject> m_handleViewer_list = new List <GameObject>(); int handle_i_inst = 0; foreach (Image <Rgb, byte> hi in handle_imgs) { GameObject handleViewer = GameObject.Instantiate(m_meshViewer); handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst; m_handleViewer_list.Add(handleViewer); SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst); seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi); bool ishcurve = false; List <Vector2> axis_h = seh.ExtractSkeleton(out ishcurve); BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this, m_projector, m_renderEngine, faceEngine, bodyEngine, hi.Convert <Gray, byte>(), axis_h, ishcurve); m_handleEngine_list.Add(handleEngine); handle_i_inst++; } this.m_handleViewer_lists.Add(m_handleViewer_list); this.m_handleEngine_lists.Add(m_handleEngine_list); } } //// if(m_bodyEngine_list.Count>1) // { // FaceEngineMulti m_FEM = new FaceEngineMulti(this, m_projector, m_renderEngine, m_faceEngine_list); // m_FEM.Optimize_allRects(); // } foreach (var be in m_bodyEngine_list) { this.FitBody(be); } }
public void FitTopRect(FaceEngine faceEngine, Image <Gray, byte> img) { faceEngine.SolveRect(img); }
public void FitTopCircle(FaceEngine faceEngine, Image <Gray, byte> img) { faceEngine.SolveCircle(img); }