文档章节

调用腾讯优图开放平台进行人脸识别-Java调用API实现

小帅帅丶
 小帅帅丶
发布于 2017/08/18 12:31
字数 1883
阅读 3482
收藏 207

                    

人脸检测V3在线体验:http://123.207.12.111/xai/rest/face/index

第一步:鉴权服务技术方案

Java代码实现如下

import java.util.Date;  
  
import com.baidu.aip.util.Base64Util;  
/** 
 * 获取Authorization 
 * @author 小帅丶 
 * @类名称  Sign 
 * @remark  
 * @date  2017-8-18 
 */  
public class Sign {  
    /** 
     * Authorization方法 
     * @param userQQ 开发者创建应用时的QQ号 
     * @param AppID 开发者创建应用后的AppID 
     * @param SecretID 开发者创建应用后的SecretID 
     * @param SecretKey 开发者创建应用后的SecretKey 
     * @return sign 
     * @throws Exception 
     */  
    public static String getSign(String userQQ,String AppID,String SecretID,String SecretKey) throws Exception{  
        long tnowTimes = new Date().getTime()/1000;  
        long enowTimes = tnowTimes+2592000;  
        String rRandomNum = HMACSHA1.genRandomNum(10);  
        String param = "u=" + userQQ + "&a=" + AppID + "&k=" + SecretID + "&e="  
                + enowTimes + "&t=" + tnowTimes + "&r=" + rRandomNum + "&f=";  
        byte [] hmacSign = HMACSHA1.getSignature(param, SecretKey);  
        byte[] all = new byte[hmacSign.length+param.getBytes().length];  
        System.arraycopy(hmacSign, 0, all, 0, hmacSign.length);  
        System.arraycopy(param.getBytes(), 0, all, hmacSign.length, param.getBytes().length);  
        String sign = Base64Util.encode(all);  
        return sign;  
    }  
} 

需要的HMACSHA1代码及随机数代码

    import java.util.Random;  
      
    import javax.crypto.Mac;  
    import javax.crypto.spec.SecretKeySpec;  
      
    /** 
     * HMACSHA1算法 
     *  
     * @author 小帅丶 
     * @类名称 HMACSHA1 
     * @remark 
     * @date 2017-8-18 
     */  
    public class HMACSHA1 {  
        /** 
         * 算法标识 
         */  
        private static final String HMAC_SHA1 = "HmacSHA1";  
        /** 
         * 加密 
         * @param data 要加密的数据 
         * @param key 密钥  
         * @return 
         * @throws Exception 
         */  
        public static byte[] getSignature(String data, String key) throws Exception {  
            Mac mac = Mac.getInstance(HMAC_SHA1);  
            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(),  
                    mac.getAlgorithm());  
            mac.init(signingKey);  
            return mac.doFinal(data.getBytes());  
        }  
        /** 
         * 生成随机数字 
         * @param length 
         * @return 
         */  
        public static String genRandomNum(int length){    
            int  maxNum = 62;    
            int i;    
            int count = 0;    
            char[] str = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};        
            StringBuffer pwd = new StringBuffer("");    
            Random r = new Random();    
            while(count < length){    
             i = Math.abs(r.nextInt(maxNum));       
             if (i >= 0 && i < str.length) {    
              pwd.append(str[i]);    
              count ++;    
             }    
            }    
            return pwd.toString();    
          }   
    }  

第二步:准备相关代码

保存SIGN 或者每次都生成一个也可以 方便测试就直接每次生成一个了

开始识别图片之前需要工具类Base64Util  FileUtil

