用到的实体类:
public class Age
{
/// <summary>
///
/// </summary>
public double probability { get; set; }
/// <summary>
///
/// </summary>
public int high { get; set; }
/// <summary>
///
/// </summary>
public int low { get; set; }
}
public class Gender
{
/// <summary>
///
/// </summary>
public double probability { get; set; }
/// <summary>
///
/// </summary>
public string value { get; set; }
}
public class Box
{
/// <summary>
///
/// </summary>
public double probability { get; set; }
/// <summary>
///
/// </summary>
public int x_max { get; set; }
/// <summary>
///
/// </summary>
public int y_max { get; set; }
/// <summary>
///
/// </summary>
public int x_min { get; set; }
/// <summary>
///
/// </summary>
public int y_min { get; set; }
}
public class SubjectsItem
{
/// <summary>
/// 刘德华
/// </summary>
public string subject { get; set; }
/// <summary>
///
/// </summary>
public double similarity { get; set; }
}
public class ResultItem
{
/// <summary>
///
/// </summary>
public Age age { get; set; }
/// <summary>
///
/// </summary>
public Gender gender { get; set; }
/// <summary>
///
/// </summary>
public Box box { get; set; }
/// <summary>
///
/// </summary>
public List<SubjectsItem> subjects { get; set; }
public Mask mask { get; set; }
/// <summary>
///
/// </summary>
public List<List<int>> landmarks { get; set; }
}
public class Mask
{
public double probability { get; set; }
public string value { get; set; }
}
public class Root
{
/// <summary>
///
/// </summary>
public List<ResultItem> result { get; set; }
}
public class SubjectModel
{
public string subject { get; set; }
public string image_id { get; set; }
}
接口及用法:
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Http.Json;
internal class Program
{
static HttpClient _httpClient;
static void Main(string[] args)
{
_httpClient = new HttpClient
{
BaseAddress = new Uri("http://localhost:8000/api/v1/"),
Timeout = TimeSpan.FromSeconds(5),
};
_httpClient.DefaultRequestHeaders.Accept.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// 必须添加服务的密钥
_httpClient.DefaultRequestHeaders.Add("x-api-key", "00000000-0000-0000-0000-000000000000");
var bytes = File.ReadAllBytes(@"C:\Users\XXX\XXX\图片\dh.png");
AddProjectItem("Alice", bytes);
Console.ReadLine();
}
/// <summary>
/// 添加人脸库
/// </summary>
private static async void AddProject(string projectName)
{
var result = await _httpClient.PostAsJsonAsync("recognition/subjects", new SubjectModel { subject = projectName });
if (result.Content.Headers.ContentLength > 0)
{
var res = await result.Content.ReadFromJsonAsync<SubjectModel>();
}
}
/// <summary>
/// 删除人脸库
/// </summary>
/// <param name="projectName">人脸库名称</param>
private static async void DeleteProject(string projectName)
{
var result = await _httpClient.DeleteAsync($"recognition/subjects/{projectName}");
if (result.Content.Headers.ContentLength > 0)
{
var res = await result.Content.ReadFromJsonAsync<SubjectModel>();
}
}
/// <summary>
/// 删除训练图片
/// </summary>
/// <param name="id">训练图片Id</param>
private static async void DeleteProjectItem(string id)
{
var result = await _httpClient.DeleteAsync($"recognition/faces/{id}");
if (result.Content.Headers.ContentLength > 0)
{
var res = await result.Content.ReadFromJsonAsync<SubjectModel>();
}
}
/// <summary>
/// 添加训练图片
/// </summary>
/// <param name="projectName">人脸库名称</param>
/// <param name="image">图片数据</param>
private static async void AddProjectItem(string projectName, byte[] image)
{
var result = await _httpClient.PostAsJsonAsync($"recognition/faces?subject={projectName}", new { File = image });
if (result.Content.Headers.ContentLength > 0)
{
var res = await result.Content.ReadFromJsonAsync<SubjectModel>();
}
}
/// <summary>
/// 识别
/// </summary>
/// <param name="bytes">图片数据</param>
private static async void Recognition(byte[] bytes)
{
var result = await _httpClient.PostAsJsonAsync("recognition/recognize?face_plugins=mask", new { File = bytes });
if (result.Content.Headers.ContentLength > 0)
{
var res = await result.Content.ReadFromJsonAsync<Root>();
}
}
}