使用第三方 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
;
}
}