java web 人脸识别技术

wisdomdd.cn

使用第三方 face++ 网址 https://www.faceplusplus.com.cn/ 实现。采用springmvc+spring+maven+tomcat实现,上传图片,识别图片(图片必须是全脸)识别图片中人物的性别,年龄,情绪,人种,颜值等信息。

1、首先需要在https://www.faceplusplus.com.cn/ 中注册用户信息。

2、在应用管理里面中创建应用获取apikey及apisecret

3、创建maven工程

4、项目访问路径(tomcat端口为80端口)

http://localhost/face

5、效果图

6、识别图片的核心代码

package com.face.service;

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLEncoder;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Random;

import javax.net.ssl.SSLException;

public class FaceCore {

public String face(String path) throws Exception{

File file = new File(path);

byte[] buff = getBytesFromFile(file);

String url = "https://api-cn.faceplusplus.com/facepp/v3/detect";

HashMap<String, String> map = new HashMap<String, String>();

HashMap<String, byte[]> byteMap = new HashMap<String, byte[]>();

map.put("api_key", "mvUgQwEA8T1qgZivU5lFjOE8QpzLbRp6");

map.put("api_secret", "RGXAQdhAm9a-ttQd-Pz1o9jLiGvLFwlp");

map.put("return_landmark", "1");

map.put("return_attributes","gender,age,smiling,headpose,facequality,blur,eyestatus,emotion,ethnicity,beauty,mouthstatus,eyegaze,skinstatus");

byteMap.put("image_file", buff);

String str = "";

try{

byte[] bacd = post(url, map, byteMap);

str = new String(bacd);

// System.out.println(str);

}catch (Exception e) {

e.printStackTrace();

}

return str;

}

private final static int CONNECT_TIME_OUT = 30000;

private final static int READ_OUT_TIME = 50000;

private static String boundaryString = getBoundary();

protected static byte[] post(String url, HashMap<String, String> map, HashMap<String, byte[]> fileMap) throws Exception {

HttpURLConnection conne;

URL url1 = new URL(url);

conne = (HttpURLConnection) url1.openConnection();

conne.setDoOutput(true);

conne.setUseCaches(false);

conne.setRequestMethod("POST");

conne.setConnectTimeout(CONNECT_TIME_OUT);

conne.setReadTimeout(READ_OUT_TIME);

conne.setRequestProperty("accept", "*/*");

conne.setRequestProperty("Content-Type", "multipart/form-data; boundary="+ boundaryString);

conne.setRequestProperty("connection", "Keep-Alive");

conne.setRequestProperty("user-agent", "Mozilla/4.0 (compatible;MSIE 6.0;Windows NT 5.1;SV1)");

DataOutputStream obos = new DataOutputStream(conne.getOutputStream());

Iterator iter = map.entrySet().iterator();

while(iter.hasNext()){

Map.Entry<String, String> entry = (Map.Entry) iter.next();

String key = entry.getKey();

String value = entry.getValue();

obos.writeBytes("--" + boundaryString + " ");

obos.writeBytes("Content-Disposition: form-data; name="" + key

+ "" ");

obos.writeBytes(" ");

obos.writeBytes(value + " ");

}

if(fileMap != null && fileMap.size() > 0){

Iterator fileIter = fileMap.entrySet().iterator();

while(fileIter.hasNext()){

Map.Entry<String, byte[]> fileEntry = (Map.Entry<String, byte[]>) fileIter.next();

obos.writeBytes("--" + boundaryString + " ");

obos.writeBytes("Content-Disposition: form-data; name="" + fileEntry.getKey()

+ ""; filename="" + encode(" ") + "" ");

obos.writeBytes(" ");

obos.write(fileEntry.getValue());

obos.writeBytes(" ");

}

}

obos.writeBytes("--" + boundaryString + "--" + " ");

obos.writeBytes(" ");

obos.flush();

obos.close();

InputStream ins = null;

int code = conne.getResponseCode();

try{

if(code == 200){

ins = conne.getInputStream();

}else{

ins = conne.getErrorStream();

}

}catch (SSLException e){

e.printStackTrace();

return new byte[0];

}

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buff = new byte[4096];

int len;

while((len = ins.read(buff)) != -1){

baos.write(buff, 0, len);

}

byte[] bytes = baos.toByteArray();

ins.close();

return bytes;

}

private static String getBoundary() {

StringBuilder sb = new StringBuilder();

Random random = new Random();

for(int i = 0; i < 32; ++i) {

sb.append("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-".charAt(random.nextInt("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".length())));

}

return sb.toString();

}

private static String encode(String value) throws Exception{

return URLEncoder.encode(value, "UTF-8");

}

public static byte[] getBytesFromFile(File f) {

if (f == null) {

return null;

}

try {

FileInputStream stream = new FileInputStream(f);

ByteArrayOutputStream out = new ByteArrayOutputStream(1000);

byte[] b = new byte[1000];

int n;

while ((n = stream.read(b)) != -1)

out.write(b, 0, n);

stream.close();

out.close();

return out.toByteArray();

} catch (IOException e) {

}

return null;

}

}


转载于:https://juejin.im/post/5ca4ab6ce51d455b5e391a29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值