在介绍基础接口时,我们曾讲到,当用户发送图片给公众号时,微信公众号将收到一个图片消息,该消息中包含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 夫妻相测试