文章目錄
- 騰訊云 - 第三方服務商 介面, 對接人臉識別介面
- 1、引入包
- 2、工具類
- 3、識別結果段代碼
- 4、呼叫示例代碼
騰訊云 - 第三方服務商 介面, 對接人臉識別介面
1、引入包
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import sun.misc.BASE64Encoder;
2、工具類
/**
* @author Created by 譚健 on 2020/9/19. 星期六. 17:27.
* ? All Rights Reserved.
* <p>
* 人臉識別介面
*/
public class UserFaceAuthUtils {
public static String calcAuthorization(String source, String secretId, String secretKey, String datetime)
throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
String signStr = "x-date: " + datetime + "\n" + "x-source: " + source;
Mac mac = Mac.getInstance("HmacSHA1");
Key sKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), mac.getAlgorithm());
mac.init(sKey);
byte[] hash = mac.doFinal(signStr.getBytes("UTF-8"));
String sig = new BASE64Encoder().encode(hash);
String auth = "hmac id=\"" + secretId + "\", algorithm=\"hmac-sha1\", headers=\"x-date x-source\", signature=\"" + sig + "\"";
return auth;
}
public static String urlencode(Map<?, ?> map) throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
for (Map.Entry<?, ?> entry : map.entrySet()) {
if (sb.length() > 0) {
sb.append("&");
}
sb.append(String.format("%s=%s",
URLEncoder.encode(entry.getKey().toString(), "UTF-8"),
URLEncoder.encode(entry.getValue().toString(), "UTF-8")
));
}
return sb.toString();
}
/**
* 人臉識別
*
* @param bs64 人臉照片 base 64
* @param name 姓名
* @param cdnb 身份證號碼
* @param soft 是否軟控制,如果軟控制, 則識別結果沒有那么嚴格
* @return
*/
public static boolean face(String bs64, String name, String cdnb, boolean soft) {
try {
//云市場分配的密鑰Id
String secretId = "*********";
//云市場分配的密鑰Key
String secretKey = "********";
String source = "market";
Calendar cd = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
String datetime = sdf.format(cd.getTime());
// 簽名
String auth = calcAuthorization(source, secretId, secretKey, datetime);
// 請求方法
String method = "POST";
// 請求頭
Map<String, String> headers = new HashMap<String, String>();
headers.put("X-Source", source);
headers.put("X-Date", datetime);
headers.put("Authorization", auth);
// 查詢引數
Map<String, String> queryParams = new HashMap<String, String>();
// body引數
Map<String, String> bodyParams = new HashMap<String, String>();
bodyParams.put("base64Str", bs64);
bodyParams.put("liveChk", "0");
bodyParams.put("name", name);
bodyParams.put("number", cdnb);
// url引數拼接
String url = "http://service-0ob4jwmn-1300755093.ap-beijing.apigateway.myqcloud.com/release/efficient/idfaceIdentity";
if (!queryParams.isEmpty()) {
url += "?" + urlencode(queryParams);
}
BufferedReader in = null;
try {
URL realUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod(method);
// request headers
for (Map.Entry<String, String> entry : headers.entrySet()) {
conn.setRequestProperty(entry.getKey(), entry.getValue());
}
// request body
Map<String, Boolean> methods = new HashMap<>();
methods.put("POST", true);
methods.put("PUT", true);
methods.put("PATCH", true);
Boolean hasBody = methods.get(method);
if (hasBody != null) {
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(urlencode(bodyParams));
out.flush();
out.close();
}
// 定義 BufferedReader輸入流來讀取URL的回應
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
String result = "";
while ((line = in.readLine()) != null) {
result += line;
}
System.out.println(result);
Map<String, Object> map = JSON.parseObject(result, Map.class);
if (0 == Integer.parseInt(map.get("error_code").toString())) {
if (map.get("result") != null) {
JSONObject r = (JSONObject) map.get("result");
int similarity = new BigDecimal(r.get("Similarity").toString()).intValue();
int validateResult = Integer.parseInt(r.get("Validate_Result").toString());
if (soft) {
if ((validateResult == 1 || validateResult == 2) && ( similarity >= 40)) {
// 識別成功 且相似度大于45分,才認為是匹配的人
return true;
}
} else {
if (validateResult == 1 && similarity >= 45) {
// 識別成功 且相似度大于45分,才認為是匹配的人
return true;
}
}
}
}
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static String getImgStr(String imgFile) {
// 將圖片檔案轉化為位元組陣列字串,并對其進行Base64編碼處理
InputStream in = null;
byte[] data = null;
// 讀取圖片位元組陣列
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return Base64.getEncoder().encodeToString(data);
}
}
3、識別結果段代碼
if (0 == Integer.parseInt(map.get("error_code").toString())) {
if (map.get("result") != null) {
JSONObject r = (JSONObject) map.get("result");
int similarity = new BigDecimal(r.get("Similarity").toString()).intValue();
int validateResult = Integer.parseInt(r.get("Validate_Result").toString());
if (soft) {
if ((validateResult == 1 || validateResult == 2) && ( similarity >= 40)) {
// 識別成功 且相似度大于45分,才認為是匹配的人
return true;
}
} else {
if (validateResult == 1 && similarity >= 45) {
// 識別成功 且相似度大于45分,才認為是匹配的人
return true;
}
}
}
}
4、呼叫示例代碼
public static void main(String[] args) {
boolean face = face(getImgStr("C:\\Users\\Administrator\\Desktop\\wsen.jpg"), "姓名", "身份證號碼",true);
System.out.println("識別" + (face ? "成功,同一個人" : "失敗,不是同一人"));
}
前端傳遞,身份證號碼, 姓名,人臉照片 Base64 即可,
CSDN認證博客專家
Spring
架構
分布式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145911.html
標籤:python
上一篇:LeetCode 1146. 快照陣列(哈希map + 有序map)
下一篇:撰寫一個Java application程式,使用復數類complex驗證兩個復數1+2i和3+4i相加產生一個新的復數4+6i。復數類complex要求如下:
