Face++ 人脸检测之POST[img](0)

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

你可能感兴趣的:(face++)