好久没做微信公众平台了,也就没写相关的文章。偶然误打误撞看到有个人脸识别的功能,就拿出来分享下。
先看下效果图片:
从别人那找到方法,然后抽取核心识别部分分享出来。马上进入正题。
其实,人脸识别就是将图片的url给第三方,然后将第三方返回的json解析出来。所以要去申请第三方平台的账号,创建web应用,获取api-key以及api-secret。对于微信公众平台,就是将识别返回的数据回复给粉丝就好。
这里的第三方平台是Face++,申请地址:http://www.faceplusplus.com.cn/ 。注册好了之后,记得申请一个web应用。等待下一步骤。
上边已经说过,将图片的url给第三方,那么,这里只需要创建一个函数,参数是图片的url就可以。利用该函数,返回人脸识别的结果。好吧,这里已经抽象到一个类里,如下。
<? class FaceLook { public function FaceLook() { } public function BackFaceInfo($imgUrl) { $requestUrl = "http://apicn.faceplusplus.com/v2/detection/detect?url=".$imgUrl."&api_key=b1d10bf735e6e3924c98f86247030335&api_secret=KySciCCjRTOwbJClNGsM8K7AnMN2CsIL&&attribute=glass,pose,gender,age,race,smiling"; $jsonStr = file_get_contents($requestUrl); $replyDic = json_decode($jsonStr); $resultStr = ""; $faceArray = $replyDic->{'face'}; $resultStr .= "图中共检测到".count($faceArray)."张脸!\n"; for ($i= 0;$i< count($faceArray); $i++) { $resultStr .= "第".($i+1)."张脸\n"; $tempFace = $faceArray[$i]; // 获取所有属性 $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'}; // 眼镜:包含眼镜佩戴分析结果 // value的值为None/Dark/Normal, confidence表示置信度 $tempGlass = $tempAttr->{'glass'}; // 造型:包含脸部姿势分析结果 // 包括pitch_angle, roll_angle, yaw_angle // 分别对应抬头,旋转(平面旋转),摇头 // 单位为角度。 $tempPose = $tempAttr->{'pose'}; //返回年龄 $minAge = $tempAge->{'value'} - $tempAge->{'range'}; $minAge = $minAge < 0 ? 0 : $minAge; $maxAge = $tempAge->{'value'} + $tempAge->{'range'}; $resultStr .= "年龄:".$minAge."-".$maxAge."岁\n"; // 返回性别 if($tempGenger->{'value'} === "Male") $resultStr .= "性别:男\n"; else if($tempGenger->{'value'} === "Female") $resultStr .= "性别:女\n"; // 返回种族 if($tempRace->{'value'} === "Asian") $resultStr .= "种族:黄种人\n"; else if($tempRace->{'value'} === "Male") $resultStr .= "种族:白种人\n"; else if($tempRace->{'value'} === "Black") $resultStr .= "种族:黑种人\n"; // 返回眼镜 if($tempGlass->{'value'} === "None") $resultStr .= "眼镜:木有眼镜\n"; else if($tempGlass->{'value'} === "Dark") $resultStr .= "眼镜:目测墨镜\n"; else if($tempGlass->{'value'} === "Normal") $resultStr .= "眼镜:普通眼镜\n"; //返回微笑 $resultStr .= "微笑:".round($tempSmiling->{'value'})."%\n"; } if(count($faceArray) === 2) { // 获取face_id $tempFace = $faceArray[0]; $tempId1 = $tempFace->{'face_id'}; $tempFace = $faceArray[1]; $tempId2 = $tempFace->{'face_id'}; // face++ 链接 $requestUrl = "https://apicn.faceplusplus.com/v2/recognition/compare?api_secret=KySciCCjRTOwbJClNGsM8K7AnMN2CsIL&api_key=b1d10bf735e6e3924c98f86247030335&face_id2=".$tempId2 ."&face_id1=".$tempId1; $jsonStr = file_get_contents($requestUrl); $replyDic = json_decode($jsonStr); //取出相似程度 $tempResult = $replyDic->{'similarity'}; $resultStr .= "相似程度:".round($tempResult)."%\n"; //具体分析相似处 $tempSimilarity = $replyDic->{'component_similarity'}; $tempEye = $tempSimilarity->{'eye'}; $tempEyebrow = $tempSimilarity->{'eyebrow'}; $tempMouth = $tempSimilarity->{'mouth'}; $tempNose = $tempSimilarity->{'nose'}; $resultStr .= "相似分析:\n"; $resultStr .= "眼睛:".round($tempEye)."%\n"; $resultStr .= "眉毛:".round($tempEyebrow)."%\n"; $resultStr .= "嘴巴:".round($tempMouth)."%\n"; $resultStr .= "鼻子:".round($tempNose)."%\n"; } //如果没有检测到人脸 if($resultStr === "") $resultStr = "照片中木有人脸=.="; return $resultStr; } } ?>
到这里,基本已经完成。想象一个场景。某人给公众号发了一张照片,微信服务器接到后,会得到照片的url,然后通过上边的函数,得到照片的分析数据。然后将分析的数据返回给某人就可以了。至于怎么接受,怎么返回。
就看微信公众平台官网文档或这里之前的文章。
END