代码编织梦想

项目的需求是实现人脸对比及活体检测功能,花钱越少越好,一开始考虑的是移动端的H5方案,看了下需要对接公安的api接口,这个价格太高了,放弃了,最终是移动端拍照上传,调用百度api实现人脸对比及活体检测功能。

  1. ionic中接入相机插件后实现拍照方法如下:
    ionic cordova plugin add cordova-plugin-camera
    npm install --save @ionic-native/camera@4
  2. 在config.xml中的ios平台中加入权限
 <config-file parent="NSCameraUsageDescription" platform="ios" target="*-Info.plist">
      <string>Need Camera Access To Take Pictures</string>
 </config-file>

  1. 在app.module.ts中引入:
import { Camera, CameraOptions } from '@ionic-native/camera';

在providers中加入:Camera,

  1. 在按钮点击主页面中引入:
import { Camera, CameraOptions } from '@ionic-native/camera';
private camera: Camera,

以点击按钮调用弹框为例:

 //底部弹窗拍照或者相册选取
    presentActionSheet() {
      const actionSheet = this.actionSheetCtrl.create({
        // title: '选择照片',
        buttons: [
          {
            text: '拍照',
            handler: () => {
              this.pickPicture(1);
            }
          }, {
            text: '相册选取',
            handler: () => {
              this.pickPicture(0);
            }
          }
        ]
      });
      actionSheet.present();
    }

    pickPicture(source: Number) {
      debugger;
      const options: CameraOptions = {
        quality: 50,
        destinationType: this.camera.DestinationType.DATA_URL,
        correctOrientation: true,
        targetWidth: 200,
        targetHeight: 200,
        encodingType: this.camera.EncodingType.JPEG,
        mediaType: this.camera.MediaType.PICTURE,
        saveToPhotoAlbum:true,
        sourceType: Number(source)
      }
  
      this.camera.getPicture(options).then((imageData) => {
        alert(imageData);
        console.log("photo data:"+imageData);
        // this.addPicData(imageData);
  
      }, (err) => {
        console.log(err);
      });
    }
  1. 拍照后拿到图片base64的值,然后访问后端接口,具体案例如下:
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.FaceVerifyRequest;
import com.baidu.aip.face.MatchRequest;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;

/**
* @author: yingch
* @date: 2020/8/10 13:51
* @description:集成百度人脸实名认证功能之人脸检测
*
*     <!--百度人脸认证-->
*     <dependency>
*         <groupId>com.baidu.aip</groupId>
*         <artifactId>java-sdk</artifactId>
*         <version>4.15.1</version>
*     </dependency>
*/
public class SampleDemo {
    //设置APPID/AK/SK
    public static final String APP_ID = "XXX";
    public static final String API_KEY = "XXX";
    public static final String SECRET_KEY = "XXX";

    public static void main(String[] args) {
        // 初始化一个AipFace
        AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

       //尹工戴口罩图片
        String image = "XXX";
        //二次翻拍照片
        String image1 = "XXX";
       //钟哥人脸图
       String image2="XXX";
       String image3 =“XXX”;
       String imageType = "BASE64";


        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("face_field", "age");
        options.put("max_face_num", "2");
        options.put("face_type", "LIVE");
        options.put("liveness_control", "LOW");
        System.out.println("------------------初始化3张照片:image是戴口罩图片;image1是二次翻拍的图片;image2是钟哥人脸;image3是手机拍摄的未处理的图片--------------------");
        // 人脸检测 检测当前照片是否是人脸照片
        JSONObject res = client.detect(image, imageType, options);
        JSONObject res0 = client.detect(image2, imageType, options);
        System.out.println("------------------1.检测image是否是人脸照片--------------------");
        System.out.println(res.toString(2));
        System.out.println("------------------1.检测image2是否是人脸照片--------------------");
        System.out.println(res0.toString(2));

            /*人脸比对功能*/
        System.out.println("---------------2.人脸对比功能(image与image1)-------------");
            MatchRequest req1 = new MatchRequest(image, "BASE64");
            MatchRequest req2 = new MatchRequest(image1, "BASE64");
            ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
            requests.add(req1);
            requests.add(req2);
            JSONObject res1 = client.match(requests);
            System.out.println(res1.toString(2));
        System.out.println("------------2.人脸对比功能(image与image2)-----------");
        MatchRequest req11 = new MatchRequest(image, "BASE64");
        MatchRequest req22 = new MatchRequest(image2, "BASE64");
        ArrayList<MatchRequest> requests1 = new ArrayList<MatchRequest>();
        requests1.add(req11);
        requests1.add(req22);

        JSONObject res11 = client.match(requests1);
        System.out.println(res11.toString(2));


        /*在线活体检测*/
        FaceVerifyRequest req3 = new FaceVerifyRequest(image, "BASE64");
        ArrayList<FaceVerifyRequest> list3 = new ArrayList<FaceVerifyRequest>();
        list3.add(req3);
        JSONObject res3 = client.faceverify(list3);
        System.out.println("------------------3.是否是活体(image)--------------------");
        System.out.println(res3.toString(2));

        FaceVerifyRequest req4 = new FaceVerifyRequest(image3, "BASE64");
        ArrayList<FaceVerifyRequest> list4 = new ArrayList<FaceVerifyRequest>();
        list4.add(req4);
        JSONObject res4 = client.faceverify(list4);
        System.out.println("------------------4.是否是活体(image3)--------------------");
        System.out.println(res4.toString(2));


    }
}

