目录
一、项目背景及意义
随着计算机视觉和人工智能算法的快速发展,人脸识别技术逐渐被应用于日常生活和商业场景中。同时,百度、阿里、腾讯等互联网平台推出了云服务,将他们的技术共享到云端,以接口的形式向普通用户提供服务。
二、采取的技术
C#语言:用于后端开发和相关逻辑编写
ASP.NET:用于构建Web应用程序的框架
Entity Framework:用于数据库管理和操作的ORM工具
图像处理库:如OpenCV或Emgu CV,用于图像处理和人脸识别
网络连接:HTTP/HTTPS协议、TCP/IP协议等网络通信技术
文件处理:文件上传、下载、存储等相关技术
版本控制:如Git等版本控制工具
三、准备阶段
1.搜索“百度AI开放平台”
2.打开人脸识别云服务
3.点击立即使用
4.点击左侧应用列表后,创建应用
四、界面展示
设计界面如下图所示:
五、代码实现
5.1识别图片
private void button1_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.InitialDirectory = "E:\\教学\\VS222302 - desktop\\baiduAIFaceIdentify-master\\baiduAIFaceIdentify-master\\BaiduAI\\BaiduAI\\bin\\Debug"; dialog.Filter = "所有文件|*.*"; dialog.RestoreDirectory = true; dialog.FilterIndex = 1; if (dialog.ShowDialog() == DialogResult.OK) { string filename = dialog.FileName; try { Image im = Image.FromFile(filename); var image = ConvertImageToBase64(im); string imageType = "BASE64"; // 如果有可选参数 var options = new Dictionary<string, object>{ //{"max_face_num", 2}, {"face_field", "age,beauty"}, {"face_fields", "age,qualities,beauty"} }; var options1 = new Dictionary<string, object>{ {"face_field", "age"}, {"max_face_num", 2}, {"face_type", "LIVE"}, {"liveness_control", "LOW"} }; var result = client.Detect(image, imageType,options); textBox1.Text = result.ToString(); //FaceDetectInfo detect = JsonHelper.DeserializeObject<FaceDetectInfo>(result.ToString()); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
说明:
该方法的功能是打开一个文件对话框,让用户选择一个文件,并读取该文件的图像数据。
1.创建一个OpenFileDialog对象dialog用于打开文件对话框。设置dialog的初始目录为指定路径,过滤器为所有文件,还原目录为true,过滤器索引为1。
2.通过对话框的ShowDialog方法显示文件对话框,并判断用户是否点击了确定按钮。如果用户点击了确定按钮,就获取选中文件的文件名,然后尝试从该文件名所指定的路径读取图像数据。
3.使用Image.FromFile方法将图像数据加载到im对象中。然后将图像数据转换成Base64编码的字符串,以便传输给百度AI接口。
4.定义一个options字典,存储可选参数。这里设置了人脸检测的返回字段为年龄和颜值。
5.调用百度AI接口的Detect方法,传入图像数据、图像类型和可选参数。将返回的结果转换为字符串并显示在textBox1文本框中。
6.如果出现异常,将异常信息显示在消息框中。
5.2选择人脸图
private void button3_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; } } }
说明:
InitialDirectory
:设置文件对话框的初始目录为D:\
Filter
:设置文件过滤器为“所有文件”,即显示所有文件类型RestoreDirectory
:在文件对话框关闭后,还原当前目录到之前的状态FilterIndex
:设置过滤器索引为 2,尽管这里的索引似乎没有特别的实用性,因为只有一个过滤器ShowDialog()
:显示文件对话框,并等待用户选择文件或取消操作DialogResult.OK
:检查用户是否点击了“确定”按钮。string.IsNullOrEmpty(textBox2.Text)
:检查textBox2
是否为空,即判断textBox2
是否已有文本内容。如果textBox2
为空,则将选定的文件路径赋值给textBox2
的Text
属性;如果textBox2
不为空,则将选定的文件路径赋值给textBox3
的Text
属性。
5.3人脸对比
检查文本框是否为空:
if (string.IsNullOrEmpty(textBox2.Text) || string.IsNullOrEmpty(textBox3.Text)) { MessageBox.Show("请选择要对比的人脸图片"); return; }
说明:
- 使用
string.IsNullOrEmpty
方法检查textBox2
和textBox3
是否为空- 如果任意一个文本框为空,则弹出提示消息“请选择要对比的人脸图片”,并返回,不继续执行后续代码
尝试执行代码块:
try { string path1 = textBox2.Text; string path2 = textBox3.Text;
说明:
- 进入
try
块,以捕获可能抛出的异常- 获取
textBox2
和textBox3
中的文本内容,分别赋值给path1
和path2
创建包含人脸数据的
JArray
对象: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"}, } };
说明:
- 创建一个
JArray
对象faces
,内部包含两个JObject
对象- 每个
JObject
对象表示一张人脸图片的数据liveness_control
: 活体检测控制参数,设置为"NONE"
quality_control
: 质量控制参数,设置为"LOW"
face_type
: 指定人脸类型为"LIVE"
,表示活体人脸image_type
: 指定图像类型为"BASE64"
image
: 使用ReadImg(path)
方法读取图片路径,将图片编码为 BASE64 格式
调用人脸比对接口:
var result = client.Match(faces); textBox1.Text = result.ToString();
说明:
- 调用
client.Match(faces)
方法进行人脸比对操作- 将比对结果转换为字符串,并显示在
textBox1
中
捕获异常:
catch (Exception ex) { }
说明:
1.捕获任何在
try
块中发生的异常,但没有做任何处理,只是空的catch
块。实际应用中, 建议至少记录异常信息或显示错误提示。
六、运行结果
1.点击识别图片,结果如下图所示
2.选择人脸图后,点击人脸对比,结果如下图所示
七、实验小结
1. 需求分析与设计:
-明确需求:实现一个界面,能够让用户选择两张人脸图片,并进行比对。
- 设计界面,包括文本框用于输入图片路径和一个按钮用于触发比对操作。2. 编码实现:
- 使用了C#语言和JSON.NET库来处理数据和调用API。
- 编写了读取图像并将其转换为BASE64格式的方法。
- 实现了按钮点击事件处理方法,其中包括了路径验证、图像数据的组织以及调用人脸比对API的步骤。3. API调用:
- 利用第三方库调用了人脸比对API,将两张图像的数据传递给该API进行比对。
- 将比对结果显示在界面的文本框中。4. 异常处理:
- 在关键的代码段进行了异常处理,以确保程序的稳定性和可靠性。5. 学习收获:
- 通过这次实验,学习了如何在C#环境下处理图像数据和调用外部API。
- 熟悉了JSON数据的构建和处理,以及如何与第三方库集成来实现更复杂的功能。
- 加深了对异常处理的重要性和实际应用的意义。
通过本次实验,不仅深入了解了人脸比对算法的基本实现原理,还掌握了如何将理论应用到实际的编程中。通过不断地尝试和调试,我不仅提高了自己的编程能力,还增加了解决问题和调试代码的经验。未来,在类似的项目中,我会继续积累经验,改进代码的质量和性能,以更好地满足用户和项目的需求。