目录
一、项目介绍
该项目是基于Visual Studio的窗体应用,通过调用百度API,实现人脸识别,调用摄像头拍照取样等复杂功能。其中运用到了网络连接、图像处理、数据库管理及音视频处理等技术。
本博客将简要介绍其实现的方法。首先需要在百度云中创建一个自己的应用,才能到VS2022里面连接,因此操作流程分成了两个大部分,一个在百度云中的操作,一个在vs中的操作。
二、操作流程
(一)在百度云中的操作
- 百度搜索:百度API或者直接点击--->点击我进入 进入如下页面:
- 点击进入,注册登录,进入到接下来这个页面,右上角是你刚刚注册的用户信息。
- 下滑找到这个实名认证的功能,点击进入。
- 点击进入后,立即使用
- 新用户可以领免费的资源:点击领取免费资源
- 领取免费资源之前需要先实名认证,点击立即认证之后会有企业认证和个人人认证,根据自己的需要去认证就可以了。一般个人认证就可以的,只要输入身份证号,然后在手机端人脸认证即可。这里是演示个人认证通过的。全部领取即可。
- 回到这里创建应用,输入应用名称,然后创建完成后在点击查看应用的详情,这里会出现你创建的应用的APPID,API KEY,Secret Key等信息。其中,两个Key码是用于我们在C#程序中实现连接。
- 应用列表中查看人脸库,可以新建组,新建人脸信息
- 创建人脸库,上传照片,这里仅支持jpg,jpeg,bmp等格式,不支持webp或者gif格式的哦
至此,我们在百度云上的操作已经全部完成了,接下来我们将在C#中操作,与百度API连接,进行人脸识别,人脸比对等操作。
(二)在C#中的实现
部分准备工作:
- 首先打开vs2022,打开项目之后,引用右键之后会有管理nuget程序包。创建窗体应用并配置nuget依赖库:要把下面这些都安装好,保证项目可以正常的运行。
-
- 窗体设计如下图所示:
接下来展示部分实现代码
- 首先引入相应的百度云的应用信息,最上面的三个就是你刚刚在百度云注册的应用的密码信息,保证接下来的实现不会有错误出现。
private string APP_ID = "-----";
private string API_KEY = "-----";
private string SECRET_KEY = "-----";
private Face client = null;
private bool IsStart = false;
private FaceLocation location = null;
private FilterInfoCollection videoDevices = null;
private VideoCaptureDevice videoSource;
- 将
Image
对象转换为 Base64 字符串
public string ConvertImageToBase64(Image file)
{
using (MemoryStream memoryStream = new MemoryStream())
{
file.Save(memoryStream, file.RawFormat);
byte[] imageBytes = memoryStream.ToArray();
return Convert.ToBase64String(imageBytes);
}
}
-
获取图片信息
private string GetImagePath()
{
string personImgPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)
+ Path.DirectorySeparatorChar.ToString() + "PersonImg";
if (!Directory.Exists(personImgPath))
{
Directory.CreateDirectory(personImgPath);
}
return personImgPath;
}
-
获取电脑的摄像头设备
private void Form1_Load(object sender, EventArgs e)
{
/// 获取电脑已经安装的视频设备
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices!=null && videoDevices.Count>0)
{
foreach (FilterInfo device in videoDevices)
{
comboBox1.Items.Add(device.Name);
}
comboBox1.SelectedIndex = 0;
}
videoSourcePlayer1.NewFrame += VideoSourcePlayer1_NewFrame;
// 开发者在百度AI平台人脸识别接口只能1秒中调用2次,所以需要做 定时开始检测,每个一秒检测2次
ThreadPool.QueueUserWorkItem(new WaitCallback(p => {
while (true)
{
IsStart = true;
Thread.Sleep(500);
}
}));
}
-
人脸对比功能的代码
private void button2_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)
{ }
}
-
插入电脑的视频设备
private void CameraConn()
{
if (comboBox1.Items.Count<=0)
{
MessageBox.Show("请插入视频设备");
return;
}
videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
videoSource.DesiredFrameSize = new System.Drawing.Size(320, 240);
videoSource.DesiredFrameRate = 1;
videoSourcePlayer1.VideoSource = videoSource;
videoSourcePlayer1.Start();
}
三、功能效果展示
这部分将展示运行的效果。
识别分析图片:
左上角点击分析图片,导入有人脸的照片,就会有相关参数被分析出来。最后会有一个beauty分析,这个参数受外部因素影响还蛮大的哈哈哈。第一张是我的证件照,第二张是彭于晏(有被安慰到哈哈哈,第三张是彭于晏的西装(emm还是帅,可以猜猜p4是谁哈哈哈。
人脸对比结果展示:
其中第一个是两张除了底色不同,其他都相同的证件照,分数达到了100分满分。第二张,第三张是同一个人的不同的照片,人脸识别的对比的分数都达到了80分及以上。图四是选择了没有人脸的文档的图片,提示了“pic has no face”
调用摄像头拍照功能:
点击连接,重新查询设备,这时你要保证你的电脑的摄像头端是打开的,能够被系统检测到,然后点击连接接入摄像头,就可以进行拍照了,摄像头使用结束后,可以点击退出释放摄像头的使用。
四、结语
本博客展示了如何使用C#去调用百度API从而实现人脸检测和人脸比对功能,运用网络连接功能处理复杂的人脸识别项目。
本项目难点在于如何处理HTTP请求和响应,要合理管理API密钥和访问令牌。
标签:string,C#,private,点击,API,人脸,百度 From: https://blog.csdn.net/m0_74154005/article/details/139896924