1、人脸识别
实现思路
①查询出所有的小区信息,下拉列表显示,用于后续判断人脸信息是否与所选小区匹配
②人脸识别:调用腾讯人脸识别的API接口,首先判断传入图片是否为一张人脸;其次将这张人脸去服务器的人员库进行比对是否存在这个人员;然后根据这张人脸去数据库查询所属小区和当前选择的小区进行比对,查看当前人脸成员是否为小区成员;最后将数据存入出入登记表(in_out_record)中,判断条件为查看登记表中数据的outTime出时间是否为空,若为空,当前居民进小区;若不为空,当前居民出小区;出入登记表中存入信息,包含时间和图片信息。
查询所有小区信息
/**
* 加载小区数据
* @return
*/
@GetMapping("/communityList")
public Result communityList(){
List<Community> data = communityService.list();
if(data==null) return Result.error("没有小区数据");
return Result.ok().put("data", data);
}
出入小区的人脸识别
/**
* 人脸识别
* @param inOutFaceForm
* @return
*/
@LogAnnotation("人脸识别")
@PostMapping("/add")
public Result add(@RequestBody InOutFaceForm inOutFaceForm){
//1、判断是否为一张人脸
//2、去人员库比对是否存在这个人员
//3、和数据库返回的小区以及你选的小区进行比对,看是否为本小区成员
//4、将数据存入出入登记的表中,条件outTime字段是否为空,来决定是进小区还是出小区,还是新记录
//调用腾讯AI接口
FaceApi faceApi = new FaceApi();
RootResp resp = faceApi.searchPersonsReturnsByGroup(apiConfiguration, inOutFaceForm.getFileBase64());
//返回的提示信息
String msg = "";
//封装人员信息的json对象
JSONObject personInfo = null;
if(resp.getRet() == 0) {
JSONObject object = JSONObject.parseObject(resp.getData().toString());
JSONArray resultsReturnsByGroup = object.getJSONArray("ResultsReturnsByGroup");
JSONObject returnsByGroupJSONObject = resultsReturnsByGroup.getJSONObject(0);
JSONArray groupCandidates = returnsByGroupJSONObject.getJSONArray("GroupCandidates");
JSONObject groupCandidatesJSONObject = groupCandidates.getJSONObject(0);
JSONArray candidates = groupCandidatesJSONObject.getJSONArray("Candidates");
//返回多个人员,匹配数据库人员信息
String personId ="";
String faceId = "";
String personName = "";
String faceUrl = "";
long pid = 0;
Person p = null, p1 = null;
for(int i = 0;i < candidates.size();i++) {
personInfo = candidates.getJSONObject(i);
personId = personInfo.getString("PersonId");
faceId = personInfo.getString("FaceId");
personName = personInfo.getString("PersonName");
personId = personId.substring(4);
pid = Integer.parseInt(personId);
p = personService.getById(pid);
if(p == null)
continue;
else
p1 = p;
faceUrl = p.getFaceUrl();
if(faceUrl == null || faceUrl.equals("")){
continue;
}
faceUrl = faceUrl.substring(faceUrl.lastIndexOf("/")+1,faceUrl.lastIndexOf("."));
if(faceId.equals(faceUrl)) {
break;
}
}
if(p==null) {
return Result.ok().put("data","人员信息不存在");
}
if(inOutFaceForm.getCommunityId() != p.getCommunityId()) {
return Result.ok().put("data","对不起,你不是本小区居民,请与系统管理员联系。");
}
InOutRecord inoutrecord = new InOutRecord();
inoutrecord.setCommunityId(p.getCommunityId());
inoutrecord.setPersonId(p.getPersonId());
try {
//保存图片
String newFileName = UUID.randomUUID()+"." + inOutFaceForm.getExtName();
String fileName = face + newFileName;
Base64Util.decoderBase64File(inOutFaceForm.getFileBase64(),fileName);
String basePath = urlPrefix + "community/upload/face/" + newFileName;
//查找系统中是否有该人员的出入场信息
InOutRecord inoutrecord1 = this.inOutRecordMapper.getInOutRecord(inoutrecord);
//进入小区
if(inoutrecord1 == null) {
inoutrecord.setInPic(basePath);
this.inOutRecordMapper.insert(inoutrecord);
return Result.ok().put("status", "success").put("data", "【"+p.getUserName() + "】进入小区");
//离开小区
} else {
inoutrecord1.setOutPic(basePath);
this.inOutRecordMapper.updateById(inoutrecord1);
return Result.ok().put("status", "success").put("data", "【"+p.getUserName() + "】离开小区");
}
} catch (Exception e) {
e.printStackTrace();
}
}else{
msg = "人脸识别失败,错误码=" + resp.getRet() + "," + resp.getMsg();
}
return Result.ok().put("data",msg);
界面
2、出入记录
出入记录表(in_out_record)设计
用来存储居民出入记录的信息,包含出入时间和出入时的人脸照片
出入记录查询和搜索,这里不再详述,就是对数据库进行根据条件的查询操作,界面如下
界面
3、访客登记
访客记录(manual_record)表设计
用于存储访客的登记信息
本系统提供了访客记录搜索和查询、访客记录添加、访客记录修改、访客记录删除、根据id查询访客记录的功能,实现思路和小区管理一样,因此不再详述,页面如下。
页面
访客记录添加
访客记录修改