人脸识别测颜值、测脸龄、测相似度微信接口


Posted in PHP onApril 07, 2016

人脸评分微信接口,获取微信图片地址,curl请求face++接口。解析json数据,计算颜值。返回用户。

颜值匹配版,请到腾讯微校上体验。http://weixiao.qq.com

<?php
/**
 * 人脸识别测颜值、测脸龄、测相似度微信接口
 * @Created by MOS.Ving.
 * @Author: MOS.Ving
 * @Mail 904679843@qq.com
 * @Date: 2016-01-31
 */
 
define("TOKEN", 'weixin'); //设置token
 
//FACE++ 参数 自行到face++官网注册并创建应用
define("API_KEY", "api_key=填在这里"); //你的face++应用 api_key
define("API_SECRET", "&api_secret=这里也要填");//你的face++应用 api_secret
define("ATTRIBUTE", "&attribute=glass,pose,gender,age,race,smiling");//需要返回的内容的参数
 
define("DETECT_URL", "http://apicn.faceplusplus.com/v2/detection/detect?");//检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性api地址
define("LANDMARK_URL", "http://api.faceplusplus.com/detection/landmark?");//检测给定人脸(Face)相应的面部轮廓,五官等关键点的位置,包括25点和83点两种模式api地址
define("COMPARE_URL", "https://apicn.faceplusplus.com/v2/recognition/compare?");//计算两个Face的相似性以及五官相似度api地址
 
define("TYPE","&type=83p");//83点模式
 
 
define("MESSAGE_URL", "");//放回图文消息被点击需要跳转的地址,不需要跳转可不填
 
$wechatObj = new wechatCallbackapiTest();
if($_GET['echostr']){
  $wechatObj->valid();
}else{
  $wechatObj->responseMsg();
}
 
class wechatCallbackapiTest{
  public function valid(){
    $echoStr = $_GET["echostr"];
    //valid signature , option
    if($this->checkSignature()){
      echo $echoStr;
      exit;
    }
  }
 
  public function responseMsg(){
    //get post data, May be due to the different environments
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 
    //extract post data
    if (!empty($postStr)){
        /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
          the best way is to check the validity of xml by yourself */
        libxml_disable_entity_loader(true);
        $postObj   = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $fromUsername = $postObj->FromUserName;
        $toUsername  = $postObj->ToUserName;
        $keyword   = trim($postObj->Content);
        $imgUrl    = $postObj->PicUrl;
        $Event    = $postObj->Event;
        $EventKey   = $postObj->EventKey;
        $MsgType   = $postObj->MsgType;
        $time     = time();
 
        $itemTpl = "<item>
           <Title><![CDATA[%s]]></Title>
           <Description><![CDATA[%s]]></Description>
           <PicUrl><![CDATA[%s]]></PicUrl>
           <Url><![CDATA[%s]]></Url>
           </item>";
 
        if($MsgType == "image"){
          $item_str = sprintf($itemTpl, "颜值报告单", face($imgUrl), $imgUrl, MESSAGE_URL);
 
          $xmlTpl = "<xml>
           <ToUserName><![CDATA[%s]]></ToUserName>
           <FromUserName><![CDATA[%s]]></FromUserName>
           <CreateTime>%s</CreateTime>
           <MsgType><![CDATA[news]]></MsgType>
           <ArticleCount>%s</ArticleCount>
           <Articles>$item_str</Articles>
           </xml>";
          $resultStr = sprintf($xmlTpl, $fromUsername, $toUsername, $time, 1);
          echo $resultStr;
        }
        
    }else {
      echo "";
      exit;
    }
  }
     
  private function checkSignature(){
    // you must define TOKEN by yourself
    if (!defined("TOKEN")){
      throw new Exception('TOKEN is not defined!');
    }
     
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
         
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    // use SORT_STRING rule
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
     
    if( $tmpStr == $signature ){
      return true;
    }else{
      return false;
    }
  }
 
}
 
