0

0

人脸评分微信接口

PHP中文网

PHP中文网

发布时间:2016-05-26 08:18:13

|

1812人浏览过

|

来源于php中文网

原创

php代码

乐彼多用户商城系统LBMall(.net)
乐彼多用户商城系统LBMall(.net)

乐彼多用户商城系统,采用ASP.NET分层技术和AJAX技术,运营于高速稳定的微软.NET+MSSQL 2005平台;完全具备搭建超大型网络购物多用户网上商城的整体技术框架和应用层次LBMall 秉承乐彼软件优秀品质,后台人性化设计,管理窗口识别客户端分辨率自动调整,独立配置的菜单操作锁,使管理操作简单便捷。待办事项1、新订单、支付、付款、短信提醒2、每5分钟自动读取3、新事项声音提醒 店铺管理1

下载
<?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;
}

?>
微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共67课时 | 9.7万人学习

PHP微信公众平台开发视频教程
PHP微信公众平台开发视频教程

共25课时 | 6.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号