【Unity3d】百度AI人脸识别实例——描绘人脸特征点

上一篇文章介绍了在Unity3d中使用百度AI人脸识别功能,本文将用一个描绘人脸特征点的程序来讲解对SDK的调用。

首先我们需要搭建一个简单的场景:一个开始测试的按钮,一张供测试和绘制特征点的图片,和显示debug信息的文字框:
场景
列表

然后新建一个叫FaceDetector的脚本,定义变量:

public Text debugInfo;                            // 显示debug信息
public RawImage portrait;                         // 显示图片
public Texture2D texture;                         // 用以描绘特征点的图片

private Face client;                              // 用来调用百度AI接口
private byte[] image;                             // 检测的图像数据
private Dictionary<string, object> options;       // 返回的数据
private JObject result;                           // 接收返回的结果

在Awake方法中初始化数据:

private void Awake()
{
    System.Net.ServicePointManager.ServerCertificateValidationCallback += 
            delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                    System.Security.Cryptography.X509Certificates.X509Chain chain,
                    System.Net.Security.SslPolicyErrors sslPolicyErrors)
                    {
                        return true;           // always accept
                    };

    client = new Face("", "");                 // 此处填写自己申请的key
    var path = Application.dataPath + "/BaiduAI/1.jpg";
    image = File.ReadAllBytes(path);
    options = new Dictionary<string, object>()
    {
        {"face_fields", "beauty,age,expression,gender,landmark" }
    };
}

然后定义一个DetectAndDraw方法,调用百度AI接口并且根据返回的landmark描绘人脸特征点:

public void DetectAndDraw()
{
    result = client.FaceDetect(image, options);                   // 调用API接口
    debugInfo.text = result.ToString();                           // 显示debug信息

    // 复制原图信息
    var width = texture.width;
    var height = texture.height;
    var mask = new Texture2D(width, height);
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
            mask.SetPixel(i, j, texture.GetPixel(i, j));
    }

    // 根据返回的landmark描绘特征点
    var r = result["result"];
    foreach(var value in r)
    {
        var landmarks = value["landmark72"];
        foreach(var lm in landmarks)
        {
            var x = int.Parse(lm["x"].ToString());
            var y = height - int.Parse(lm["y"].ToString());
            // 绘制点为3个像素点单位的正方形
            // 这里其实应该保证绘制的像素点位置在我们检测图片的像素点范围内
            for(int i = x - 1; i <= x + 1; i++)
            {
                for (int j = y - 1; j <= y + 1; j++)
                {
                    mask.SetPixel(i, j, Color.red);
                }
            }
        }
    }
    // 显示描绘特征点之后的图像
    mask.Apply();
    portrait.texture = mask;
}

给Button的OnClick事件添加DetectAndDraw方法,运行并点击Button,就能绘制出人脸特征点了。
运行结果

注意如果要替换检测的图片,需要点击RawImage的Set Native Size确保RawImage的大小与检测图片大小一致,当然也可以在代码中根据两张图的比例来计算确保特征点对应。这里只介绍最简单的方法。

运行程序前请先打开FaceDetector.cs脚本,在Awake方法中的client = new Face(“”, “”)处(line 33)添加自己的key。

工程版本Unity2017.1.0f3。
项目地址:http://pan.baidu.com/s/1kVDtgLx
提取密码:1j5j

By:蒋志杰

猜你喜欢

转载自blog.csdn.net/dark00800/article/details/78250722