使用C#winforms窗體實現人臉登入
阿新 • • 發佈:2019-01-23
首先我們來解決第一個問題
如何做到對兩張圖片的對比?
這一點問題百度已經給予了我們解決方案使用百度的ai來實現對兩張人臉的對比獲得人臉的相似度
在百度AI的首頁(http://ai.baidu.com/)找到
點開即可進入人臉識別的一個頁面
點選立即使用即可百度會要求你用百度賬戶登入,登入成功後會彈出一個人臉識別的應用管理
點選建立應用就會彈出一個新的頁面
填寫相應的內容完成應用的建立
建立成功回到人臉識別的應用管理
點選應用管理
這裡需要記住你的API Key和Secret Key我們在使用人臉識別需要用到這兩個引數
C#程式碼環節
在上面我們已經建立了應用,接著我們就可以在C#中直接使用了
1.首先你需要把下載資源包(AForge安裝目錄下的Release下的dll檔案,aip-csharp-dk-3.3.0.zip檔案中的AipSdk.dll和Newtonsoft.Json.dll)的dll檔案引入到專案中
using AForge;
using AForge.Controls;
using AForge.Imaging;
using AForge.Video;
using AForge.Video.DirectShow;
using Newtonsoft.Json.Linq;
using Baidu.Aip.Face;
2.把AForge安裝目錄下的Release下的dll檔案拖到工具框中會發現多出幾個我們所需的控制元件
準備工作到這裡就差不多了
接下來可以開始準備程式碼了
//例項化一個裝置過濾器
FilterInfoCollection videoDevices;
//例項化一個視訊裝置撲捉器
VideoCaptureDevice videoSource;
//設定下標
private int selectedDeviceIndex = 0;
/// <summary>
/// 在窗體videoSourcePlayer控制元件中繫結展示拍攝裝置的鏡頭
/// </summary>
private void ShowCam()
{
//從電腦中的裝置獲取視訊輸入裝置
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
//設定選中下標為0的裝置
selectedDeviceIndex = 0 ;
//獲得視訊源
videoSource = new VideoCaptureDevice(videoDevices[selectedDeviceIndex].MonikerString);
//視訊解析度也設定為下標為0的裝置的解析度
videoSource.VideoResolution = videoSource.VideoCapabilities[selectedDeviceIndex];
//給控制元件繫結視訊源
videoSourcePlayer1.VideoSource = videoSource;
//開啟控制元件
videoSourcePlayer1.Start();
}
已經把對應的控制元件連線好了,接下來就是抓拍照片
/// <summary>
/// 抓拍照片
/// </summary>
private void TakePhoto()
{
//判斷視訊源是否為空
if (videoSource == null)
{
//返回空
return;
}
//撲抓圖片
Bitmap bitmap = videoSourcePlayer1.GetCurrentVideoFrame();
//將圖片存入一個臨時資料夾
bitmap.Save("E:\\temp\\temp.jpg");
//釋放資源
bitmap.Dispose();
}
抓拍完之後就可以進行人臉識別開始
/// <summary>
/// 人臉對比
/// </summary>
/// <returns>人臉對比的結果</returns>
public double MatchFace()
{
//建立一個用於儲存圖片位置的string型別的陣列
string[] picPath = {"E:\\employeePicPath\\1.jpg","E:\\employeePicPath\\2.jpg","E:\\employeePicPath\\3.jpg"};
//建立百度人臉識別Face交換類,注意這裡的API Key和Secret Key是你建立人臉識別應用時百度給你提供的
Face client = new Face("API Key","Secret Key");
//將抓拍到的圖片轉化成二進位制流
byte[] tempPic = File.ReadAllBytes("E:\\temp\\temp.jpg");
//利用Foreach迴圈來對圖片進行比對
foreach(string path in picPath)
{
//建立儲存圖片的二維陣列
byte[][] images = {tempPic,File.ReadAllBytes(path)};
try
{
//進行圖片對比
Object result = client.Match(images);
}
catch
{
//提示文字框
MessageBox.Show("未能連線到網路","系統提示",MessageBoxButtons.OK);
return;
}
//獲得到了值轉化為Joson值
JObject jResult = JObject.Parse(result.ToString());
try
{
//獲取Jason中獲得的值
double score = double.Parse(jResult["result"][0]["score"].ToString());
}
catch
{
//提示文字框
MessageBox.Show("未能識別到人臉","系統提示",MessageBoxButtons.OK);
}
//返回結果
return score;
}
}
這裡牽涉到關於Jason資料的讀取
通過它的KEY來獲得其中某一項的值
//如上面程式碼中寫到的,就是獲得result下面,下標為0,裡面的score的值
jResult["result"][0]["score"];
檢視更多請訪問http://ai.baidu.com/
聯絡方式:Q:1127393090 WeChat:StevenJohn301
如以上教程有錯誤希望各位大神即使指出,謝謝觀看。