using Microsoft.AspNetCore.Mvc; using SkiaSharp; using ViewFaceCore.Core; using ViewFaceCore.Model; using ViewFaceCore; using ViewFaceCore.Configs; using Dlhis.InfoCheck.Request; using Dlhis.InfoCheck.Response; using Kurisu.AspNetCore.UnifyResultAndValidation.Aop; using Kurisu.AspNetCore.Utils.Extensions; namespace Dlhis.InfoCheck.Controllers; [ApiController] [Route("api/[controller]")] public class FaceController : ControllerBase { private readonly ILogger _logger; private readonly IHttpContextAccessor _httpContextAccessor; public FaceController(ILogger logger, IHttpContextAccessor httpContextAccessor) { _logger = logger; _httpContextAccessor = httpContextAccessor; } /// /// 人脸质量检测 /// /// /// [DisableApiLog] [HttpPost("detection")] public IEnumerable FacialDetection(FaceDetectRequest request) { _logger.LogInformation("currentIP:{IP}", _httpContextAccessor.HttpContext.Connection.RemoteIpAddress); var base64Bytes = Convert.FromBase64String(request.Base64); using var stream = new MemoryStream(base64Bytes); using var bitmap = SKBitmap.Decode(stream); using var faceDetector = new FaceDetector(); using var faceMark = new FaceLandmarker(new FaceLandmarkConfig { MarkType = MarkType.Light }); var faces = faceDetector.Detect(bitmap); if (faces.Length == 0) { return new List { "未检测到人脸" }; } var info = faces.First(); var markPoints = faceMark.Mark(bitmap, info); using var faceQuality = new FaceQuality(); var qualityResult = new List(6); qualityResult.Add(faceQuality.DetectEx(bitmap, info, markPoints, QualityType.Brightness)); qualityResult.Add(faceQuality.DetectEx(bitmap, info, markPoints, QualityType.Resolution)); //var clarityResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Clarity); qualityResult.Add(faceQuality.DetectEx(bitmap, info, markPoints, QualityType.ClarityEx)); qualityResult.Add(faceQuality.DetectEx(bitmap, info, markPoints, QualityType.Integrity)); qualityResult.Add(faceQuality.DetectEx(bitmap, info, markPoints, QualityType.Structure)); //var poseResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Pose); qualityResult.Add(faceQuality.DetectEx(bitmap, info, markPoints, QualityType.PoseEx)); return request.CheckList.Where(x => { var r = qualityResult.First(item => item.Type == x.Type); return r.Level < x.Level; }).Select(x => x.Type.GetDescription().Replace("评估", string.Empty) + "不符合"); } /// /// 图片识别对比 /// /// /// [HttpPost("recognize")] public FaceRecognizeResponse FacialRecognize(FaceRecognizeRequest request) { var firstBase64Bytes = Convert.FromBase64String(request.FirstBase64); using var firstStream = new MemoryStream(firstBase64Bytes); using var firstBitmap = SKBitmap.Decode(firstStream); var secondBase64Bytes = Convert.FromBase64String(request.SecondBase64); using var secondStream = new MemoryStream(secondBase64Bytes); using var secondBitmap = SKBitmap.Decode(secondStream); using var recognizer = new FaceRecognizer(new FaceRecognizeConfig()); using var faceDetector = new FaceDetector(); using var faceMark = new FaceLandmarker(); //todo var lft = recognizer.Extract(firstBitmap, faceMark.Mark(firstBitmap, faceDetector.Detect(firstBitmap).First())); var rft = recognizer.Extract(secondBitmap, faceMark.Mark(secondBitmap, faceDetector.Detect(secondBitmap).First())); var similarity = recognizer.Compare(lft, rft); var isSelf = recognizer.IsSelf(similarity); return new FaceRecognizeResponse { Similarity = similarity, IsSelf = isSelf }; } }