110 lines
4.1 KiB
C#
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
|
|
};
|
|
}
|
|
} |