// 调用人脸识别的API返回识别结果
function face($imgUrl){
  // face++ 链接 
  $jsonStr  =curl_get_contents(DETECT_URL.API_KEY.API_SECRET."&url=".$imgUrl.ATTRIBUTE);
  $replyDic = json_decode($jsonStr,true);
  $faceArray = $replyDic['face'];
   
  $resultStr = "";
     
  for ($i= 0;$i< count($faceArray); $i++){
     
    $resultStr .= "<----第".($i+1)."张脸---->\n";
 
    $tempFace  = $faceArray[$i];
    $faceId   = $tempFace['face_id'];
 
    $tempAttr = $tempFace['attribute'];
    // 年龄:包含年龄分析结果
    // value的值为一个非负整数表示估计的年龄, range表示估计年龄的正负区间
    $tempAge = $tempAttr['age'];
    // 性别:包含性别分析结果
    // value的值为Male/Female, confidence表示置信度
    $tempGenger = $tempAttr['gender'];
    // 种族:包含人种分析结果
    // value的值为Asian/White/Black, confidence表示置信度
    $tempRace = $tempAttr['race'];
    // 微笑:包含微笑程度分析结果
    //value的值为0-100的实数,越大表示微笑程度越高
    $tempSmiling = $tempAttr['smiling'];
    
    // 返回性别
    $sex=$tempGenger['value'];
    if($sex === "Male") {
      $resultStr .= "性别:男\n";
    } else if($sex === "Female") {
      $resultStr .= "性别:女\n";
    }
 
    //返回年龄
    $maxAge = $tempAge['value'] + ($tempAge['range'])/2;
    $age=ceil($maxAge);
    $resultStr .= "年龄:".$age."岁左右吧~ \n";
 
    //返回种族
    if($tempRace['value'] === "Asian") {
      $resultStr .= "肤色:很健康哦~\n";
    }
    else if($tempRace['value'] === "White") {
      $resultStr .= "肤色:皮肤好白哟!^ 3^\n";
    }
    else if($tempRace['value'] === "Black") {
      $resultStr .= " 肤色:你有点黑?!!!\n";
    }
 
    //返回微笑度
    $smiling = intval($tempSmiling['value']);
    $smile = round($tempSmiling['value'],3);
    $resultStr .= "微笑:".$smile."%\n";
 
    if($count<3){
      //计算颜值
      $yanzhi=getYanZhi($faceId,$smiling);
      $resultStr .= "外貌协会专家评分:".$yanzhi."分\n\n";
      $resultStr .= "\xe2\x9c\xa8小编想说:\n";
      switch ($yanzhi){
        case $yanzhi>94:
          $resultStr .="这颜值,爆表了!\n";
          break;
        case $yanzhi>87:
          $resultStr .="你这么好看,咋不上天呢!\n";
          break;
        case $yanzhi>82:
          $resultStr .="百看不厌,继续加油!\n";
          break;
        case $yanzhi>72:
          $resultStr .="还好,还能看!\n";
          break;
        case $yanzhi>67:
          $resultStr .="哎,只是丑的不明显!\n";
          break;
        case $yanzhi>62:
          $resultStr .="如果有钱,可以去整整!\n";
          break;
        default:
          $resultStr .="让我静静,你家没镜子么?\n";
      }
    }
 
  //图片中两个人时,计算相似度
  if(count($faceArray) === 2){ 
    // 获取face_id 
    $tempFace1 = $faceArray[0]; 
    $tempId1 = $tempFace1['face_id']; 
    $tempFace2 = $faceArray[1]; 
    $tempId2 = $tempFace2['face_id']; 
 
    // face++ 链接 
    $jsonStr1 = curl_get_contents(COMPARE_URL.API_KEY.API_SECRET."&face_id2=".$tempId2 ."&face_id1=".$tempId1);  
    $replyDic1 = json_decode($jsonStr1,true); 
 
    //取出相似程度 
    $tempResult = $replyDic1['similarity']; 
     
    $tempSimilarity = $replyDic1['component_similarity']; 
    $tempEye = $tempSimilarity['eye']; 
    $tempEyebrow = $tempSimilarity['eyebrow']; 
    $tempMouth = $tempSimilarity['mouth']; 
    $tempNose = $tempSimilarity['nose']; 
 
    $resultStr .= "<----相似分析---->\n"; 
    $resultStr .= "眼睛:".round($tempEye,3)."%\n"; 
    $resultStr .= "眉毛:".round($tempEyebrow,3)."%\n"; 
    $resultStr .= "嘴巴:".round($tempMouth,3)."%\n"; 
    $resultStr .= "鼻子:".round($tempNose,3)."%\n"; 
     
    $resultStr .= "\n<----匹配结果---->\n两人相似程度:".round($tempResult,3)."%\n"; 
 
    if($tempResult>70){
      $resultStr .="哇塞!绝对的夫妻相了!\n";
    }elseif ($tempResult>50){
      $resultStr .="哎哟,长得挺像!你们快点在一起吧!\n";
    }else{
      $resultStr .="0.0 长得不太一样哦。\n";
    }
   
  } 
 
  //如果没有检测到人脸
  if($resultStr === ""){
    $resultStr = "对不起,俺没有识别出来,请换张正脸照试试=.=";
  }
 
 return $resultStr;
}
 
 
//颜值算法
function getYanZhi($faceId,$smiling){
  $t1=microtime(1);
  $jsonStr = curl_get_contents(LANDMARK_URL.API_KEY.API_SECRET."&face_id=".$faceId.TYPE);
  $t2=microtime(1);
  if(($t2-$t1)>1.5){
    return 75.632;
  }
 
  if ($jsonStr!=false) {
    $replyDic = json_decode($jsonStr,true);
 
    $result = $replyDic['result'];
    $landmarkArry = $result[0];
    $landmark =$landmarkArry['landmark'];
 
    $right_eyebrow_left_corner =$landmark['right_eyebrow_left_corner'];
    $left_eyebrow_right_corner =$landmark['left_eyebrow_right_corner'];
 
    $left_eye_left_corner    =$landmark['left_eye_left_corner'];
    $left_eye_right_corner   =$landmark['left_eye_right_corner'];
 
    $mouth_left_corner     =$landmark['mouth_left_corner'];
    $mouth_right_corner     =$landmark['mouth_right_corner'];
 
    $nose_left         =$landmark['nose_left'];
    $nose_right         =$landmark['nose_right'];
    $nose_contour_lower_middle =$landmark['nose_contour_lower_middle'];
 
    $right_eye_left_corner   =$landmark['right_eye_left_corner'];
    $right_eye_right_corner   =$landmark['right_eye_right_corner'];
 
    $contour_left1       =$landmark['contour_left1'];
    $contour_right1       =$landmark['contour_right1'];
    $contour_chin        =$landmark['contour_chin'];
    $contour_left6       =$landmark['contour_left6'];
    $contour_right6       =$landmark['contour_right6'];
 
    //计算两眉头间的距离
    $c1=distance($left_eyebrow_right_corner['x'],$left_eyebrow_right_corner['y'],$right_eyebrow_left_corner['x'],$right_eyebrow_left_corner['y']);
 
    //眉毛之间的中点坐标;
    $c1_x=($right_eyebrow_left_corner['x']-$left_eyebrow_right_corner['x'])/2+$left_eyebrow_right_corner['x'];
    $c1_y=($right_eyebrow_left_corner['y']-$left_eyebrow_right_corner['y'])/2+$left_eyebrow_right_corner['y'];
 
    //眉毛中点到鼻子最低处的距离
    $c2 = distance($nose_contour_lower_middle['x'],$nose_contour_lower_middle['y'],$c1_x,$c1_y);
 
    //眼角之间的距离
    $c3 = distance($left_eye_right_corner['x'],$left_eye_right_corner['y'],$right_eye_left_corner['x'],$right_eye_left_corner['y']);
 
    //鼻子的宽度
    $c4 = distance($nose_left['x'],$nose_left['y'],$nose_right['x'],$nose_right['y']);
 
    //脸的宽度
    $c5 = distance($contour_left1['x'],$contour_left1['y'],$contour_right1['x'],$contour_right1['y']);
 
    //下巴到鼻子下方的高度
    $c6 = distance($contour_chin['x'],$contour_chin['y'],$nose_contour_lower_middle['x'],$nose_contour_lower_middle['y']);
 
    //眼睛的大小
    $c7_left = distance($left_eye_left_corner['x'],$left_eye_left_corner['y'],$left_eye_right_corner['x'],$left_eye_right_corner['y']);
    $c7_right = distance($right_eye_left_corner['x'],$right_eye_left_corner['y'],$right_eye_right_corner['x'],$right_eye_right_corner['y']);
 
    //嘴巴的大小
    $c8 = distance($mouth_left_corner['x'],$mouth_left_corner['y'],$mouth_right_corner['x'],$mouth_right_corner['y']);
 
    //嘴巴处的face大小
    $c9 = distance($contour_left6['x'],$contour_left6['y'],$contour_right6['x'],$contour_right6['y']);
 
    /* 开始计算步骤 */
    $yourmark = 100;
    $mustm = 0;
 
    //眼角距离为脸宽的1/5,
    $mustm += abs(($c3/$c5)*100 - 25);
 
    //鼻子宽度为脸宽的1/5
    $mustm += abs(($c4/$c5)*100 - 25);
 
    //眼睛的宽度,应为同一水平脸部宽度的!/5
    $eyepj = ($c7_left+$c7_right)/2;
    $mustm += abs($eyepj/$c5*100 - 25);
 
    //理想嘴巴宽度应为同一脸部宽度的1/2
    $mustm += abs(($c8/$c9)*100 - 50);
 
 
    //下巴到鼻子下方的高度 == 眉毛中点到鼻子最低处的距离
    $mustm += abs($c6 - $c2);
 
    return round($yourmark-$mustm+$smiling/10,3);
  }else{
    return 60;
  }
 
}
 
//两点之间的距离
function distance($px1,$py1,$px2,$py2){
  return sqrt(abs(pow($px2 - $px1,2)) + abs(pow($py2 - $py1,2)));
}
 
 
function curl_get_contents($url) {
  $ch = curl_init();
  curl_setopt( $ch , CURLOPT_URL,$url);
  curl_setopt( $ch , CURLOPT_RETURNTRANSFER,1);
  curl_setopt( $ch , CURLOPT_TIMEOUT,1);
  curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT,1.5);
  $result = curl_exec($ch);
  return $result;
}
 
