本主题所有内容以软认知服务为技术基础
关于微软人脸识别,请参阅
本节内容请先参阅微软认知服务人脸API接口列表
##实现Face/ Detect
Detect服务接受一个上传的图片,并且识别其中的人脸,如果找不到人脸则返回一个空的数组,否则返回人脸数据的数组,这些人脸数据包含了:FaceID、性别、年龄、微笑值、胡须情况等。
当我们上传了一张有效照片之后,牛津计划会返回给我们对照片中每一个识别成功的人脸的FaceID,这个ID很重要,当我们需要再次了解照片中人脸的信息,我们不必再次上传照片,直接提交这个FaceID即可。
还记得我们说过微信客户端上传的图片是不能直接POST到我们WebAPI服务端的,必须我们从微信服务器去下载照片,然后上传给牛津API,所以我们的代码需要如下实现
[HttpGet]
[Route("face/detect/{weixnmediaid}")]
public async Task<HttpResponseMessage> Detect(string weixnmediaid)
{
var key = "detect";
var file = await new WeixinController().Get(weixnmediaid);
var content = FileHelper.ReadAsync (file);
if (content != null)
{
var result = await client.PostAsync(key,
content,
new Dictionary<string, string> {
{"returnFaceId","true"},
{"returnFaceLandmarks","flase"},
}
);
return client.CreateHttpResponseMessage(Request, result);
}
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
在这里我用了RouteAttribute,微软的ASP.NET WEBAPI的RouteAttribute太好用了,我们可以将路由设计为非常友好的状态,而不用设计为带参数的url,现在我们的API看上去高大上多了。
不过呢,这个是微信的模式,如果我们想做一个标准的网站用input file的组件上传照片,那我们怎么实现呢?如下代码告诉你怎么做了
private static string uploadedImageFiled = System.Configuration.ConfigurationManager.AppSettings["UploadedImage"];
[HttpPost]
[Route("face/detect")]
public async Task<HttpResponseMessage> Detect()
{
var key = "detect";
var httpPostedFile = HttpContext.Current.Request.Files[uploadedImageFiled];
if (httpPostedFile != null)
{
var content = await FileHelper.ReadAsync (httpPostedFile.InputStream);
var result = await client.PostAsync(key,
content,
new Dictionary<string, string> {
{"returnFaceId","true"},
{"returnFaceLandmarks","flase"},
}
);
FileHelper.SaveFile(content, httpPostedFile.FileName);
return client.CreateHttpResponseMessage(Request, result);
}
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
这段代码的采用的是POST,URL进过RouteAttribute优化后不需要带任何参数,API从HttpContext.Current.Request.Files获取上传的图片进行处理。
现在我们封装了Face/ Detect服务了,可以提供微信客户端和PC浏览器客户端的服务了。