腾讯AI滤镜之Unity实现

准备工作

  因为我们要调用的是腾讯的远程API滤镜接口,因此要先注册账号(注册地址),然后创建应用程序,进入控制台,点击“创建应用”即可完成创建。再查看应用信息,拷贝app_id和app_key,后面要用到。如下图所示:

  这里也给出腾讯AI滤镜的开发文档地址(开发文档),大家可以先自己了解一下,然后再往下看。

核心代码讲解

  总共有天天P图和AI Lab两个滤镜API接口,不过参数基本相同,都是htpp post请求。本文是基于Unity2018.3.0进行开发,将使用UnityWebRequest进行post请求。API 具体的请求参数如下:

  对于天天P图的API接口,总共有6个参数,app_id大家可以在上面创建的应用信息中找到,如下图:
  filter对应的是滤镜的效果id,天天P图有32种效果,为1-32;AI Lab有65种效果为1-65;接下来主要重点讲解一下其他三个个参数。

  首先是time_stamp,int类型,根据字段描述,可以知道是请求时间戳,以秒为单位,因此只要算出当前时间距1970.01.01:00:00:00的秒数就好,具体代码如下:


    private string GetUnixTimestamp()
    {
        //获取时间
        TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0);
        //将时间转换为以秒为单位,因此是64位的整型值
        return Convert.ToInt64(timeSpan.TotalSeconds).ToString();
    }

  然后是image参数,string类型,要求是base64编码数据(这是什么鬼)。刚看到,我也是一头雾水,通过查阅资料发现用C#实现就是先把图片转换为byte数组,然后再转换为base64字符串即可。具体代码如下:


    private string Bytes2Base64(byte[] bytes)
    {
        string base64 = Convert.ToBase64String(bytes);

        int mod = base64.Length % 4;
        if(mod > 0)
        {
            base64 += new string('=', 4 - mod);
        }

        return base64;
    } 

  不过有个坑就是,通过在线工具转换的base64字符串长度是4的整数倍,不足的用"="补足了。因此上面的代码进行了4的倍数判断并自动补足。
  最后一个参数是sign,授权密钥,比较头疼,不过看过描述之后,觉得也还好。授权描述如下:

  从上面的描述,我们可以知道主要就是对请求参数按键值对中key值进行升序排列,然后并对value进行URL编码,并且URL编码采用大写字母;接着再将app_key放到字符串的最后;最后对得到的字符串进行MD5加密运算,并把加密字符串全部转换为大写字母。

  不过问题又来了,什么是URL编码?查阅资料,最后发现Unity中实现该算法,调用UnityWebRequest.EscapeURL(string)即可,但对得到的字符串要转换为大写字母。具体实现代码如下:


    private string ConvertURLEncode(string str, bool isImage=false)
    {
        string urlCode = UnityWebRequest.EscapeURL(str);
        if (isImage)
        {
            string str1 = UnityWebRequest.EscapeURL("+");
            string str2 = UnityWebRequest.EscapeURL("/");
            string str3 = UnityWebRequest.EscapeURL("=");

            urlCode = urlCode.Replace(str1, str1.ToUpper());
            urlCode = urlCode.Replace(str2, str2.ToUpper());
            urlCode = urlCode.Replace(str3, str3.ToUpper());
            return urlCode;
        }
        else
            return urlCode;
    }

  对于上面的代码,大家会发现为什么对于图片的base64字符没有直接进行URL编码。这是因为URL编码只对部分字符进行编码,对数字和英文字母不进行编码(具体请看这里URL编码)。而且如果我们对整个base64字符串进行URL编码,会消耗相当长的一段时间。因此我采用了如上的代码实现URL编码。
  URL编码我们已经会了,接下来就是对得到的字符串进行MD5运算,得到sign授权字符串。而C#刚好实现了MD5加密算法,具体代码如下:

    
    private string GetMD5Str(string str)
    {
        byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
        //转换为大写字母字符串
        return BitConverter.ToString(bytes).ToUpper().Replace("-", "");
    }

  所有的参数我们都已经准备好了,那就可以进行Http post请求了,不过请求成功返回什么样的结果呢?具体可以看文档的描述,如下图所示:

  可以看到,返回的图片任然是以base64字符串的形式,因此我们要自己将base64字符串转换为图片,这个实现我就留给大家自己做了。不过有人该问了,这么多数据项,我要怎么拿到呀?其实返回的结果是json字符串给我们的,我们只要把json字符串利用Unity中的JsonUtility转换为对应参数的对象就可以了。我们可以将返回的结果定义为如下的数据结构:
    
    [Serializable]
    public class Data
    {
        public string image;
    }

    [Serializable]
    public class ImageData
    {
        public int ret;
        public string msg;
        public Data data;
    }

  最后一点就是对于AI Lab的API接口参数对了一个session_id参数,对于的是string类型,作用是请求id,只要保证每次请求值与之前不一样即可。下面是post请求表单和sign计算代码:


    private WWWForm GetPostForm(byte[] imgBytes, FilterType filterType, int filterId)
    {
        //将图片转换为Base64字符串
        string imgStr = Bytes2Base64(imgBytes);//图片转为JPG格式的字符串,减小图片大小

        //获取时间戳
        string timeStamp = GetUnixTimestamp();

        //设置请求字段
        WWWForm form = new WWWForm();
        form.AddField("app_id", int.Parse(app_id));
        form.AddField("filter", filterId);
        form.AddField("image", imgStr);
        form.AddField("time_stamp", int.Parse(timeStamp));
        form.AddField("nonce_str", timeStamp);

        //获取加密原字符串,对<key,value>按key升序排列
        string originalStr = "app_id=" + app_id +
                            "&filter=" + filterId +
                            "&image=" + ConvertURLEncode(imgStr, true) +
                            "&nonce_str=" + timeStamp;
        if (filterType == FilterType.TTPTUFilter)
        {
            originalStr += "&time_stamp=" + timeStamp +
                            "&app_key=" + app_key;
        }
        else
        {
            originalStr += "&session_id=" + timeStamp +
                            "&time_stamp=" + timeStamp +
                            "&app_key=" + app_key;
            form.AddField("session_id", timeStamp);
        }
        form.AddField("sign", GetMD5Str(originalStr));

        return form;
    } 

效果展示

  总算把这篇文章给写完写出来了,本来准备上周日就写的,一直拖到现在......后面会专注于新媒体互动开发的相关分享,不过只做应用方面的分享,不过讲底层的东西,大家可以自己去深挖研究。还有源工程就不放出来了,至于原因,就不说了,github速度......我已经不可以说什么了,不过这个速度慢的原因太多!!!

原文地址:腾讯AI滤镜之Unity实现

如有侵权,请联系删除!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Unity是一个强大的游戏开发引擎,借助其丰富的功能和易用的界面,可以实现各种复杂的游戏效果,包括AI换脸。 实现AI换脸涉及到图像处理和人工智能技术,在Unity中可以借助一些开源的工具和插件来实现。 首先,我们需要使用图像处理技术来识别人脸,并将其提取出来。Unity中可以使用OpenCV这样的工具库来进行人脸识别和特征点提取。通过分析图像中的特征点,我们可以确定人脸的位置和形状。 接下来,我们需要使用机器学习和深度学习技术来实现AI换脸。可以使用神经网络模型,如人脸关键点检测模型(face landmark detection),将两个人脸的特征点进行匹配和对齐,从而实现两个人脸的对换。也可以使用生成对抗网络(GAN)来生成逼真的换脸效果。 在Unity中,我们可以使用TensorFlow或PyTorch等深度学习框架来训练和部署模型,并将其集成到Unity项目中。通过将AI模型与Unity中的游戏对象进行绑定,我们可以实现实时的AI换脸效果。 此外,在Unity中还可以使用Shader来实现更加逼真的换脸效果。通过编写自定义的Shader代码,我们可以控制透明度、光照、纹理等方面,使换脸效果更加真实。 综上所述,使用Unity实现AI换脸需要借助图像处理和人工智能技术,可以通过使用开源工具和插件、深度学习框架、自定义Shader等方法来实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛·枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值