?>

演示图

人脸识别测颜值、测脸龄、测相似度微信接口

PHP 相关文章推荐
PHP 日志缩略名的创建函数代码
May 26 PHP
PHP 数据结构 算法 三元组 Triplet
Jul 02 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
php session劫持和防范的方法
Nov 12 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
PHP实现文件上传和多文件上传
Dec 24 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 PHP
PHP的PDO常用类库实例分析
Apr 07 #PHP
PHP安全下载文件的方法
Apr 07 #PHP
php生成验证码,缩略图及水印图的类分享
Apr 07 #PHP
PHP使用token防止表单重复提交的方法
Apr 07 #PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 #PHP
Linux下编译redis和phpredis的方法
Apr 07 #PHP
php 实现进制相互转换
Apr 07 #PHP
You might like
php设计模式 Facade(外观模式)
2011/06/26 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
php教程之phpize使用方法
2014/02/12 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
详解JS模块导入导出
2017/12/20 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
Python中的集合类型知识讲解
2015/08/19 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
python实现石头剪刀布小游戏
2021/01/20 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
会计专业毕业生自荐信范文
2013/12/20 职场文书
诚信承诺书范文
2014/03/27 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
地震捐款倡议书
2014/08/29 职场文书
党校毕业个人总结
2015/02/28 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
跑吧孩子观后感
2015/06/10 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers