Files
jinko.yikatong/Src/Dlhis.InfoCheck/Controllers/FaceController.cs
2025-09-26 13:49:18 +08:00

110 lines
4.1 KiB
C#

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<FaceController> _logger;
private readonly IHttpContextAccessor _httpContextAccessor;
public FaceController(ILogger<FaceController> logger, IHttpContextAccessor httpContextAccessor)
{
_logger = logger;
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// 人脸质量检测
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[DisableApiLog]
[HttpPost("detection")]
public IEnumerable<string> 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<string> { "未检测到人脸" };
}
var info = faces.First();
var markPoints = faceMark.Mark(bitmap, info);
using var faceQuality = new FaceQuality();
var qualityResult = new List<QualityResultEx>(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) + "不符合");
}
/// <summary>
/// 图片识别对比
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[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
};
}
}