104 lines
3.7 KiB
C#
104 lines
3.7 KiB
C#
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("api/[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
|
||
};
|
||
}
|
||
} |