demo:https://github.com/dunitian/DNTLive/tree/master/Software/WaterMarkAPP/LoTWaterAPP 說起這個人臉識別,還真有點緣分。記得逆天以前在學生時代參加創新大賽的時候,題目就是人臉識別打卡 解決別人替人打卡的問題,想想看 ...
demo:https://github.com/dunitian/DNTLive/tree/master/Software/WaterMarkAPP/LoTWaterAPP
說起這個人臉識別,還真有點緣分。記得逆天以前在學生時代參加創新大賽的時候,題目就是人臉識別打卡 解決別人替人打卡的問題,想想看,要是用微軟的faceapi那還不是很容易實現的?
好了,不扯淡了,上次概述了下水印情緣:http://www.cnblogs.com/dunitian/p/6232074.html
一張圖概括:
額,這次先看下效果,然後普及一些開發過程中的知識點,然後介紹一下微軟的FaceAPI
==》原來的功能依舊在,非人臉識別,請在消息框中選擇否
不要求人臉識別的就選否,每個月Api次數是有限的
先生成縮略圖:(後期可以添加縮略比例的調節)
非同步的方式開始幹活了
好了之後會通知你(很多人用非同步的方式不會捕獲異常和完成後的通知,一會我稍微說一下)
看看人臉,免費版的精度這個地步已經很好了(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不是很擅長,湊合著用吧~~