首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》24.2.3 代码实现

关灯直达底部

在介绍基础接口时,我们曾讲到,当用户发送图片给公众号时,微信公众号将收到一个图片消息,该消息中包含PicUrl和MediaId两项参数,分别表示图片链接和图片消息媒体ID。

这里将直接把图片链接地址提交给Face++来处理。

Face++的类定义如下。


 1 class FacePlusPlus 2 { 3     private $api_server_url; 4     private $auth_params; 5  6     public function __construct 7     { 8         $this->api_server_url = "http:// apicn.faceplusplus.com/"; 9         $this->auth_params = array;10            $this->auth_params['api_key'] = "";11            $this->auth_params['api_secret'] = "";12     }13 14     // 人脸检测15     public function face_detect($urls = null)16     {17         return $this->call("detection/detect", array("url"=>$urls));18     }19 20     // 人脸比较21     public function recognition_compare($face_id1, $face_id2)22     {23         return $this->call("recognition/compare", array("face_id1"=>$face_id1, "face_           id2"=>$face_id2));24     }25 26     protected function call($method, $params = array)27     {28         $url = $this->api_server_url."$method?".http_build_query(array_merge($this->           auth_params, $params));29         $ch = curl_init;30         curl_setopt($ch, CURLOPT_URL, $url);31         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);32          $data = curl_exec($ch);33         curl_close($ch);34         $result = json_decode($data);35         return $result;36     }37 }  

上述代码定义了FacePlusPlus类,在类中定义了两个成员变量$api_server_url和$auth_params,以及3个方法face_detect、recognition_compare、call,前两个方法分别定义了人脸检测接口和人脸比较接口的实现。

第3~4行:定义了两个成员变量$api_server_url和$auth_params。

第6~12行:类的构造函数,在构造函数中给成员变量定义了值,包括接口服务器的URL、API Key和API Secret。

第14~18行:定义人脸检测接口的方法。

第20~24行:定义人脸比较接口的方法。

第26~36行:定义接口调用函数,内部使用curl实现。

获取图片识别结果的代码如下。


 1 function getImageInfo($url) 2 { 3     $faceObj = new FacePlusPlus; 4     $detect = $faceObj->face_detect($url); 5     $numbers = isset($detect->face)? count($detect->face):0; 6     if (($detect->face[0]->attribute->gender->value != $detect->face[1]->attribute->       gender->value) && $numbers == 2){ 7         $compare = $faceObj->recognition_compare($detect->face[0]->face_id,$detect->           face[1]->face_id); 8         $result = getCoupleComment($compare->component_similarity->eye, $compare->           component_similarity->mouth, $compare->component_similarity->nose, $compare           ->component_similarity->eyebrow, $compare->similarity); 9         return $result;10     }else{11         return "似乎不是一男一女,无法测试夫妻相";12     }13 }  

在上述代码中,先使用人脸检测接口获得图片的识别结果,再判断结果中是否得到两个性别不同的人。如果返回结果不是两张人脸且性别不同,则提示无法测试夫妻相;否则比较结果中的face_id,获得相似度的结果。

获得结果后,需要对结果进行加工,让该功能更贴近实际情况,相应的代码如下。


 1 function getCoupleComment($eye, $mouth, $nose, $eyebrow, $similarity) 2 { 3     $index = round(($eye + $mouth + $nose + $eyebrow) / 4); 4     if ($index < 40){ 5         $comment = "花好月圆"; 6     }else if ($index < 50){ 7         $comment = "相濡以沫"; 8     }else if ($index < 60){ 9         $comment = "情真意切";10     }else if ($index < 70){11         $comment = "郎才女貌";12     }else if ($index < 80){13         $comment  = "心心相印";14     }else if ($index < 90){15         $comment  = "浓情蜜意";16     }else{17         $comment = "山盟海誓";18     }19     return "【夫妻相指数】/n得分:".$index."/n评语:".$comment;20 }  

在上述代码中,将获取眼睛、嘴巴、眉毛、鼻子4个部分相似值的平均值作为最终相似指数,并且根据指数大小添加表现夫妻关系的评语。

至此,借助强大的Face++人脸识别接口,夫妻相功能就实现了。其运行效果如图24-5所示。需要注意的是,图中的人脸经过了处理。

图24-5 夫妻相测试