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;
///
/// 人脸检测
///
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class FaceController : ControllerBase
{
///
/// 人脸质量检测
///
///
///
[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
};
}
///
/// 人脸对比
///
///
///
[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);
//对应阈值 FaceType.Normal:0.62、FaceType.Mask:0.4、FaceType.Light:0.55
//FaceType = FaceType.Normal,
using var recognizer = new FaceRecognizer();
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
};
}
}