如何识别多个人脸
在开始之前,先解决一个疑问,这个SDK可以识别多个人脸吗。答案当然是可以的。在上一章节中我们实现了识别单个人脸的功能。
你可以下面的地址下载
http://download.csdn.net/download/feishixin/9942684 本教程的相关Demo代码。
如果要识别多个人脸,需要进行下面的设置。
定义人脸的识别数目范围
int nMaxFaceNum = 50;/定义人脸识别的数目,有效范围为1-50/
修改人脸识别的程序。
在上一章节中, 我们的方法是只取到识别到的第一个人脸,因此我们只需要一个显示人脸的地方就可以了。要识别多个人脸,首先就是修改视图。
然后,修改程序为循环。
//识别每一幅图像
for (int i = 0; i < faceRes.nFace; i++)
{
MRECT rect = (MRECT)Marshal.PtrToStructure(faceRes.rcFace + Marshal.SizeOf(typeof(MRECT)) * i, typeof(MRECT));
Image image = CutFace(bitmap, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);
if (i == 0)
{
/*第一个识别到的人脸保存在原位置*/
this.pictureBox2.Image = image;
this.pictureBox2.Tag = faceImageName[i];
}
else
{
/*后面识别到的人脸按顺序并排显示在下面,使用临时创建PictureBox控件的方式显示图片内容*/
PictureBox tempPicture = new PictureBox();
tempPicture.Width = 100;
tempPicture.Height = 120;
tempPicture.SizeMode = PictureBoxSizeMode.Zoom;
tempPicture.Location = new System.Drawing.Point(10 + ((i-1) % 7) * 120, 10 + ((i-1) / 7) * 120);
tempPicture.Image = image;
tempPicture.Tag =faceImageName[i];
this.panel1.Controls.Add(tempPicture);
}
一步步实现人脸识别
先来看一下我们这节的效果
本节我们主要讲解如何根据识别到的人脸信息提取人脸数据特征,并在此基础上讲解一下如何做人脸识别
在人脸识别领域,首先是检测是否有人脸,人脸的区域是哪里,然后对这个区域进行特征点提取,在提取结束后,告诉计算机,这个人脸是谁。
计算机把这些特征信息和人脸的名称保存下来,就形成了人脸库,在识别人脸时,计算机通过一定的算法,检索库中是否有匹配到的人脸结果,给出相似度数据。当人脸的相似度数据达到一定的数值时,就可以认为同一张人脸。
相似度通常是一个0-1的小数。一般来说,数值越大,表示两个人越相近。
注:不同人脸引擎的人脸相似度不具有可比性,例如,我们从Face ++ 拿到的同一个人的人脸相似度可能会在0.8-0.9,虹软的只能在0.6-0.8之间,这并不能说明Face ++ ,它们只是算法的标准不同,例如,虹软在不同人脸0.1-0.2的时候,Face++达到了0.3-0.5
人脸检测并建立人脸库的过程如下
本次教程我们以目录结构作为人脸的存档方式,每张人脸对应一张人脸标识和一个人脸特征。人脸标识和特征使用同一个文件名称来关联,例如人脸a.jpg的特征用a.dat来表示。
好,我们开始我们的课程
集成人脸识别SDK库
我们本次使用到的虹软的SDK包中,提供了人脸识别的库,它的名字叫face_recongnition.dll,我们找到它的SDK文档。
来建立各个结构体和API的C#映射。
首先是结构体
从本节开始,我们不再讲解原始SDK文档中的数据结构和C#数组结构如何映射的,也不再讲解P/Invoke的知识,如果需要了解相关知识,请参考我们上篇文档的相关内容。
AFR_FSDK_FaceInput
public struct AFR_FSDK_FaceInput
{
public MRECT rcF