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

人脸评分微信接口,获取微信图片地址,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;
}

?>

演示图

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索人脸识别
微信接口
人脸颜值预测 opencv、人脸识别 颜值、opencv 人脸颜值 c、人脸相似度对比软件、人脸相似度在线测试,以便于您获取更多的相关知识。

时间: 2024-10-26 03:48:28

人脸识别测颜值、测脸龄、测相似度微信接口_php实例的相关文章

网易邮箱人脸识别系统:有“脸”更安全

不只有<碟中谍4>中的汤姆·克鲁斯才能耍酷.网易人脸识别系统首先用于邮箱产品,以后登录邮箱你可以耍酷,通过扫描脸部登录邮箱.目前该应用开始公测,公测阶段,网易邮箱公开招募6000名网易邮箱用户优先试用,对网络新应用时刻关注的笔者,有幸通过网易手机号码邮箱申请获得体验权. 评测环境 时间:6月8日15:00-16:00 软件:Chrome浏览器最新版本 邮箱:网易126免费邮 硬件:戴尔XPS L502X 集成摄像头 系统:Windows XP 前期准备: 申请测试权.用户可以在页面或在网易免费

签到请刷脸,中传教授让人脸识别“走进”大学课堂

近日,新京报拍摄的一段视频在微博上引发网友转发讨论,中国传媒大学一位老师在课堂上用ipad进行刷脸签到,学生们排队站在终端前一秒钟左右就可识别通行. 中传教授将人脸识别带入课堂 该老师名叫沈浩,是中国传媒大学新闻学院教授.大数据挖掘与社会计算实验室主任.沈浩教授表示该系统主要是借助了百度的技术,然后开发出了这个适用于课堂的作业模式,从目前的使用效果来看,成功率非常高,如今他所带的六个班级都采用了刷脸签到. 沈浩老师说,"在通过系统刷脸识别之前,学生们必须提交个人照片进行人脸图像采集.在这个过程中

【干货合集】你所不知道的蚂蚁技术系列之(三):咻红包、人脸识别、人工智能、金融技术

8月30-31日20:00-21:30,一场别开生面的技术大会-- "蚂蚁金服&阿里云在线金融技术峰会"将在线举办.本次将聚焦数据库.应用架构.移动开发.机器学习等热门领域,帮助金融业技术开发者深入解析互联网应用的前沿应用与技术实践. 蚂蚁金服&阿里云在线金融技术峰会专题:https://yq.aliyun.com/activity/109 峰会统一报名链接:http://yq.aliyun.com/webinar/join/38 2015双11,蚂蚁金服旗下支付宝共完

人脸识别ATM机来了:这技术真靠谱吗?

文章讲的是人脸识别ATM机来了:这技术真靠谱吗,昨天,科技圈被一台金融圈的机器给刷屏了,就是我们大家都用过的ATM机.这台ATM机的神奇之外就在于,让金融设备进入了刷脸时代,也就是说用户取钱光 有密码已经不行了,还得要"脸".这已经不仅是互联网的跨界,而是智能科技深入到了我们的各行各业,并正在对各行各业进行改造. 人脸识别技术发展的现状 人脸识别技术在生物识别技术领域,其实并不算什么新鲜事.关于人脸识别系统的始于20世纪60年代,之后伴随着计算机技术的发展而演变;上世纪90年代后期,以

人脸识别这么火,这些你知道吗

"如何证明我就是我"这在原本对于很多人来说是跑断腿的难题,现在这个难题已经被人脸识别技术攻破,因为身份证也要进入"刷脸时代".从2016国家网络安全宣传周法治日获悉,目前公安部研发出与实体身份证唯一对应的"身份证网上副本",有了"网上身份证",以后住酒店.证券开户等需要刷身份证的都可以直接刷脸. 研制网上身份证的公安部第一研究所的相关负责人在接受采访时表示,未来,利用"居民身份证网上副本"技术,为能在各个应

Tracking.js —— 实现网页上的人脸识别

Tracking.js 详细介绍Tracking.js 库给浏览器带来不同的计算机视觉算法和技术,通过使用流行的 HTML5 规范可以让你实时的对网页进行颜色跟踪.人脸识别等等.而且该库体积小 (~7k),接口直观. 在线人脸识别演示:http://trackingjs.com/examples/face_tag_friends.html 示例代码: var colors = new tracking.ColorTracker(['magenta', 'cyan', 'yellow']); co

网易邮箱启动 人脸识别系统公测

近日,据相关媒体报道,网易邮件事业部宣布,与网易邮箱结合的网易人脸识别应用即日起公测,网易邮箱公开招募6000名网易邮箱用户优先试用.据悉脸识别技术将逐步应用到网易通行证旗下各款产品.而这一系统未来的发展趋势,还需要我们拭目以待. 网易人脸识别系统由网易杭州研究院自主研发,要求用户在终端拥有摄像头,通过摄像头捕捉人脸信息进行比对,这是一项用户自主选择开通的安全屏障. 据网易邮箱介绍,网易邮箱上的网易人脸识别应用已经通过了内部测试,现进入公测阶段,公开招募邮箱用户对产品进行试用,网易邮箱将根据反馈

网易人脸识别系统即日起公测 招募6000名试用用户

网易自主研发的人脸识别系统终于揭开神秘面纱.网易邮件事业部宣布,与网易邮箱结合的网易人脸识别应用即日起公测,目前国际互联网尚无在用户安全方面运用人脸识别系统的先例,网易邮箱此举填补了互联网领域的空白.公测阶段,网易邮箱公开招募6000名网易邮箱用户优先试用. 网友可以登录http://u.163.com/faceauth或在网易免费邮箱的官方微博上申请.网易邮箱将根据用户反馈来优化技术,预计今年8月在邮箱内正式推出这一应用.届时,人脸识别相当于网易邮箱的又一道安全锁,用户选择开通后,可进一步提高

现场体验:蚂蚁金服开放“刷脸取件”,快递行业也搭上了“人脸识别”这趟快车

9月14日,支付宝和菜鸟在上海举办物流开放大会,宣布面向中小物流企业开放从最基础的支付到营销.信用.金融等能力.同时,蚂蚁金服也宣布将向物流行业开放其人脸识别技术,实现自提柜"刷脸取件". 快递柜也用上了人脸识别 大会现场展示了蚂蚁金服联合自提柜厂商"递易"打造的首台刷脸自提柜样机,雷锋网记者第一时间进行了体验,并于会后同多家媒体对蚂蚁金服生物识别技术负责人陈继东.蚂蚁金服物流行业总监浩瀚.蚂蚁金服商户事业部总经理章言进行了群访. 据现场工作人员演示,快递员往自提柜