如果是从事微信开发的同事我想以前应该见过火爆朋友圈的军装照这个小程序吧,感觉将自己的人脸P无缝P上去感觉高大上。那么这个是怎么实现的呢?
我也不晓得具体怎么实现的,我只需要知道我能通过第三方平台实现这个功能就行了。在此,感谢各位前辈先驱们将相应的技术接口公开免费给我们使用,正因为有你们日以继夜的辛勤付出和无私分享,程序行业开发的功能才越来越厉害。


具体流程

  1. 百度搜索 “腾讯AI开放平台” 进入官网并注册账户,在应用里面选择人脸融合功能模块。(使用这个功能可能会要你录入一些自己的基本信息,如:姓名,电话,邮箱啥的,现在是不是还要这个我也不清楚了)或直接输入网址:https://ai.qq.com
  2. 上传融合的模版素材(图片JPG)图片要求

    自定义上传人脸融合素材模板,扩展使用场景,随心所欲。
    (单一应用暂时只支持上传十张自定义素材,且需通过审核后才可使用。为了提高审核效率,请勿重复上传相同素材。)
    素材规范如下
    模板要求:支持jpg/png;尺寸不超过1080*1080;文件大小不超过500k
    脸部要求:正脸(无抬头低头、无侧转);脸部轮廓与五官无遮挡;脸部光线平均;不露齿;无闭眼;脸部尽量位于图片中间位置
    审核反馈:3个工作日内完成审核,请至应用管理查询审核结果
    版权证明:您需要保证你上传的IP(明星、影视动漫人物等)素材是有版权的,版权文件提交请联系QQ群(581197347)管理员

  3. 调用人脸融合接口融合头像(直接上代码)

include.php (需要的封装包文件,作用是载入需要的工具包,末尾会附上该包的下载地址)

<?php
    // >= php 5.3.0,低版本的php需手动include SDK文件夹的所有文件
    spl_autoload_register(function ($class) {
            include("SDK/{$class}.php");//请注意路径,我的测试默认是在当前目录下,如果你采用了框架,请更改这里的路径
    });
?>

api.php

<?php
    require('include.php');

    /**
     * 图片生成接口
     * String path 用户上传图片在本地的地址
     * int model 模版id
     */
    function generImg($path,$model)
    {
        //请在此填入AppID与AppKey
        $app_id  = '';
        $app_key = '';

        //设置AppID与AppKey
        Configer::setAppInfo($app_id, $app_key);

        // 图片base64编码
        $data   = file_get_contents($path);
        $base64 = base64_encode($data);

        // 设置请求数据
        $appkey = $app_key;
        $params = array(
            'app_id'     => $app_id,
            'image'      => $base64,
            'model'      => $model,
            'time_stamp' => strval(time()),
            'nonce_str'  => strval(rand()),
            'sign'       => '',
        );
        $params['sign'] = Signature::getReqSign($params, $appkey);

        // 执行API调用
        $url = 'https://api.ai.qq.com/fcgi-bin/ptu/ptu_facemerge';
        $response = HttpUtil::doHttpPost($url, $params);
        $res = json_decode($response,true);

        if($res['ret']==16402){
            return array(
                'code'  =>  10001,
                'msg'   =>  '您上传的图片未检测到头像'
            );
        }

        if($res['ret']==0)
        {
            $image = base64_decode($res['data']['image'],true);
            $fileName = getFileName();
            $file = fopen($fileName,'w');
            fwrite($file,$image);
            fclose($file);

            return array(
                'code'  =>  'ok',
                'msg'   =>  'gener success',
                'result'=>  array(
                    'imgPath'   =>  $fileName
                )
            );
        }else{
            return array(
                'code'  =>  10002,
                'msg'   =>  'not log',
                'result'=>  $res
            );
        }
    }

    /**
     * 图片合成成功后,保存到本地的绝对路径位置
     * @return
     * String 合成的图片存储在本地的位置,我这里默认写的是在当前目录下,你可以更改这里使之换到自定义的目录下面
     */
    function getFileName(){
        return __DIR__ . '/' . 'DY_' . time() . rand(1000,9999).'.jpg';
    }

/*
 * demo 测试
 */
$path   = './test7.jpg';   //需要融合的图片,也就是用户上传的图片
$model  = 13078;           //素材id(审核成功后在腾讯AI后台获取)
$filepth = generImg($path,$model);	//$filepath 就是合成后的图像在本地的路径地址

?>

工具包下载地址

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