水印第四版 ~ 非人水印(添加人脸识别)

demo:https://github.com/dunitian/DNTLive/tree/master/Software/WaterMarkAPP/LoTWaterAPPhtml

提及这我的脸识别,还真有点缘分。记得逆天之前在学生时代参加创新大赛的时候,题目就是人脸识别打卡 解决别人替人打卡的问题,想一想看,要是用微软的faceapi那还不是很容易实现的?git

好了,不扯淡了,上次概述了下水印情缘:http://www.cnblogs.com/dunitian/p/6232074.htmlgithub

一张图归纳:api

额,此次先看下效果,而后普及一些开发过程当中的知识点,而后介绍一下微软的FaceAPI异步

==》原来的功能依旧在,非人脸识别,请在消息框中选择async

不要求人脸识别的就选否,每月Api次数是有限的spa

先生成缩略图:(后期能够添加缩略比例的调节)3d

异步的方式开始干活了htm

好了以后会通知你(不少人用异步的方式不会捕获异常和完成后的通知,一会我稍微说一下)blog

看看人脸,免费版的精度这个地步已经很好了(19个脸就2张有点偏差),要是你把他用来人脸打卡,彻底能够容许的嘛,没识别出来再试一试就ok了

点开一张看看,其实仍是挺明显的(网上的face api基本上都是对正脸识别比较好,侧脸就差不少,微软的这个算不错的了【以前微软不是有两款小游戏很火嘛,就是用的人脸识别】)

上面演示部分结束了,咱们进入技术探讨环节(技术有什么不到位的或者还有什么更好方案的。还望同志们提点一下,小子敢于接受批评)

先说下,设置超时时间,异常处理

完成后的通知其实也很简单:

有人可能会说:Task.Factory.StartNew 和 Task.Run 同样不?Run就是第一种方式,只不过自动添加了一些默认参数

再说下Magick,以前说了水印的用法:http://www.cnblogs.com/dunitian/p/5895133.html

此次基本上用法全了,缩略图,裁剪,水印 

裁剪官方文档没有说,我是根据命令逆推的==》写了个demo:https://github.com/dunitian/TempCode/tree/master/2016-12-26/MagickTest

生成缩略图很简单:

 水印官方写的很详细:

-------------------------------------------------------------------------------------------------

一下无论这个了,说说人脸识别,以前不知道官方有sdk,本身封装了。一块儿看看吧,有利于理解官方sdk:

首先定义了一我的脸识别的专用异常类:(别问我为啥不直接用Exception,不知道百度下~)

下面进行场景还原,为何这样封装,不少人不写方法,直接贴代码,看的容易晕

而后是Model,我这边没高兴封装脸部关键点,需求决定一切(我只要面部矩阵),若是是Face++就得本身算了

微软返回结果是这个:

那model天然就得这么封装了

注意处理一下每一个字段的负数状况(后面计算是可能为负的)

下面就是核心代码:(我这边分了网页URL和本地图片路径,SDK好像统一用流的方式)

为何我分两种状况,看这两张图就能理解:

根据要求进行封装:

看代码: 

 下面就是响应了

太多,我就不贴了,看对应代码:(微软的提示是英文的,我得简单封装下)

 调用就不用说了吧:await FaceHelper.GetFaceModelList(path) or FaceHelper.GetFaceModelList(path).Result

微软的api很简单,eg:

 private static async Task<IEnumerable<Face>> UploadAndDetectFaces(string imageFilePath)
        {
            try
            {
                using (Stream imageFileStream = File.OpenRead(imageFilePath))
                {
                    var faceClient = new FaceServiceClient(FaceHelper.GetAPIKey());
                    return await faceClient.DetectAsync(imageFileStream);
                }
            }
            catch (FaceAPIException ex)
            {
                throw ex;
            }
        }

  

 先这样吧,WPF不是很擅长,凑合着用吧~~