C# Winform开发人脸识别小程序 (基于百度接口)
目錄
- 一、設(shè)計(jì)思路
- 1、背景
- 2、簡介
- 3、用到的技術(shù)
- 4、設(shè)計(jì)
- 功能一:用戶注冊(cè)
- 功能概述
- 功能示意圖
- 時(shí)序圖
- 功能二:人臉識(shí)別
- 功能概述
- 功能示意圖
- 時(shí)序圖
- 二、實(shí)現(xiàn)
- 1、環(huán)境準(zhǔn)備
- 2、百度接口配置
- 3、技術(shù)準(zhǔn)備
- 4、代碼實(shí)現(xiàn)
- 功能一:用戶注冊(cè)
- 功能二:人臉識(shí)別
- 5、補(bǔ)充
一、設(shè)計(jì)思路
1、背景
家里面的小朋友(我弟)去參加學(xué)校組織的一個(gè)小比賽,配合他做了這個(gè)人臉識(shí)別的小程序,把設(shè)計(jì)思路和代碼發(fā)在這里。
2、簡介
本程序通過調(diào)用百度的人臉識(shí)別相關(guān)的云服務(wù)算法,最終實(shí)現(xiàn)“人臉注冊(cè)”和“人臉識(shí)別歡迎語提示”這兩個(gè)功能。
3、用到的技術(shù)
本程序的最終實(shí)現(xiàn)形式為Windows桌面程序,本程序主要采用微軟的Winform模式進(jìn)行開發(fā),編程語言為C#。
開發(fā)所使用的IDE為Visual Studio2019(.NET Core3.1),輔助工具為Postman、Json格式轉(zhuǎn)換工具、Base64編碼工具等。
4、設(shè)計(jì)
功能一:用戶注冊(cè)
功能概述
用戶圖像(照片or實(shí)時(shí)圖像) + 用戶填寫的信息 => 百度云端
功能示意圖
時(shí)序圖
功能二:人臉識(shí)別
功能概述
識(shí)別出現(xiàn)在鏡頭中的用戶。
功能示意圖
時(shí)序圖
二、實(shí)現(xiàn)
1、環(huán)境準(zhǔn)備
硬件:帶有攝像頭的計(jì)算機(jī)。
軟件:Windows10 操作系統(tǒng)。
網(wǎng)絡(luò):連接互聯(lián)網(wǎng)。
2、百度接口配置
(1) 打開百度智能云網(wǎng)址,注冊(cè)登錄,進(jìn)入如下界面。
(2) 點(diǎn)擊立即使用。
(3) 點(diǎn)擊創(chuàng)建應(yīng)用。
(4) 在應(yīng)用名稱一欄輸入所建應(yīng)用的名稱,在應(yīng)用描述一欄輸入對(duì)所創(chuàng)建應(yīng)用的大概描述,然后點(diǎn)擊立即創(chuàng)建。
(5) 點(diǎn)擊返回應(yīng)用列表即可看到剛才創(chuàng)建應(yīng)用的詳細(xì)信息,并且可以看到獲取到的API key和Secret key。
3、技術(shù)準(zhǔn)備
(1) 一張圖片,在計(jì)算機(jī)最底層的本質(zhì)就是一段二進(jìn)制代碼,不清楚該原理的可以去這個(gè)網(wǎng)站轉(zhuǎn)一下試試:
(2) 這次要用到三個(gè)百度接口:
A、登錄接口(鑒權(quán)認(rèn)證/獲取Access Token)
用Postman或者其他在線http請(qǐng)求工具調(diào)用一下試試:
注意,client_id和client_secret是你在百度應(yīng)用中心申請(qǐng)的應(yīng)用里面的API Key和Secret Key,這兩個(gè)東西相當(dāng)于用戶名和密碼。
B、注冊(cè)接口(人臉庫管理/人臉注冊(cè),別的不用看)
C、人臉識(shí)別接口(人臉?biāo)阉?人臉?biāo)阉?#xff0c;別的不用看)
4、代碼實(shí)現(xiàn)
功能一:用戶注冊(cè)
(1)創(chuàng)建TokenHelper,用于調(diào)用百度登錄接口(鑒權(quán)認(rèn)證/獲取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;}注意一下,代碼里的相關(guān)參數(shù)都寫在app.config中,這些參數(shù)的值根據(jù)你所申請(qǐng)的百度賬號(hào)里的參數(shù)值進(jìn)行具體配置。
(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()會(huì)改變MemoryStream的Position,需要重新Seek到Beginms.Seek(0, SeekOrigin.Begin);ms.Read(buffer, 0, buffer.Length);return buffer;}}}(3)創(chuàng)建FaceHelper ,用于人臉注冊(cè)和人臉?biāo)阉?#xff08;即人臉識(shí)別)
class FaceHelper : IDisposable{public string token { get; set; }/// <summary>/// 注冊(cè)人臉/// </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
具體細(xì)節(jié)略過,詳細(xì)代碼已上傳,見文章末尾鏈接,這里就特別注意一下VideoSourcePlayer這個(gè)控件,該控件用于動(dòng)態(tài)調(diào)用攝像頭獲取實(shí)時(shí)圖像,該控件需要單獨(dú)導(dǎo)入這些包:
功能二:人臉識(shí)別
人臉識(shí)別的實(shí)現(xiàn)思路和上述人臉注冊(cè)差不多,同樣是用到FaceHelper、ImagHelper、TokenHelper這三個(gè)類。
在人臉識(shí)別的Form設(shè)計(jì)時(shí),注意一個(gè)點(diǎn):需要啟動(dòng)一個(gè)子線程實(shí)時(shí)監(jiān)測攝像頭、輪詢百度人臉?biāo)阉鹘涌?#xff0c;一旦攝像頭中出現(xiàn)已注冊(cè)的人臉信息,百度接口將立即返回識(shí)別結(jié)果。
5、補(bǔ)充
(1)源碼和發(fā)布后的可運(yùn)行小程序稍后發(fā)在評(píng)論區(qū)。
(2)攝像頭權(quán)限配置:有的用戶電腦可能會(huì)無法直接調(diào)用攝像頭,需要設(shè)置攝像頭訪問權(quán)限,去網(wǎng)上攻略一下怎么在win10設(shè)置攝像頭訪問權(quán)限。
(3)部署的目標(biāo)電腦不是必須安裝Visio Studio,只安裝.Net Core環(huán)境就行:windowsdesktop-runtime-3.1.15-win-x64.exe。
(4)注冊(cè)程序和人臉識(shí)別程序不能同時(shí)打開,因?yàn)閿z像頭無法同時(shí)被多個(gè)進(jìn)程占用。
總結(jié)
以上是生活随笔為你收集整理的C# Winform开发人脸识别小程序 (基于百度接口)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用对拍程序来debug错误程序的错误数据
- 下一篇: 开源游戏服务器C#