天天看點

水印第四版 ~ 非人水印(添加人臉識别)

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

作者:

毒逆天

出處:

https://www.cnblogs.com/dotnetcrazy

打賞:

18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z

本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!

繼續閱讀