要说人脸检测、识别国内最好的还是face++,但是无奈,face++的技术支持太差了,既没有交流群,技术支持邮件也没人理。没办法,最后尝试使用百度的。

注意,虽然该服务表面上是免费的,但是对象存储BOS 是收费的,没有bos你没办法上传图片,不过也很便宜。

百度的人脸识别使用了rest风格的api,只需要简单的http请求即可。整个api的难点在于权限认证,

足足调了2天。

权限认证实现:

package com.baidubce;

import java.io.UnsupportedEncodingException;

import java.sql.Timestamp;

import java.text.DateFormat;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Arrays;

import java.util.Calendar;

import java.util.Map;

import javax.crypto.Mac;

import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Hex;

/**

* 认证字符串生成

* @author pc

*

*/

public class BceAuthString {

/**

* 生成BceAuthString(认证字符串)

*/

public String createBceAuthString(String accessKeyID, String secretAccessKey, String httpMethod, String path, Map header, String UTCTime){

String authStringPrefix = "bce-auth-v1/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}";

authStringPrefix = authStringPrefix.replace("{accessKeyId}", accessKeyID);

authStringPrefix = authStringPrefix.replace("{timestamp}", UTCTime);

authStringPrefix = authStringPrefix.replace("{expirationPeriodInSeconds}", "1800");

String canonicalRequest = this.createCanonicalRequest(httpMethod, path, header);

String signingKey = this.createSigningKey(secretAccessKey, authStringPrefix);

String signature = this.createSignature(signingKey, canonicalRequest);

String signedHeaders = createSignedHeaders(header);

String bceAuthString = authStringPrefix + "/" + signedHeaders + "/" + signature;

return bceAuthString;

}

/**

* 创建CanonicalRequest

* CanonicalRequest = HTTP Method + "\n" + CanonicalURI + "\n" + CanonicalQueryString + "\n" + CanonicalHeaders

*/

private String createCanonicalRequest(String httpMethod, String path, Map header){

httpMethod = httpMethod.toUpperCase();

if(path == null || path.trim().equals(""))

path  = "";

String canonicalURI = path;

String canonicalQueryString = "";

int index = path.indexOf("?");

if(index != -1){

canonicalURI = path.substring(0, index);

canonicalQueryString = path.substring(index + 1);

}

//生成CanonicalURI

if(!canonicalURI.startsWith("/"))

canonicalURI = "/" + canonicalURI;

canonicalURI = uriEncode(canonicalURI, false);

//生成CanonicalQueryString

String[] queryArray = canonicalQueryString.split("&");

for(int i = 0; i

String item = queryArray[i];

if(item == null || item.trim().equals(""))

continue;

String key = item.split("=")[0];

String value = item.split("=")[1];

key = uriEncode(key, true);

value = uriEncode(value, true);

queryArray[i] = key + "=" + value;

}

Arrays.sort(queryArray);

StringBuffer sb = new StringBuffer();

for(int i = 0; i

String item = queryArray[i];

if(item == null || item.trim().equals(""))

continue;

sb.append(item + "&");

}

if(sb.length() > 0)

sb.deleteCharAt(sb.length() - 1);

canonicalQueryString = sb.toString();

//生成CanonicalHeaders

String[] headerArray = new String[header.size()];

index = 0;

for (Map.Entry entry : header.entrySet()) {

String key = entry.getKey().toLowerCase();

String value = entry.getValue().trim();

headerArray[index] = uriEncode(key, true) + ":" + uriEncode(value, true);

index++;

}

Arrays.sort(headerArray);

sb = new StringBuffer();

for(int i = 0; i

String item = headerArray[i];

sb.append(item + "\n");

}

String canonicalHeaders = sb.toString();

if(canonicalHeaders.length() > 0)

canonicalHeaders = canonicalHeaders.substring(0, canonicalHeaders.lastIndexOf("\n"));

return httpMethod + "\n" + canonicalURI + "\n" + canonicalQueryString + "\n" + canonicalHeaders;

}

/**

* 生成SigningKey

* @param input

* @param encodeSlash

* @return

*/

private String createSigningKey(String secretAccessKey, String authStringPrefix){

String signingKey  = sha256Hex(secretAccessKey, authStringPrefix);

return signingKey;

}

/**

* 生成Signature

* @param input

* @param encodeSlash

* @return

*/

private String createSignature(String signingKey, String canonicalRequest){

String signature = sha256Hex(signingKey, canonicalRequest);

return signature;

}

/**

* 创建signedHeaders

* @param input

* @param encodeSlash

* @return

*/

private String createSignedHeaders(Map header){

String[] headerArray = new String[header.size()];

int index = 0;

for (Map.Entry entry : header.entrySet()) {

String key = entry.getKey().toLowerCase();

headerArray[index] = key;

index++;

}

Arrays.sort(headerArray);

StringBuffer sb = new StringBuffer();

for(int i = 0; i

String item = headerArray[i];

sb.append(item + ";");

}

if(sb.length() > 0)

sb.deleteCharAt(sb.length() - 1);

String signedHeaders = sb.toString();

return signedHeaders;

}

public String uriEncode(CharSequence input, boolean encodeSlash) {

StringBuilder result = new StringBuilder();

try {

for (int i = 0; i

char ch = input.charAt(i);

if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {

result.append(ch);

} else if (ch == '/') {

result.append(encodeSlash ? "%2F" : ch);

} else {

result.append(toHexUTF8(ch));

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return result.toString();

}

private String toHexUTF8(char c){

try {

byte[] b = String.valueOf(c).getBytes(BceConstants.ENCODING);

for (int j = 0; j

int k = b[j];

if (k

k += 256;

return "%" + Integer.toHexString(k).toUpperCase();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return "";

}

private String sha256Hex(String signingKey, String stringToSign) {

try {

Mac mac = Mac.getInstance("HmacSHA256");

mac.init(new SecretKeySpec(signingKey.getBytes(BceConstants.ENCODING), "HmacSHA256"));

return new String(Hex.encodeHex(mac.doFinal(stringToSign.getBytes(BceConstants.ENCODING))));

} catch (Exception e) {

e.printStackTrace();

}

return "";

}

}

百度人脸识别api php demo,百度人脸识别api实现及demo相关推荐

  1. 人脸表情识别 微信小程序 百度智能云人脸识别API(含完整项目文件)

    展示 界面展示 正下方三个按钮: 左边:切换前后置摄像头 中间:拍照 右边:选择相册 识别结果展示 图像中有人脸时显示识别结果: 图像中无人脸时不显示识别结果: 获取百度智能云人脸识别API 1.进入 ...

  2. 基于百度云人脸识别API与opencv的人脸识别系统

    基于百度云人脸识别API与opencv的人脸识别系统 简介 弄这个东西是因为参加了学校的项目,第一次开发做的不是很好. 本系统是基于百度云人脸识别API.opencv级联器.PYQT5进行开发.百度云 ...

  3. 树莓派人脸识别python_树莓派调用百度人脸识别API实现人脸识别

    前言 树莓派配置OpenCV,配置起来有点繁琐且耗时,调用百度智能云的人脸识别API是一个很好的解决方案 接上摄像头的树莓派.png 一.申请AppID.API Key和Secret Key 1.1 ...

  4. 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

    背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...

  5. 【java】调用百度开发平台ai接口,完成人脸识别(人脸搜索、人脸对比、人脸检测等)功能--------超详细,适合小白

    基本流程理解: 我们要使用百度提供的接口去实现某些功能,大致流程如下: 1.注册百度开放平台帐号: 浏览器打开http://ai.baidu.com/,进入百度ai的页面,点击右上角的控制台按钮进行登 ...

  6. 百度人脸识别技术应用001---百度人脸识别应用业务介绍

    1.最近在做人脸识别方面的APP,百度人脸识别分为,人脸识别离线SDK,需要输入序列号才能使用. 还有,在线API,关于,人脸识别离线SDK,前面已经在,AndroidStudio相关的文章中,写到了 ...

  7. 【API调用】人脸检测+人脸属性(旷视 / 百度)

    文章目录 1 简介 2 旷视 face++ 2.1 注册 [获得 API Key](https://console.faceplusplus.com.cn/app/apikey/list) 2.2 调 ...

  8. 人脸检测颜值软件_百度AI人脸识别测颜值源码

    百度AI人脸识别测颜值由百度AI官方推出百度AI人脸识别测颜值源码,目前已将人脸识别氛围V2和V3两个接口,使用前需要参考相应的文档权限来选择接口类型.今天为大家带来的源码,就是让大家能够了解学习到百 ...

  9. 人脸检测颜值软件_百度AI人脸识别颜值-百度AI人脸识别测颜值源码下载-西西软件下载...

    百度AI人脸识别测颜值由百度AI官方推出,目前已将人脸识别氛围V2和V3两个接口,使用前需要参考相应的文档权限来选择接口类型.本次为大家带来百度AI人脸识别测颜值平台源码资源下载,相关的测量源码数据都 ...

  10. 百度AI人脸检测测颜值php,百度AI人脸识别测颜值源码app

    百度AI人脸识别测颜值源码app是由百度AI官方提供的,将人脸识别分为了两个接口,v2与vv3.需要根据文档权限来选择接口类型,这款软件非常方便用户学习和体验.想要学习相关信息的朋友可以来看看哦. 百 ...

最新文章

  1. 关于SQL语言的初步认识
  2. yii2 nginx去掉index.php?r=
  3. 记一次线上偶现的循环依赖问题
  4. linux u8 头文件,2019-12-11 转载TCP/IP编程常用C语言头文件
  5. 【linux】zip unzip
  6. linux 常用参数,Linux 常用命令及参数整理
  7. OpenCV中基本数据结构(7)_Vec
  8. 手把手教你从零开始搭建个人博客,20分钟上手
  9. 程序员的“三十而已”,你都30岁了,职业该如何规划?
  10. 【清橙 A1206】小Z的袜子(莫队算法)
  11. 怎么分析出京东快递物流多次派件的单号
  12. html5 打气球小游戏,javascript开发打气球小游戏
  13. oracle sql 分区查询语句_Oracle SQL调优之分区表
  14. MySQL:环境搭建,初识数据库----Datawhale第一次打卡笔记
  15. 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)
  16. 我们对Google的排名算法到底了解多少?
  17. 2.1.3 列表推导式
  18. 华为任正非老爷子的一番话,听得我不寒而栗
  19. Ansys Speos | 新型计算方法:使用 GPU 提升计算速率
  20. 【Gaze】Generating Image Descriptions via Sequential Cross-Modal Alignment Guided by Human Gaze

热门文章

  1. 测试框架 Mocha 实例教程
  2. 文件大小与占用空间大小(附带字节转KB,MB公式)
  3. Cascading Style Sheet层叠样式表
  4. vue v-modle实现组件之间的动态传值
  5. 使用SwipeRecyclerView配合下拉刷新出现Scrapped or attached views may not be recycled. isScrap:false isAttached:
  6. 2W+字系统讲解如何用Python自动化操作PPT,学懂这篇文章就够了
  7. 【多多情报通】看完让人焕然大悟的6种拼多多店铺玩法
  8. Python也有对象了哈哈哈哈哈哈嗝
  9. 华硕路由 ac ax_【路由器】华硕网络开启802.11ax电竞生态
  10. 真实渗透改编--综合渗透 sql注入写马+文件上传+udf提权 安鸾靶场SQL注入学习