FileUtil代码

    import java.io.*;  
      
    /** 
     * 文件读取工具类 
     */  
    public class FileUtil {  
      
        /** 
         * 读取文件内容,作为字符串返回 
         */  
        public static String readFileAsString(String filePath) throws IOException {  
            File file = new File(filePath);  
            if (!file.exists()) {  
                throw new FileNotFoundException(filePath);  
            }   
      
            if (file.length() > 1024 * 1024 * 1024) {  
                throw new IOException("File is too large");  
            }   
      
            StringBuilder sb = new StringBuilder((int) (file.length()));  
            // 创建字节输入流    
            FileInputStream fis = new FileInputStream(filePath);    
            // 创建一个长度为10240的Buffer  
            byte[] bbuf = new byte[10240];    
            // 用于保存实际读取的字节数    
            int hasRead = 0;    
            while ( (hasRead = fis.read(bbuf)) > 0 ) {    
                sb.append(new String(bbuf, 0, hasRead));    
            }    
            fis.close();    
            return sb.toString();  
        }  
      
        /** 
         * 根据文件路径读取byte[] 数组 
         */  
        public static byte[] readFileByBytes(String filePath) throws IOException {  
            File file = new File(filePath);  
            if (!file.exists()) {  
                throw new FileNotFoundException(filePath);  
            } else {  
                ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());  
                BufferedInputStream in = null;  
      
                try {  
                    in = new BufferedInputStream(new FileInputStream(file));  
                    short bufSize = 1024;  
                    byte[] buffer = new byte[bufSize];  
                    int len1;  
                    while (-1 != (len1 = in.read(buffer, 0, bufSize))) {  
                        bos.write(buffer, 0, len1);  
                    }  
      
                    byte[] var7 = bos.toByteArray();  
                    return var7;  
                } finally {  
                    try {  
                        if (in != null) {  
                            in.close();  
                        }  
                    } catch (IOException var14) {  
                        var14.printStackTrace();  
                    }  
      
                    bos.close();  
                }  
            }  
        }  
    }  

Base64Util  代码

    /** 
     * Base64 工具类 
     */  
    public class Base64Util {  
        private static final char last2byte = (char) Integer.parseInt("00000011", 2);  
        private static final char last4byte = (char) Integer.parseInt("00001111", 2);  
        private static final char last6byte = (char) Integer.parseInt("00111111", 2);  
        private static final char lead6byte = (char) Integer.parseInt("11111100", 2);  
        private static final char lead4byte = (char) Integer.parseInt("11110000", 2);  
        private static final char lead2byte = (char) Integer.parseInt("11000000", 2);  
        private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};  
      
        public Base64Util() {  
        }  
      
        public static String encode(byte[] from) {  
            StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);  
            int num = 0;  
            char currentByte = 0;  
      
            int i;  
            for (i = 0; i < from.length; ++i) {  
                for (num %= 8; num < 8; num += 6) {  
                    switch (num) {  
                        case 0:  
                            currentByte = (char) (from[i] & lead6byte);  
                            currentByte = (char) (currentByte >>> 2);  
                        case 1:  
                        case 3:  
                        case 5:  
                        default:  
                            break;  
                        case 2:  
                            currentByte = (char) (from[i] & last6byte);  
                            break;  
                        case 4:  
                            currentByte = (char) (from[i] & last4byte);  
                            currentByte = (char) (currentByte << 2);  
                            if (i + 1 < from.length) {  
                                currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);  
                            }  
                            break;  
                        case 6:  
                            currentByte = (char) (from[i] & last2byte);  
                            currentByte = (char) (currentByte << 4);  
                            if (i + 1 < from.length) {  
                                currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);  
                            }  
                    }  
      
                    to.append(encodeTable[currentByte]);  
                }  
            }  
      
            if (to.length() % 4 != 0) {  
                for (i = 4 - to.length() % 4; i > 0; --i) {  
                    to.append("=");  
                }  
            }  
      
            return to.toString();  
        }  
    }  

创建应用得到的值放在一个常量类里面

 

    /** 
     * 常量 
     * @author 小帅丶 
     * @类名称  YouTuAppContants 
     * @remark  
     * @date  2017-8-18 
     */  
    public class YouTuAppContants {  
        public static String AppID = "你自己的AppID ";  
        public static String SecretID = "你自己的SecretID";  
        public static String SecretKey = "你自己的SecretKey";  
        public static String userQQ = "你自己的userQQ";  
    }  

还需要一个HTTPUTIL工具类 发送请求

    import java.io.BufferedReader;  
    import java.io.DataOutputStream;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.net.HttpURLConnection;  
    import java.net.URL;  
    import java.security.KeyManagementException;  
    import java.security.NoSuchAlgorithmException;  
    import java.security.cert.CertificateException;  
    import java.security.cert.X509Certificate;  
       
    import javax.net.ssl.HostnameVerifier;  
    import javax.net.ssl.SSLContext;  
    import javax.net.ssl.SSLSession;  
    import javax.net.ssl.TrustManager;  
    import javax.net.ssl.X509TrustManager;  
      
    /** 
     * http 工具类 
     */  
    public class HttpUtilYoutu {  
         private static class TrustAnyTrustManager implements X509TrustManager {  
               
                public void checkClientTrusted(X509Certificate[] chain, String authType)  
                        throws CertificateException {  
                }  
           
                public void checkServerTrusted(X509Certificate[] chain, String authType)  
                        throws CertificateException {  
                }  
           
                public X509Certificate[] getAcceptedIssuers() {  
                    return new X509Certificate[] {};  
                }  
            }  
           
            private static class TrustAnyHostnameVerifier implements HostnameVerifier {  
                public boolean verify(String hostname, SSLSession session) {  
                    return true;  
                }  
            }  
           
            /** 
             * post方式请求服务器(https协议) 
             *  
             * @param url 
             *            请求地址 
             * @param content 
             *            参数 
             * @param charset 
             *            编码 
             * @return 
             * @throws NoSuchAlgorithmException 
             * @throws KeyManagementException 
             * @throws IOException 
             */  
            public static String post(String url, String content,String charset,String sign)  
                    throws NoSuchAlgorithmException, KeyManagementException,  
                    IOException {  
                SSLContext sc = SSLContext.getInstance("SSL");  
                sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },  
                        new java.security.SecureRandom());  
                URL console = new URL(url);  
                Integer length = content.length();  
                HttpURLConnection conn = (HttpURLConnection) console.openConnection();  
                //文档要求填写的Header参数                  
                    conn.setRequestProperty("Host", "api.youtu.qq.com");  
                conn.setRequestProperty("Content-Length",length.toString());  
                conn.setRequestProperty("Content-Type", "text/json");  
                conn.setRequestProperty("Authorization", sign);  
                    //文档要求填写的Header参数  
                   conn.setDoOutput(true);  
                conn.connect();  
                DataOutputStream out = new DataOutputStream(conn.getOutputStream());  
                out.write(content.getBytes(charset));  
                // 刷新、关闭  
                out.flush();  
                out.close();  
                BufferedReader in = null;  
                in = new BufferedReader(  
                        new InputStreamReader(conn.getInputStream(), charset));  
                String result = "";  
                String getLine;  
                while ((getLine = in.readLine()) != null) {  
                    result += getLine;  
                }  
                in.close();  
                System.err.println("result:" + result);  
                return result;  
            }  
      
    }  


第三步:测试一下人脸检测接口

请求示例代码:

import com.xiaoshuai.test.Base64Util;  
import com.xiaoshuai.test.FileUtil;  
  
public class DetectFace {  
    //人脸检测接口  
    public static String DETECTFACE_URL="http://api.youtu.qq.com/youtu/api/detectface";  
    public static void main(String[] args) throws Exception {  
        String imagePath = "G:/test2.jpg";  
        System.out.println(getDetectFace(imagePath));  
          
    }  
    /** 
     * 检测图中人脸信息 
     * @param imagePath 图片路径 
     * @return 
     * @throws Exception 
     */  
    public static String getDetectFace(String imagePath) throws Exception{  
        //得到Authorization  
        String sign = Sign.getSign(YouTuAppContants.userQQ,  
                YouTuAppContants.AppID, YouTuAppContants.SecretID,  
                YouTuAppContants.SecretKey);  
        byte[] imgData = FileUtil.readFileByBytes(imagePath);  
        String image =  Base64Util.encode(imgData);;  
        String param = "{\"app_id\":\""+YouTuAppContants.AppID+"\",\"image\":\""+image+"\"}";  
        String result = HttpUtilYoutu.post(DETECTFACE_URL, param, "UTF-8",sign);  
        System.out.println(result);  
        return result;  
    }  
} 

看看返回的内容:

{"session_id":"","image_height":280,"image_width":359,"face":[{"face_id":"2188093443753939350","x":128,"y":127,"height":106.0,"width":106.0,"pitch":6,"roll":3,"yaw":-2,"age":23,"gender":94,"glass":true,"expression":34,"beauty":80,"face_shape":{"face_profile":[{"x":139,"y":160},{"x":139,"y":170},{"x":140,"y":180},{"x":143,"y":189},{"x":146,"y":199},{"x":150,"y":208},{"x":156,"y":217},{"x":162,"y":225},{"x":170,"y":232},{"x":179,"y":236},{"x":189,"y":238},{"x":199,"y":235},{"x":207,"y":230},{"x":214,"y":222},{"x":221,"y":214},{"x":225,"y":205},{"x":229,"y":195},{"x":231,"y":185},{"x":232,"y":174},{"x":233,"y":164},{"x":232,"y":155}],"left_eye":[{"x":152,"y":159},{"x":156,"y":161},{"x":161,"y":163},{"x":166,"y":162},{"x":171,"y":160},{"x":167,"y":157},{"x":162,"y":156},{"x":157,"y":157}],"right_eye":[{"x":216,"y":156},{"x":212,"y":159},{"x":208,"y":160},{"x":203,"y":160},{"x":198,"y":158},{"x":202,"y":155},{"x":206,"y":154},{"x":211,"y":154}],"left_eyebrow":[{"x":143,"y":148},{"x":151,"y":148},{"x":159,"y":148},{"x":166,"y":148},{"x":174,"y":147},{"x":167,"y":142},{"x":158,"y":141},{"x":150,"y":142}],"right_eyebrow":[{"x":224,"y":145},{"x":216,"y":145},{"x":208,"y":145},{"x":200,"y":146},{"x":192,"y":146},{"x":199,"y":141},{"x":208,"y":139},{"x":217,"y":139}],"mouth":[{"x":170,"y":209},{"x":175,"y":214},{"x":180,"y":218},{"x":187,"y":219},{"x":194,"y":217},{"x":200,"y":213},{"x":204,"y":207},{"x":199,"y":203},{"x":192,"y":201},{"x":186,"y":203},{"x":180,"y":202},{"x":174,"y":205},{"x":175,"y":210},{"x":181,"y":211},{"x":187,"y":211},{"x":193,"y":210},{"x":198,"y":209},{"x":198,"y":207},{"x":193,"y":208},{"x":187,"y":209},{"x":180,"y":207},{"x":175,"y":207}],"nose":[{"x":184,"y":184},{"x":183,"y":160},{"x":180,"y":166},{"x":177,"y":173},{"x":174,"y":180},{"x":170,"y":188},{"x":178,"y":191},{"x":185,"y":192},{"x":192,"y":190},{"x":199,"y":186},{"x":194,"y":179},{"x":191,"y":172},{"x":187,"y":166}]}}],"errorcode":0,"errormsg":"OK"}  

忽略掉检测五官位置的数据:

    "face_id": "2188093443753939350",  
    "x": 128,  
    "y": 127,  
    "height": 106,  
    "width": 106,  
    "pitch": 6,  
    "roll": 3,  
    "yaw": -2,  
    "age": 23,//年龄 [0~100]  
    "gender": 94,//性别 [0/(female)~100(male)]  
    "glass": true,//是否有眼镜 [true,false]  
    "expression": 34,//微笑[0(normal)~50(smile)~100(laugh)]  
    "beauty": 80,//魅力 [0~100]  

