shikailun的日志

使用Luxand FaceSDK识别人脸及其面部特征

.net架构与程序设计的大作业需要提取人脸特征(变态的作业),这让我发现了Luxand FaceSDK,它可以从一张给定的照片中得到到人脸位置,并从中提取特征点信息,提供了C#、C++、Java等API,超级强大。。。

如上图:SDK可以返回66个特征点的坐标,包括人脸的眼睛,眼睛的轮廓,眉毛,嘴唇的轮廓,鼻尖等等。

首先说明一下SDK定义的数据结构

对于每个特征点都是一个TPoint

public struct TPoint 
{ 
    public int x, y; 
}

定义图片的左上角为(0,0) 。

然后就是Face相对于图片的坐标TFacePosition

public struct TFacePosition 
{ 
    public int xc, yc, w; 
    public double angle; 
}

XC和YC是的脸的中心的X和Y坐标,W为脸的宽度,angle指的脸在度平面旋转角度,所以歪的脸也能识别出来吼吼~~

基本操作

下面来介绍最基本的功能,人脸识别,给定一张图片,能够得出是否存在人脸,以及脸的准确位置。

人脸位置

public FSDK.TFacePosition getFacePosition(string fileName)
{
    FSDK.CImage image = new FSDK.CImage(fileName);
    FSDK.TFacePosition facePosition = image.DetectFace();
    return facePosition;
}

如果facePosition的w为0,则说明无法识别,这时如果确定有人脸存在,我们可以设置SDK的阈值(threshold), FSDK.SetFaceDetectionThreshold(int threshold);默认为5,在识别不出来时可以适当降低,不过不建议,因为再小点,什么都会被它当做人脸了。。。

当然FaceSDk是可以识别多张脸的,C#中的API为

int FSDK.DetectMultipleFaces(int Image, ref int DetectedCount, out FSDK.TFacePosition[] FaceArray, int MaxSize);

因为课程用不到就没去尝试。

特征坐标

当我们得到脸的信息后,就可以提取特征坐标了。

public FSDK.TPoint[] getFacialFeatures(string fileName)
{
    FSDK.CImage image = new FSDK.CImage(fileName);
    FSDK.TPoint[] facialFeatures = image.DetectFacialFeatures();
    return facialFeatures;
}

依旧是这么简单,各部位的下标可以参考下面这张图。

FaceSDK还有很多非常强大的功能,如非常有用的人脸匹配,人脸跟踪,还有它可以很神奇的建立一个3D头像,用来做大创真不错。。。

大作业需要提取人脸尽量多的信息,我目前的想法是将一张图对应成下面这样一个数据结构

public struct FaceData { 
    public TPoint[] facialFeatures; 
    public TFacePosition facePosition; 
    int skinColor; 
    int eyeColor; 
    int hairColor; 
}

不过在提取色彩时,由于照片的不确定,效果并不佳,关于头发、色彩提取算法,Luxand是无能为力了,论文到是有一些,不过已经远远超出我的认知范围了。。。。
东拼西凑了一个可以去掉太夸张的颜色,仅保留皮肤信息的算法,这个下篇再来说说。

Posted on
This entry was posted in technology  and tagged DotNET  BabyMaker  CSharp  图像处理