当前位置:首页 > PHP教程 > php类库 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-25 11:34:39 浏览: 评论:0 

这篇文章主要给大家分享的是一段人脸识别测颜值、测脸龄、测相似度微信接口的代码,非常的有意思,有需要的小伙伴可以参考下。

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

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

  1. <?php 
  2. /** 
  3.  * 人脸识别测颜值、测脸龄、测相似度微信接口 
  4.  * @Created by MOS.Ving. 
  5.  * @Author: MOS.Ving 
  6.  * @Mail 904679843@qq.com 
  7.  * @Date: 2016-01-31 
  8.  */ 
  9.    
  10. define("TOKEN"'weixin'); //设置token 
  11.    
  12. //FACE++ 参数 自行到face++官网注册并创建应用 
  13. define("API_KEY""api_key=填在这里"); //你的face++应用 api_key 
  14. define("API_SECRET""&api_secret=这里也要填");//你的face++应用 api_secret 
  15. define("ATTRIBUTE""&attribute=glass,pose,gender,age,race,smiling");//需要返回的内容的参数 
  16.    
  17. define("DETECT_URL""http://apicn.faceplusplus.com/v2/detection/detect?");//检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性api地址 
  18. define("LANDMARK_URL""http://api.faceplusplus.com/detection/landmark?");//检测给定人脸(Face)相应的面部轮廓,五官等关键点的位置,包括25点和83点两种模式api地址 
  19. define("COMPARE_URL""https://apicn.faceplusplus.com/v2/recognition/compare?");//计算两个Face的相似性以及五官相似度api地址 
  20.    
  21. define("TYPE","&type=83p");//83点模式 
  22.    
  23.    
  24. define("MESSAGE_URL""");//放回图文消息被点击需要跳转的地址,不需要跳转可不填 
  25.    
  26. $wechatObj = new wechatCallbackapiTest(); 
  27. if($_GET['echostr']){ 
  28.   $wechatObj->valid(); 
  29. }else
  30.   $wechatObj->responseMsg(); 
  31.    
  32. class wechatCallbackapiTest{ 
  33.   public function valid(){ 
  34.     $echoStr = $_GET["echostr"]; 
  35.     //valid signature , option 
  36.     if($this->checkSignature()){ 
  37.       echo $echoStr
  38.       exit
  39.     } 
  40.   } 
  41.    
  42.   public function responseMsg(){ 
  43.     //get post data, May be due to the different environments 
  44.     $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
  45.    
  46.     //extract post data 
  47.     if (!emptyempty($postStr)){ 
  48.         /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, 
  49.           the best way is to check the validity of xml by yourself */ 
  50.         libxml_disable_entity_loader(true); 
  51.         $postObj   = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA); 
  52.         $fromUsername = $postObj->FromUserName; 
  53.         $toUsername  = $postObj->ToUserName; 
  54.         $keyword   = trim($postObj->Content); 
  55.         $imgUrl    = $postObj->PicUrl; 
  56.         $Event    = $postObj->Event; 
  57.         $EventKey   = $postObj->EventKey; 
  58.         $MsgType   = $postObj->MsgType; 
  59.         $time     = time(); 
  60.    
  61.         $itemTpl = "<item> 
  62.            <Title><![CDATA[%s]]></Title> 
  63.            <Description><![CDATA[%s]]></Description> 
  64.            <PicUrl><![CDATA[%s]]></PicUrl> 
  65.            <Url><![CDATA[%s]]></Url> 
  66.            </item>"; 
  67.    
  68.         if($MsgType == "image"){ 
  69.           $item_str = sprintf($itemTpl"颜值报告单", face($imgUrl), $imgUrl, MESSAGE_URL); 
  70.    
  71.           $xmlTpl = "<xml> 
  72.            <ToUserName><![CDATA[%s]]></ToUserName> 
  73.            <FromUserName><![CDATA[%s]]></FromUserName> 
  74.            <CreateTime>%s</CreateTime> 
  75.            <MsgType><![CDATA[news]]></MsgType> 
  76.            <ArticleCount>%s</ArticleCount> 
  77.            <Articles>$item_str</Articles> 
  78.            </xml>"; 
  79.           $resultStr = sprintf($xmlTpl$fromUsername$toUsername$time, 1); 
  80.           echo $resultStr
  81.         } 
  82.           
  83.     }else { 
  84.       echo ""
  85.       exit
  86.     } 
  87.   } 
  88.        
  89.   private function checkSignature(){ 
  90.     // you must define TOKEN by yourself 
  91.     if (!defined("TOKEN")){ 
  92.       throw new Exception('TOKEN is not defined!'); 
  93.     } 
  94.        
  95.     $signature = $_GET["signature"]; 
  96.     $timestamp = $_GET["timestamp"]; 
  97.     $nonce = $_GET["nonce"]; 
  98.            
  99.     $token = TOKEN; 
  100.     $tmpArr = array($token$timestamp$nonce); 
  101.     // use SORT_STRING rule 
  102.     sort($tmpArr, SORT_STRING); 
  103.     $tmpStr = implode( $tmpArr ); 
  104.     $tmpStr = sha1( $tmpStr ); 
  105.        
  106.     if$tmpStr == $signature ){ 
  107.       return true; 
  108.     }else
  109.       return false; 
  110.     } 
  111.   } 
  112.    
  113.    
  114. // 调用人脸识别的API返回识别结果 
  115. function face($imgUrl){ 
  116.   // face++ 链接  
  117.   $jsonStr  =curl_get_contents(DETECT_URL.API_KEY.API_SECRET."&url=".$imgUrl.ATTRIBUTE); 
  118.   $replyDic = json_decode($jsonStr,true); 
  119.   $faceArray = $replyDic['face']; 
  120.      
  121.   $resultStr = ""
  122.        
  123.   for ($i= 0;$icount($faceArray); $i++){ 
  124.        
  125.     $resultStr .= "<----第".($i+1)."张脸---->\n"
  126.    
  127.     $tempFace  = $faceArray[$i]; 
  128.     $faceId   = $tempFace['face_id']; 
  129.    
  130.     $tempAttr = $tempFace['attribute']; 
  131.     // 年龄:包含年龄分析结果 
  132.     // value的值为一个非负整数表示估计的年龄, range表示估计年龄的正负区间 
  133.     $tempAge = $tempAttr['age']; 
  134.     // 性别:包含性别分析结果 
  135.     // value的值为Male/Female, confidence表示置信度 
  136.     $tempGenger = $tempAttr['gender']; 
  137.     // 种族:包含人种分析结果 
  138.     // value的值为Asian/White/Black, confidence表示置信度 
  139.     $tempRace = $tempAttr['race']; 
  140.     // 微笑:包含微笑程度分析结果 
  141.     //value的值为0-100的实数,越大表示微笑程度越高 
  142.     $tempSmiling = $tempAttr['smiling']; 
  143.       
  144.     // 返回性别 
  145.     $sex=$tempGenger['value']; 
  146.     if($sex === "Male") { 
  147.       $resultStr .= "性别:男\n"
  148.     } else if($sex === "Female") { 
  149.       $resultStr .= "性别:女\n"
  150.     } 
  151.    
  152.     //返回年龄 
  153.     $maxAge = $tempAge['value'] + ($tempAge['range'])/2; 
  154.     $age=ceil($maxAge); 
  155.     $resultStr .= "年龄:".$age."岁左右吧~ \n"
  156.    
  157.     //返回种族 
  158.     if($tempRace['value'] === "Asian") { 
  159.       $resultStr .= "肤色:很健康哦~\n"
  160.     } 
  161.     else if($tempRace['value'] === "White") { 
  162.       $resultStr .= "肤色:皮肤好白哟!^ 3^\n"
  163.     } 
  164.     else if($tempRace['value'] === "Black") { 
  165.       $resultStr .= " 肤色:你有点黑?!!!\n"
  166.     } 
  167.    
  168.     //返回微笑度 
  169.     $smiling = intval($tempSmiling['value']); 
  170.     $smile = round($tempSmiling['value'],3); 
  171.     $resultStr .= "微笑:".$smile."%\n"
  172.    
  173.     if($count<3){ 
  174.       //计算颜值 
  175.       $yanzhi=getYanZhi($faceId,$smiling); 
  176.       $resultStr .= "外貌协会专家评分:".$yanzhi."分\n\n"
  177.       $resultStr .= "\xe2\x9c\xa8小编想说:\n"
  178.       switch ($yanzhi){ 
  179.         case $yanzhi>94: 
  180.           $resultStr .="这颜值,爆表了!\n"
  181.           break
  182.         case $yanzhi>87: 
  183.           $resultStr .="你这么好看,咋不上天呢!\n"
  184.           break
  185.         case $yanzhi>82: 
  186.           $resultStr .="百看不厌,继续加油!\n"
  187.           break
  188.         case $yanzhi>72: 
  189.           $resultStr .="还好,还能看!\n"
  190.           break
  191.         case $yanzhi>67: 
  192.           $resultStr .="哎,只是丑的不明显!\n"
  193.           break
  194.         case $yanzhi>62: 
  195.           $resultStr .="如果有钱,可以去整整!\n"
  196.           break
  197.         default
  198.           $resultStr .="让我静静,你家没镜子么?\n"
  199.       } 
  200.     } 
  201.    
  202.   //图片中两个人时,计算相似度 
  203.   if(count($faceArray) === 2){  
  204.     // 获取face_id  
  205.     $tempFace1 = $faceArray[0];  
  206.     $tempId1 = $tempFace1['face_id'];  
  207.     $tempFace2 = $faceArray[1];  
  208.     $tempId2 = $tempFace2['face_id'];  
  209.    
  210.     // face++ 链接  
  211.     $jsonStr1 = curl_get_contents(COMPARE_URL.API_KEY.API_SECRET."&face_id2=".$tempId2 ."&face_id1=".$tempId1);   
  212.     $replyDic1 = json_decode($jsonStr1,true);  
  213.    
  214.     //取出相似程度  
  215.     $tempResult = $replyDic1['similarity'];  
  216.        
  217.     $tempSimilarity = $replyDic1['component_similarity'];  
  218.     $tempEye = $tempSimilarity['eye'];  
  219.     $tempEyebrow = $tempSimilarity['eyebrow'];  
  220.     $tempMouth = $tempSimilarity['mouth'];  
  221.     $tempNose = $tempSimilarity['nose'];  
  222.    
  223.     $resultStr .= "<----相似分析---->\n";  
  224.     $resultStr .= "眼睛:".round($tempEye,3)."%\n";  
  225.     $resultStr .= "眉毛:".round($tempEyebrow,3)."%\n";  
  226.     $resultStr .= "嘴巴:".round($tempMouth,3)."%\n";  
  227.     $resultStr .= "鼻子:".round($tempNose,3)."%\n";  
  228.        
  229.     $resultStr .= "\n<----匹配结果---->\n两人相似程度:".round($tempResult,3)."%\n";  
  230.    
  231.     if($tempResult>70){ 
  232.       $resultStr .="哇塞!绝对的夫妻相了!\n"
  233.     }elseif ($tempResult>50){ 
  234.       $resultStr .="哎哟,长得挺像!你们快点在一起吧!\n"
  235.     }else
  236.       $resultStr .="0.0 长得不太一样哦。\n"
  237.     } 
  238.      
  239.   }  
  240.    
  241.   //如果没有检测到人脸 
  242.   if($resultStr === ""){ 
  243.     $resultStr = "对不起,俺没有识别出来,请换张正脸照试试=.="
  244.   } 
  245.    
  246.  return $resultStr
  247.    
  248.    
  249. //颜值算法 
  250. function getYanZhi($faceId,$smiling){ 
  251.   $t1=microtime(1); 
  252.   $jsonStr = curl_get_contents(LANDMARK_URL.API_KEY.API_SECRET."&face_id=".$faceId.TYPE); 
  253.   $t2=microtime(1); 
  254.   if(($t2-$t1)>1.5){ 
  255.     return 75.632; 
  256.   } 
  257.    
  258.   if ($jsonStr!=false) { 
  259.     $replyDic = json_decode($jsonStr,true); 
  260.    
  261.     $result = $replyDic['result']; 
  262.     $landmarkArry = $result[0]; 
  263.     $landmark =$landmarkArry['landmark']; 
  264.    
  265.     $right_eyebrow_left_corner =$landmark['right_eyebrow_left_corner']; 
  266.     $left_eyebrow_right_corner =$landmark['left_eyebrow_right_corner']; 
  267.    
  268.     $left_eye_left_corner    =$landmark['left_eye_left_corner']; 
  269.     $left_eye_right_corner   =$landmark['left_eye_right_corner']; 
  270.    
  271.     $mouth_left_corner     =$landmark['mouth_left_corner']; 
  272.     $mouth_right_corner     =$landmark['mouth_right_corner']; 
  273.    
  274.     $nose_left         =$landmark['nose_left']; 
  275.     $nose_right         =$landmark['nose_right']; 
  276.     $nose_contour_lower_middle =$landmark['nose_contour_lower_middle']; 
  277.    
  278.     $right_eye_left_corner   =$landmark['right_eye_left_corner']; 
  279.     $right_eye_right_corner   =$landmark['right_eye_right_corner']; 
  280.    
  281.     $contour_left1       =$landmark['contour_left1']; 
  282.     $contour_right1       =$landmark['contour_right1']; 
  283.     $contour_chin        =$landmark['contour_chin']; 
  284.     $contour_left6       =$landmark['contour_left6']; 
  285.     $contour_right6       =$landmark['contour_right6']; 
  286.    
  287.     //计算两眉头间的距离 
  288.     $c1=distance($left_eyebrow_right_corner['x'],$left_eyebrow_right_corner['y'],$right_eyebrow_left_corner['x'],$right_eyebrow_left_corner['y']); 
  289.    
  290.     //眉毛之间的中点坐标; 
  291.     $c1_x=($right_eyebrow_left_corner['x']-$left_eyebrow_right_corner['x'])/2+$left_eyebrow_right_corner['x']; 
  292.     $c1_y=($right_eyebrow_left_corner['y']-$left_eyebrow_right_corner['y'])/2+$left_eyebrow_right_corner['y']; 
  293.    
  294.     //眉毛中点到鼻子最低处的距离 
  295.     $c2 = distance($nose_contour_lower_middle['x'],$nose_contour_lower_middle['y'],$c1_x,$c1_y); 
  296.    
  297.     //眼角之间的距离 
  298.     $c3 = distance($left_eye_right_corner['x'],$left_eye_right_corner['y'],$right_eye_left_corner['x'],$right_eye_left_corner['y']); 
  299.    
  300.     //鼻子的宽度 
  301.     $c4 = distance($nose_left['x'],$nose_left['y'],$nose_right['x'],$nose_right['y']); 
  302.    
  303.     //脸的宽度 
  304.     $c5 = distance($contour_left1['x'],$contour_left1['y'],$contour_right1['x'],$contour_right1['y']); 
  305.    
  306.     //下巴到鼻子下方的高度 
  307.     $c6 = distance($contour_chin['x'],$contour_chin['y'],$nose_contour_lower_middle['x'],$nose_contour_lower_middle['y']); 
  308.    
  309.     //眼睛的大小 
  310.     $c7_left = distance($left_eye_left_corner['x'],$left_eye_left_corner['y'],$left_eye_right_corner['x'],$left_eye_right_corner['y']); 
  311.     $c7_right = distance($right_eye_left_corner['x'],$right_eye_left_corner['y'],$right_eye_right_corner['x'],$right_eye_right_corner['y']); 
  312.    
  313.     //嘴巴的大小 
  314.     $c8 = distance($mouth_left_corner['x'],$mouth_left_corner['y'],$mouth_right_corner['x'],$mouth_right_corner['y']); 
  315.    
  316.     //嘴巴处的face大小 
  317.     $c9 = distance($contour_left6['x'],$contour_left6['y'],$contour_right6['x'],$contour_right6['y']); 
  318.    
  319.     /* 开始计算步骤 */ 
  320.     $yourmark = 100; 
  321.     $mustm = 0; 
  322.    
  323.     //眼角距离为脸宽的1/5, 
  324.     $mustm += abs(($c3/$c5)*100 - 25); 
  325.    
  326.     //鼻子宽度为脸宽的1/5 
  327.     $mustm += abs(($c4/$c5)*100 - 25); 
  328.    
  329.     //眼睛的宽度,应为同一水平脸部宽度的!/5 
  330.     $eyepj = ($c7_left+$c7_right)/2; 
  331.     $mustm += abs($eyepj/$c5*100 - 25); 
  332.    
  333.     //理想嘴巴宽度应为同一脸部宽度的1/2 
  334.     $mustm += abs(($c8/$c9)*100 - 50); 
  335.    
  336.    
  337.     //下巴到鼻子下方的高度 == 眉毛中点到鼻子最低处的距离 
  338.     $mustm += abs($c6 - $c2); 
  339.    
  340.     return round($yourmark-$mustm+$smiling/10,3); 
  341.   }else
  342.     return 60; 
  343.   } 
  344.    
  345.    
  346. //两点之间的距离 
  347. function distance($px1,$py1,$px2,$py2){ 
  348.   return sqrt(abs(pow($px2 - $px1,2)) + abs(pow($py2 - $py1,2))); 
  349.    
  350.    
  351. function curl_get_contents($url) { 
  352.   $ch = curl_init(); 
  353.   curl_setopt( $ch , CURLOPT_URL,$url); 
  354.   curl_setopt( $ch , CURLOPT_RETURNTRANSFER,1); 
  355.   curl_setopt( $ch , CURLOPT_TIMEOUT,1); 
  356.   curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT,1.5); 
  357.   $result = curl_exec($ch); 
  358.   return $result
  359.    
  360. ?> 

 

Tags: PHP人脸识别 PHP测脸龄

分享到: