Face++ 人脸检测之POST[img](0)
@Author : Dolphix.J Qing
1 引言
人脸检测,指检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性。目前面部属性包括性别(gender), 年龄(age), 种族(race), 微笑程度(smiling), 眼镜(glass)和姿势(pose)。若结果的face_id没有被加入任何faceset/person之中,则在72小时之后过期被自动清除。
由于,引用face_sdk.jar里面已经封装了json.jar、HttpClient.jar。这就和笔者项目中HttpClient.jar包冲突。尝试着解压face_sdk.jar,将json.jar、HttpClient.jar剔除后重新打包成jar文件,导入项目时,又出现新问题了,face++的face_sdk函数中有对其依赖,并产生未找到相应函数即NotFoundFunction异常,由于笔者使用的又为在线人脸检测,所以有了下文。
API : http://www.faceplusplus.com.cn/detection_detect/
2 POST [img]
待检测图片的URL 或者 通过POST方法上传的二进制数据,原始图片大小需要小于1M。
注:这里只讲解POST二进制img至服务器,不涉及图片压缩(<1M)。
/**
* 提交文字、图片,主要用于Face++
* @param url
* @param key
* @param value
* @param bkey
* @param bitmap
* @return
*/
public static String doPost(String url, List key, List value, String bkey, File bitmap){
PostMethod postMethod = null;
try {
postMethod = new PostMethod(url);
Part[] part = new Part[key.size()+1];
//构造字符参数
for (int i = 0; i < key.size(); ++i){
part[i] = new StringPart(key.get(i),value.get(i));
}
//构造图片,文件
part[part.length-1] = new FilePart(bkey,bitmap);
MultipartRequestEntity mrp = new MultipartRequestEntity(part, postMethod.getParams());
postMethod.setRequestEntity(mrp);
org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
client.getParams().setContentCharset("utf-8");
client.executeMethod(postMethod);
//读取服务端返回信息
InputStream inputStream = postMethod.getResponseBodyAsStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer stringBuffer = new StringBuffer();
String str = "";
while ((str = br.readLine()) != null) {
stringBuffer.append(str);
}
return stringBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != postMethod) {
postMethod.releaseConnection();
}
}
return null;
}
当然,上述代码中,可以先检测SC_OK,然后再获取服务器返回值,也可以自己写一个回调函数。POST具体参数,本文用以下形式构造:
/**
* 构造并获取key
* @return
*/
private static List getKey(){
List key = new ArrayList();
key.add("api_key");
key.add("api_secret");
// key.add("url");
key.add("attribute");
return key;
}
/**
* 构造并获取value
* @return
*/
private static List getValue(){
List value = new ArrayList();
value.add("ERR---ABCDEFGHIJK");//api_key
value.add("ERR---XYZABCDEGFA");//api_secret
// value.add("http%3A%2F%2Ffaceplusplus.com%2Fstatic%2Fimg%2Fdemo%2F1.jpg");
value.add("glass,pose,gender,age,race,smiling");
return value;
}
而,调用时,可以采用如下方式:
请求URL:
private static final String url = "http://apicn.faceplusplus.com/v2/detection/detect";
调用函数:
public static void main(String[] args) {
File b = new File("E:/face/test.JPG");
String result = doPost(url, getKey(), getValue(),"img",b);
System.out.println(result);
}
为了突出本文重点,本文只涉及POST,不讲解图片压缩、服务器返回值的json解析以及人脸的绘制。
后续,将讲解Face++ 添加Person、添加Group、人脸训练、人脸识别等,及图形绘制。
附件:Face++ libs.jar
原文作者:Dolphix.J Qing