一、主要代码功能
本次作业从人脸识别,调用百度AI,去将两张照片去对比,最后输出数据。
public partial class Form1 : Form { private string APP_ID = "33711276"; private string API_KEY = "1nhS4AcrLFffxqDKB73bb1U7"; private string SECRET_KEY = "rtnRFv5RcE0dMxBWqmL6PX3LYwVAdETW"; private Face client = null; /// <summary> /// 是否可以检测人脸 /// </summary> private bool IsStart = false; /// <summary> /// 人脸在图像中的位置 public Form1() { InitializeComponent(); client = new Face(API_KEY, SECRET_KEY); } private void textBox2_TextChanged(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.InitialDirectory = "D:\\"; dialog.Filter = "所有文件|*.*"; dialog.RestoreDirectory = true; dialog.FilterIndex = 2; if (dialog.ShowDialog() == DialogResult.OK) { if (string.IsNullOrEmpty(textBox2.Text)) { textBox2.Text = dialog.FileName; } else { textBox3.Text = dialog.FileName; } } } public string ReadImg(string img) { return Convert.ToBase64String(File.ReadAllBytes(img)); } private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(textBox2.Text) || string.IsNullOrEmpty(textBox3.Text)) { MessageBox.Show("请选择要对比的人脸图片"); return; } try { string path1 = textBox2.Text; string path2 = textBox3.Text; var faces = new JArray { new JObject { {"image", ReadImg(path1)}, {"image_type", "BASE64"}, {"face_type", "LIVE"}, {"quality_control", "LOW"}, {"liveness_control", "NONE"}, }, new JObject { {"image", ReadImg(path2)}, {"image_type", "BASE64"}, {"face_type", "LIVE"}, {"quality_control", "LOW"}, {"liveness_control", "NONE"}, } }; // 带参数调用人脸比对 var result = client.Match(faces); textBox1.Text = result.ToString(); } catch (Exception ex) { } } }
二、分析代码
1.连接人脸识别API
先定义字符串`APP_ID`, `API_KEY`, `SECRET_KEY`, 用于连接和认证到人脸识别API
然后定义一个`Face`类型的对象client,用于与API交互的客户端。 IsStart表示是否开始检测人脸。
2.读取图片,获取信息
然后使用OpenFileDialog dialog,点击图片,获取图片的路径,在相应的文本框中点击,就是把图片放到哪个存储框里面。
3.提供参数
然后去对比两张图片的必要数据信息。{"image", ReadImg(path1)}, {"image_type", "BASE64"}, {"face_type", "LIVE"},{"quality_control", "LOW"}, {"liveness_control", "NONE"},,列出这5个信息,进行对比。
4.显示结果
最后使用result = client.Match(faces),调用参数进行对比,将结果显示在文本框里面。 score显示两张对比相似度数值多少。
三、其他功能
1.拍照
首先,检查comboBox1
(可用视频设备)中的项数。如果没有视频设备(即comboBox1.Items.Count <= 0
),就显示一个消息框提示用户插入视频设备。后面如果有视频源正在运行(即videoSourcePlayer1.IsRunning
),将会捕获当前视频帧,并将其转换为一个BitmapSource
对象,显示图像。
然后,创建一个PngBitmapEncoder
对象,将BitmapSource
编码为PNG格式。接着,创建一个新的文件名,并检查该文件是否已存在。如果存在,则删除它。然后,使用File.Create
创建一个新的文件流,并使用PngBitmapEncoder
的Save
方法将图像保存到该文件中。在保存图像后,代码检查videoSourcePlayer1
是否正在运行,并如果是,则发送停止信号并等待其停止。这是为了确保在关闭窗体之前视频源已被正确关闭。最后,使用this.Close()
关闭窗体。
2.人脸注册
首先,使用userInfo
从 textBox6
中获取用户资料,并通过 Trim
方法去除前后的空白字符。groupId
从 textBox5
中获取用户组ID,同样通过 Trim
方法去除空白字符。
检查,视频设备的个数,如果少于1个,则显示一个消息框提示用户插入视频设备。如果视频源(videoSourcePlayer1
)正在运行,则捕获当前视频帧并将其转换为 BitmapSource
对象。将 BitmapSource
对象转换为字节数组(img
)。
然后,再检查 result
字符串是否包含 "error_code"。如果包含 "error_code",则显示一个消息框,表明注册失败并显示可能的错误信息。如果不包含 "error_code",则显示一个消息框表明注册成功。
3.识别人脸获取信息
创建了一个OpenFileDialog
对象dialog,可以点击选取照片,然后
获取用户选择的文件名(filename
)。使用Image.FromFile(filename)
读取该文件为一个Image
对象。调用一个名为ConvertImageToBase64
的函数将图像转换为Base64编码的字符串。
定义了两个选项字典options
和options1
,调用client.Detect
方法,并传入Base64编码的图像、图像类型(这里硬编码为"BASE64"
)和选项字典。将Detect
方法的返回值(赋值给result
。将result
转换为字符串,并显示在textBox1
中。