Java-SDK参考:https://ai.baidu.com/ai-doc/FACE/8k37c1rqz

AppID、 API Key、 Secret Key值获取如下:

在这里插入图片描述

  1. 下面看下代码运行数据:
------------------初始化3张照片:image是戴口罩图片;image1是二次翻拍的图片;image2是经过处理的钟哥人脸;image3是手机拍照获取的未处理数据--------------------
------------------1.检测image是否是人脸照片--------------------
{
  "result": null,
  "log_id": 1589651015594,
  "error_msg": "pic not has face",
  "cached": 0,
  "error_code": 222202,
  "timestamp": 1597050702
}
------------------1.检测image2是否是人脸照片--------------------
{
  "result": {
    "face_num": 1,
    "face_list": [{
      "liveness": {"livemapscore": 1},
      "angle": {
        "roll": -1.2,
        "pitch": 8.01,
        "yaw": 0.93
      },
      "face_token": "cd1ae488cb9e53a57853cdb48b0f429f",
      "location": {
        "top": 51.65,
        "left": -0.4,
        "rotation": 1,
        "width": 140,
        "height": 148
      },
      "face_probability": 0.99,
      "age": 30
    }]
  },
  "log_id": 3589201001101,
  "error_msg": "SUCCESS",
  "cached": 0,
  "error_code": 0,
  "timestamp": 1597050703
}
------------------2.人脸对比功能(image与image1)--------------------
{
  "result": {
    "score": 82.12217712,
    "face_list": [
      {"face_token": "c3b6388aaa8280fabc6f82bda8a7115f"},
      {"face_token": "0d269bf33d2393084ed34d9ba4eb22a4"}
    ]
  },
  "log_id": 3515845510199,
  "error_msg": "SUCCESS",
  "cached": 0,
  "error_code": 0,
  "timestamp": 1597050703
}
------------------2.人脸对比功能(image与image2)--------------------
{
  "result": {
    "score": 23.42041397,
    "face_list": [
      {"face_token": "c3b6388aaa8280fabc6f82bda8a7115f"},
      {"face_token": "cd1ae488cb9e53a57853cdb48b0f429f"}
    ]
  },
  "log_id": 5520145798445,
  "error_msg": "SUCCESS",
  "cached": 0,
  "error_code": 0,
  "timestamp": 1597050703
}
------------------3.是否是活体(image)--------------------
{
  "result": {
    "thresholds": {
      "frr_1e-3": 0.3,
      "frr_1e-2": 0.9,
      "frr_1e-4": 0.05
    },
    "face_liveness": 0.03,
    "face_list": [{
      "liveness": {"livemapscore": 0.03},
      "angle": {
        "roll": -1.4,
        "pitch": 1.48,
        "yaw": -5.01
      },
      "face_token": "c3b6388aaa8280fabc6f82bda8a7115f",
      "location": {
        "top": 39.92,
        "left": 12,
        "rotation": 1,
        "width": 54,
        "height": 59
      },
      "face_probability": 0.99
    }]
  },
  "log_id": 1510184841010,
  "error_msg": "SUCCESS",
  "cached": 0,
  "error_code": 0,
  "timestamp": 1597050703
}
------------------4.是否是活体(image3)--------------------
{
  "result": {
    "thresholds": {
      "frr_1e-3": 0.3,
      "frr_1e-2": 0.9,
      "frr_1e-4": 0.05
    },
    "face_liveness": 1,
    "face_list": [{
      "liveness": {"livemapscore": 1},
      "angle": {
        "roll": 1.07,
        "pitch": 7,
        "yaw": -2.85
      },
      "face_token": "c48f9bd50144972f24c06cf19559b256",
      "location": {
        "top": 76.99,
        "left": 27.6,
        "rotation": 4,
        "width": 57,
        "height": 63
      },
      "face_probability": 1
    }]
  },
  "log_id": 9975949975001,
  "error_msg": "SUCCESS",
  "cached": 0,
  "error_code": 0,
  "timestamp": 1597050703
}


