实战项目——智慧社区(三)之 门禁管理

文章详细描述了一个结合腾讯人脸识别API的系统,用于小区居民的人脸识别出入控制,包括查询小区数据、人脸比对验证及出入登记操作,同时提及了访客登记功能的实现。
摘要由CSDN通过智能技术生成

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查询访客记录的功能,实现思路和小区管理一样,因此不再详述,页面如下。

页面

访客记录添加

访客记录修改 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值