Files
jinko.yikatong/Src/Dlhis.InfoCheck/Controllers/FaceController.cs
2024-05-07 14:45:48 +08:00

105 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using SkiaSharp;
using ViewFaceCore.Core;
using ViewFaceCore.Model;
using ViewFaceCore.Exceptions;
using ViewFaceCore;
using ViewFaceCore.Configs;
using Microsoft.AspNetCore.Authorization;
using Dlhis.InfoCheck.Request;
using Dlhis.InfoCheck.Response;
namespace Dlhis.InfoCheck.Controllers;
/// <summary>
/// 人脸检测
/// </summary>
[Authorize]
[ApiController]
[Route("[controller]")]
public class FaceController : ControllerBase
{
/// <summary>
/// 人脸质量检测
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost("detection")]
public object FacialDetection(FaceDetectRequest request)
{
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
});
//todo 多人情况
var info = faceDetector.Detect(bitmap).First();
var markPoints = faceMark.Mark(bitmap, info);
using var faceQuality = new FaceQuality();
var brightnessResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Brightness);
var resolutionResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Resolution);
//var clarityResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Clarity);
var clarityExResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.ClarityEx);
var integrityExResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Integrity);
var structureeResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Structure);
//var poseResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.Pose);
var poseExeResult = faceQuality.Detect(bitmap, info, markPoints, QualityType.PoseEx);
return new
{
Brightness = brightnessResult,
Resolution = resolutionResult,
Clarity = clarityExResult,
Integrity = integrityExResult,
Structure = structureeResult,
Pose = poseExeResult
};
}
/// <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
{
//对应阈值 FaceType.Normal:0.62、FaceType.Mask:0.4、FaceType.Light:0.55
FaceType = FaceType.Normal
});
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
};
}
}