说明:
上述代码中将所有的人脸图片base64数据用XXX代替,拍照打印出照片的人脸数据后代替即可。
1.检测是否是人脸根据error_msg判断
2.人脸对比根据score值判断,越接近100为同一个人的概率越大
3.活体检测根据face_liveness值判断,值越接近1表明是活体的概率越大

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_16497617/article/details/107918893

Java中介者模式(Mediator Pattern)-爱代码爱编程

一、智能家庭项目 智能家庭项目: 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等。主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放。传统的方式的问题分析当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂各个电器对象彼此联系,你中有我

JDK7 + tomcat7 + redis实现session共享-爱代码爱编程

达到的效果 当客户端访问Nginx服务器时,Nginx负载均衡会自动将请求转发到TomcatA或TomcatB服务器,以减轻Tomcat压力,从而达到Tomcat集群化部署,为了使各Tomcat之间共享同一个Session,将采用Redis缓存服务来集中管理Session存储。 下载开源项目 tomcat-redis-session-manager

读java编程思想 第一遍开启全新认知-爱代码爱编程

读<java编程思想> 第一遍:开启全新认知 第一个知识点: ​ java中像int和float这种基本数据类型,由于使用的频率很高,所以Java像c/c++一样都是采用了 ​ 不通过new的方式来进行创建,而是通过使用自动变量,这个变量存储再栈中,并且可以直接存储值 此时:映射最近学习的volatile 该方法中一个证明 volatil

ssh框架spring配置文件配置定时任务-爱代码爱编程

1、在xml中配置相关配置文件 <!-- 0点定时任务相关配置 --> <!-- 要调用的定时任务的工作类 --> <bean id="tjsyncData" class="com.web.action.SyncDataAction" autowire="byName"/> <!-- 总管理类 设置

mybatis plus笔记-爱代码爱编程

一直用的是TKmybatis,学习一下mybaits plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 如上,官网简介 pom文件 <!--mysql--> <dependency&

2020-08-10-爱代码爱编程

手写一波双色球随机生成器,弄着玩的,记录一下(老老实实搬砖,别老想着中彩票) public static void main(String[] args) { Random random = new Random(); //双色球红号 int[] red = new int[]{1,2,3,4,5,6,7,8,9,10,11,12,

imagemagick使用_使用ImageMagick将图像转换为灰度-爱代码爱编程

imagemagick使用 A few years ago I bought a DSLR camera with a bunch of filter effects built in and it's been worth every penny.  I took some incredible photos in London, Paris

jQuery人脸检测-爱代码爱编程

I've always been intrigued by recognition software because I cannot imagine the logic that goes into all of the algorithms. Whether it's voice, face, or other types of detec

边云协同!EM-BOX视频分析盒加速安全生产场景落地AI应用-爱代码爱编程

在工地、工厂、园区等场景中,安全生产的需求十分强烈,需要监控工人是否正确佩戴安全帽,是否有越线(电子围栏)、攀高行为,对重点区域进行烟火检测。 传统的管理方式相对单一,人工巡检效率低下,事后罚款也无法解决根本问题;且这些场景下的信息化建设往往比较薄弱,缺少完善的信息系统进行集中管理及分析,更不用说利用 AI 能力进行智能检测与预警了。 ▲ 常见建筑

Python opencv求助!在线等,挺急的-爱代码爱编程

最近,小白我决定尝试接触一下人脸识别,于是在网上发现了opencv这个库,我自己找了个练手项目,爬取10000张人脸表情照片,爬虫方面是利用关键词爬取百度图片,结果自然是毫无问题!但是大家也都知道,百度图片搜索的精确度实在不忍直视,于是我利用opencv这个库对图像进行识别处理。具体代码如下:  import cv2 import os #最后剪裁的图

imutils中resize的width和height关系-爱代码爱编程

imutils中resize的width和height关系 介绍当参数只有width参数只有height参数有width和height总结 介绍 imutils中resize,我们一般就传入两个参数,一个需要修改大小的图像,一个weight或者是height,是根据的长宽比一起修改的。 当参数只有width import cv2 as c

永远不要对 AI 说:“我不行!”-爱代码爱编程

最近这些年,如果我要问什么技术最值钱,我想超过90%的人都会说是:人工智能。 确实,随着近些年人工智能发展与普及,AI研发岗早已成为编程领域薪水最高的岗位之一。 但扎心的是,一提到 AI ,相信绝大部分人都很懊恼,不知道怎么学、不知道从哪里学、学费又太贵、学完了不知道选择深应用方向...报了不少培训班还是找不到满意的工作。 AI 真的那