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不是很擅長,湊合着用吧~~