C# Winform开发人脸识别小程序 (基于百度接口)
目錄
- 一、設計思路
- 1、背景
- 2、簡介
- 3、用到的技術
- 4、設計
- 功能一:用戶注冊
- 功能概述
- 功能示意圖
- 時序圖
- 功能二:人臉識別
- 功能概述
- 功能示意圖
- 時序圖
- 二、實現(xiàn)
- 1、環(huán)境準備
- 2、百度接口配置
- 3、技術準備
- 4、代碼實現(xiàn)
- 功能一:用戶注冊
- 功能二:人臉識別
- 5、補充
一、設計思路
1、背景
家里面的小朋友(我弟)去參加學校組織的一個小比賽,配合他做了這個人臉識別的小程序,把設計思路和代碼發(fā)在這里。
2、簡介
本程序通過調(diào)用百度的人臉識別相關的云服務算法,最終實現(xiàn)“人臉注冊”和“人臉識別歡迎語提示”這兩個功能。
3、用到的技術
本程序的最終實現(xiàn)形式為Windows桌面程序,本程序主要采用微軟的Winform模式進行開發(fā),編程語言為C#。
開發(fā)所使用的IDE為Visual Studio2019(.NET Core3.1),輔助工具為Postman、Json格式轉(zhuǎn)換工具、Base64編碼工具等。
4、設計
功能一:用戶注冊
功能概述
用戶圖像(照片or實時圖像) + 用戶填寫的信息 => 百度云端
功能示意圖
時序圖
功能二:人臉識別
功能概述
識別出現(xiàn)在鏡頭中的用戶。
功能示意圖
時序圖
二、實現(xiàn)
1、環(huán)境準備
硬件:帶有攝像頭的計算機。
軟件:Windows10 操作系統(tǒng)。
網(wǎng)絡:連接互聯(lián)網(wǎng)。
2、百度接口配置
(1) 打開百度智能云網(wǎng)址,注冊登錄,進入如下界面。
(2) 點擊立即使用。
(3) 點擊創(chuàng)建應用。
(4) 在應用名稱一欄輸入所建應用的名稱,在應用描述一欄輸入對所創(chuàng)建應用的大概描述,然后點擊立即創(chuàng)建。
(5) 點擊返回應用列表即可看到剛才創(chuàng)建應用的詳細信息,并且可以看到獲取到的API key和Secret key。
3、技術準備
(1) 一張圖片,在計算機最底層的本質(zhì)就是一段二進制代碼,不清楚該原理的可以去這個網(wǎng)站轉(zhuǎn)一下試試:
(2) 這次要用到三個百度接口:
A、登錄接口(鑒權認證/獲取Access Token)
用Postman或者其他在線http請求工具調(diào)用一下試試:
注意,client_id和client_secret是你在百度應用中心申請的應用里面的API Key和Secret Key,這兩個東西相當于用戶名和密碼。
B、注冊接口(人臉庫管理/人臉注冊,別的不用看)
C、人臉識別接口(人臉搜索/人臉搜索,別的不用看)
4、代碼實現(xiàn)
功能一:用戶注冊
(1)創(chuàng)建TokenHelper,用于調(diào)用百度登錄接口(鑒權認證/獲取Access Token)
class TokenHelper{public static string getAccessToken(){string clientId = ConfigurationSettings.AppSettings["clientId"];string clientSecret = ConfigurationSettings.AppSettings["clientSecret"];string authHost = "https://aip.baidubce.com/oauth/2.0/token";HttpClient client = new HttpClient();List<KeyValuePair<String, String>> paraList = new List<KeyValuePair<string, string>>();paraList.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));paraList.Add(new KeyValuePair<string, string>("client_id", clientId));paraList.Add(new KeyValuePair<string, string>("client_secret", clientSecret));HttpResponseMessage response = client.PostAsync(authHost, new FormUrlEncodedContent(paraList)).Result;string result = response.Content.ReadAsStringAsync().Result;return result;}注意一下,代碼里的相關參數(shù)都寫在app.config中,這些參數(shù)的值根據(jù)你所申請的百度賬號里的參數(shù)值進行具體配置。
(2)創(chuàng)建ImagHelper,用于圖片的格式轉(zhuǎn)換
public class ImagHelper{/// <summary>/// 圖片轉(zhuǎn)為base64編碼的文本/// </summary>/// <param name="bmp">待轉(zhuǎn)的Bitmap</param>/// <returns>轉(zhuǎn)換后的base64字符串</returns>public static String ImgToBase64String(Image bmp){String strbaser64 = String.Empty;var btarr = convertByte(bmp);strbaser64 = Convert.ToBase64String(btarr);return strbaser64;}/// <summary>/// Image轉(zhuǎn)byte[]/// </summary>/// <param name="img">Img格式數(shù)據(jù)</param>/// <returns>byte[]格式數(shù)據(jù)</returns>public static byte[] convertByte(Image image){ImageFormat format = image.RawFormat;using (MemoryStream ms = new MemoryStream()){if (format.Equals(ImageFormat.Jpeg)){image.Save(ms, ImageFormat.Jpeg);}else if (format.Equals(ImageFormat.Png)){image.Save(ms, ImageFormat.Png);}else if (format.Equals(ImageFormat.Bmp)){image.Save(ms, ImageFormat.Bmp);}else if (format.Equals(ImageFormat.Gif)){image.Save(ms, ImageFormat.Gif);}else if (format.Equals(ImageFormat.Icon)){image.Save(ms, ImageFormat.Icon);}else{image.Save(ms, ImageFormat.Jpeg);}byte[] buffer = new byte[ms.Length];//Image.Save()會改變MemoryStream的Position,需要重新Seek到Beginms.Seek(0, SeekOrigin.Begin);ms.Read(buffer, 0, buffer.Length);return buffer;}}}(3)創(chuàng)建FaceHelper ,用于人臉注冊和人臉搜索(即人臉識別)
class FaceHelper : IDisposable{public string token { get; set; }/// <summary>/// 注冊人臉/// </summary>/// <param name="face"></param>/// <returns></returns>public FaceMsg Add(FaceInfo face){string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + token;Encoding encoding = Encoding.Default;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);request.Method = "post";request.KeepAlive = true;String str = JsonConvert.SerializeObject(face);byte[] buffer = encoding.GetBytes(str);request.ContentLength = buffer.Length;request.GetRequestStream().Write(buffer, 0, buffer.Length);HttpWebResponse response = (HttpWebResponse)request.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);string result = reader.ReadToEnd();FaceMsg msg = JsonConvert.DeserializeObject<FaceMsg>(result);return msg;}/// <summary>/// 搜索人臉/// </summary>/// <param name="face"></param>/// <returns></returns>public MatchMsg FaceSearch(Face face){string host = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=" + token;Encoding encoding = Encoding.Default;HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);request.Method = "post";request.KeepAlive = true;String str = JsonConvert.SerializeObject(face); ;byte[] buffer = encoding.GetBytes(str);request.ContentLength = buffer.Length;request.GetRequestStream().Write(buffer, 0, buffer.Length);HttpWebResponse response = (HttpWebResponse)request.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);string result = reader.ReadToEnd();MatchMsg msg = JsonConvert.DeserializeObject<MatchMsg>(result);return msg;}public void Dispose(){}}(4)創(chuàng)建From
具體細節(jié)略過,詳細代碼已上傳,見文章末尾鏈接,這里就特別注意一下VideoSourcePlayer這個控件,該控件用于動態(tài)調(diào)用攝像頭獲取實時圖像,該控件需要單獨導入這些包:
功能二:人臉識別
人臉識別的實現(xiàn)思路和上述人臉注冊差不多,同樣是用到FaceHelper、ImagHelper、TokenHelper這三個類。
在人臉識別的Form設計時,注意一個點:需要啟動一個子線程實時監(jiān)測攝像頭、輪詢百度人臉搜索接口,一旦攝像頭中出現(xiàn)已注冊的人臉信息,百度接口將立即返回識別結果。
5、補充
(1)源碼和發(fā)布后的可運行小程序稍后發(fā)在評論區(qū)。
(2)攝像頭權限配置:有的用戶電腦可能會無法直接調(diào)用攝像頭,需要設置攝像頭訪問權限,去網(wǎng)上攻略一下怎么在win10設置攝像頭訪問權限。
(3)部署的目標電腦不是必須安裝Visio Studio,只安裝.Net Core環(huán)境就行:windowsdesktop-runtime-3.1.15-win-x64.exe。
(4)注冊程序和人臉識別程序不能同時打開,因為攝像頭無法同時被多個進程占用。
總結
以上是生活随笔為你收集整理的C# Winform开发人脸识别小程序 (基于百度接口)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用对拍程序来debug错误程序的错误数据
- 下一篇: sql2012一段时间无法连接报53错误