想知道自己的魅力吗?那就扫描下面的二维码吧(微信小程序码)

想体验一下?那就扫描一下我的微信个人小程序吧。

如果想做自己的微信小程序。建议买一台云服务器和免费的SSL即可。

© 著作权归作者所有

共有 人打赏支持
小帅帅丶

小帅帅丶

粉丝 495
博文 93
码字总数 118342
作品 2
北京
后端工程师
私信 提问
加载中

评论(10)

小帅帅丶
小帅帅丶

引用来自“左蓝”的评论

二维码怎么生成的?
小程序专属码 腾讯提供的 自己在平台下载就行
小帅帅丶
小帅帅丶

引用来自“小白小霸王”的评论

高科技啊
只是调用而已。我也会试着自己搭建个dl4j的图像识别平台
小白小霸王
小白小霸王
高科技啊
左蓝
左蓝
二维码怎么生成的?
小帅帅丶
小帅帅丶

引用来自“xmut”的评论

微信小程序可以个人申请?
早就可以了。
xmut
xmut
微信小程序可以个人申请?
小帅帅丶
小帅帅丶

引用来自“宋庆离”的评论

哦 已经推荐了
这个推荐挺快的。为什么写百度AI的人脸就不给推荐呢?
宋庆离
宋庆离
哦 已经推荐了
宋庆离
宋庆离
厉害厉害 我帮你推荐下吧 哈哈哈哈
腾讯 AI-Java 客户端 TAip 4.3.2 发布,增加关键词检索

TAIP 是调用腾讯 AI 接口的 Java 客户端,为调用腾讯 AI 功能的开发人员提供了一系列的交互方法。 目前版本已经更新至4.3.2,Java开发者们无需再各种百度了。 新特性 增加关键词检索接口 优图...

小帅帅丶
07/09
0
0
腾讯 AI-Java 客户端 TAip 升级至4.3.2 版本

腾讯 AI-Java 客户端 TAip 升级至4.3.2 版本 Ronny 3分钟前暂无评论 阅读 3 次 TAIP 是调用腾讯 AI 接口的 Java 客户端,为调用腾讯 AI 功能的开发人员提供了一系列的交互方法。 目前版本已经...

Ronny
07/22
0
0
腾讯 AI-Java 客户端 Taip 重大更新,所有接口均已接入

TAIP 是调用腾讯 AI 接口的 Java 客户端,为调用腾讯 AI 功能的开发人员提供了一系列的交互方法。 目前版本已经更新至4.2.1,Java开发者们无需再各种百度了。 Java JDK 1.7+ Maven引入 cn.x...

小帅帅丶
05/22
0
45
腾讯 AI-Java 客户端 TAip 4.3.4 发布,增加音频鉴黄

TAIP 是调用腾讯 AI 接口的 Java 客户端,为调用腾讯 AI 功能的开发人员提供了一系列的交互方法。 目前版本已经更新至4.3.4,Java开发者们无需再各种百度了。 新特性 增加音频鉴黄接口 Java...

小帅帅丶
11/07
0
0
腾讯 AI-Java 客户端 TAip 新增加手写体、车牌识别

TAIP 是调用腾讯 AI 接口的 Java 客户端,为调用腾讯 AI 功能的开发人员提供了一系列的交互方法。 目前版本已经更新至4.2.5,Java开发者们无需再各种百度了。 新特性 文字识别模块新增手写体...

小帅帅丶
06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

降压变换器 Buck

特点 输入输出极性相同。 工作过程 在 MOS 导通时,输入电源通过 L 和 C 滤波后向负载端提供电流;当 MOS 断开后,L 通过二极管续流,保持负载电流连续。输出电压因为占空比的作用,不会超过...

colinux
28分钟前
0
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
3
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
4
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
3
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部