• 【百度AI_人脸识别】图片对比相似度、人脸对比登录(调摄像头)


    人脸对比

    此文档功能:

    • 两张人脸图片相似度对比:比对两张图片中人脸的相似度,并返回相似度分值。
    • 存档一张图片与调用的摄像中的人脸进行对比。
    • 项目、资源下载:https://download.csdn.net/download/m0_70083523/87150842?spm=1001.2014.3001.5503

    1、人脸识别申请:

    产品--->人工智能--->人脸识别认证

    在这里插入图片描述

    领取资源-->创建应用-->调用服务:

    在这里插入图片描述

    • 领取资源:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vpeb2B2Z-1669287467788)(F:\AAAAAAAANEW\Typora-user-images\1669283895135.png)]

    • 创建应用:获得密钥

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzYDW4Yw-1669287467788)(F:\AAAAAAAANEW\Typora-user-images\1669284206816.png)]


    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ml2I8yLQ-1669287467789)(F:\AAAAAAAANEW\Typora-user-images\1669284243789.png)]

    • 调用服务:进入技术文档

      gitHub不一定能进去,那就根据API文档使用接口即可。
      在这里插入图片描述

    2、创建项目:

    ▶创建springBoot项目,创建com包即可,方便项目的复制

    在这里插入图片描述

    ▶将下载的zip解压,找到baidu文件整个复制到项目中

    在这里插入图片描述
    ▶pom.xml中导包jar包:

    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-simpleartifactId>
        <version>1.7.25version>
    dependency>
    <dependency>
        <groupId>org.jsongroupId>
        <artifactId>jsonartifactId>
        <version>20180130version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3、项目预览:

    • 1、api的关键类,AipFace这里面就是百度提供给我们的所有方法,可直接使用。
    • 2、Test.java是第四步要创建的测试类,调用平台创建的应用,对比图片。
      在这里插入图片描述

    4、测试类:

    ▶创建测试类,测试类代码

    测试类中要修改的东西(都在平台创建应用):

    • APP_ID
    • API_KEY
    • SECRET_KEY
    import com.baidu.aip.face.AipFace;
    import com.baidu.aip.face.MatchRequest;
    import org.json.JSONObject;
    import sun.misc.BASE64Encoder;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
    	//修改下列三个参数:
        public static final String APP_ID = "APP_ID ";
        public static final String API_KEY = "API_KEY ";
        public static final String SECRET_KEY = "SECRET_KEY ";
    
        public static void main(String[] args) {
            AipFace aipFace = new AipFace(APP_ID, API_KEY, SECRET_KEY);
            //放入自己本地图片路径:
            String img1="D:\\FaceDemo\\src\\main\\resources\\imgs\\img1.jpg";
            String img2="D:\\FaceDemo\\src\\main\\resources\\imgs\\img2.jpg";
            //两张不一样的图片
            String getImageStr1 = GetImageStr(img1);
            String getImageStr2 = GetImageStr(img2);
    
    //        String getImageStr3 = GetImageStr(img1);
    
            List<MatchRequest> input = new ArrayList<>();
            MatchRequest mr1 = new MatchRequest(getImageStr1, "BASE64");
            MatchRequest mr2 = new MatchRequest(getImageStr2, "BASE64");
    //        MatchRequest mr2 = new MatchRequest(getImageStr3, "BASE64");
            input.add(mr1);
            input.add(mr2);
            JSONObject match = aipFace.match(input);
            System.out.println(match);
        }
    
        public static String GetImageStr(String imgFile) {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
            InputStream in = null;
            byte[] data = null;
            //读取图片字节数组
            try {
                in = new FileInputStream(imgFile);
                data = new byte[in.available()];
                in.read(data);
                in.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            //对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);//返回Base64编码过的字节数组字符串
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    ▶运行Test的main方法,进行对比两图结果:相似性score:55.74…%, 接口调用成功!!!`

    在这里插入图片描述
    在这里插入图片描述

    ▶官方参数信息:https://ai.baidu.com/ai-doc/FACE/Lk37c1tpf学习看文档

    调用摄像头:

    在静态static中创建phote.html,并加入jquery的jar包

    在这里插入图片描述

    DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="utf-8"/>
        <title>title>
        
        <style>
            * {
                padding: 0;
                margin: 0;
            }
    
            div {
                width: 100vw;
                height: 100vh;
                display: flex;
                justify-content: center;
                align-items: center;
            }
    
            .btn {
                width: 100px;
                height: 50px;
                border-radius: 10px;
                background: #ff9900;
                line-height: 50px;
                text-align: center;
                color: #fff;
                box-shadow: 0 0 10px #999;
            }
    
            #video {
                width: 300px;
                height: 300px;
                border: 5px solid #000;
                border-radius: 10px;
                margin-left: 5px;
            }
    
            #canvas {
                width: 300px;
                height: 300px;
                border: 5px solid #000;
                border-radius: 10px;
                margin-left: 5px;
            }
        style>
    head>
    <script src="js/jquery-1.11.1.min.js" type="text/javascript" charset="utf-8">script>
    
    <body>
    <div>
        <div id="play" class="btn">开始摄像div>
        <div id="take" class="btn">拍照div>
        <div id="sub_btn" class="btn">登录div>
        <video id="video">video>
        
        <canvas id="canvas" width="300px" height="300px">canvas>
    
    div>
    <script>
        $(function () {
            // 开启摄像
            document.getElementById('play').onclick = () => {
                let constraints = {
                    // video属性设置
                    video: {
                        width: 300,
                        height: 300
                    },
                    // audio属性设置
                    audio: false
                }
                navigator.mediaDevices.getUserMedia(constraints)
                    .then(mediaStream => {
                        // 成功返回promise对象,接收一个mediaStream参数与video标签进行对接
                        document.getElementById('video').srcObject = mediaStream
                        document.getElementById('video').play()
                    })
                // 失败就失败了
            }
            // 拍照、canvas绘制
            document.getElementById('take').onclick = () => {
                let ctx = document.getElementById("canvas").getContext('2d')
                ctx.drawImage(document.getElementById("video"), 0, 0, 300, 300)
            }
    
            $("body").on("click", "#sub_btn", function () {
                var imgdata = document.getElementById("canvas").toDataURL("image/jpeg");
                console.log(imgdata)
                $.ajax({
                    url:"/Face/test",
                    type:"post",
                    async: true,
                    dataType:"json",
                    contentType : "application/x-www-form-urlencoded; charset=utf-8",
                    data:{
                        image:imgdata
                    },
                    success:function (res) {
                        if (res.result.score>70)
                            alert("登录成功")
                        else  alert("登录失败")
                    }
                })
    
            });
    
    
        })
    script>
    body>
    
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115

    创建controller类

    在这里插入图片描述

    @Controller
    @RequestMapping("/Face")
    public class FaceController {
        public static final String APP_ID = "28626699";
        public static final String API_KEY = "o6sVZ78HN8n3aSE7pCkqPq6S";
        public static final String SECRET_KEY = "F7vjecMGzkggukxOga8xU4vpFy6NtVKt";
    
        @PostMapping( "/facetTest")
        public String facetTest(@RequestParam("image") String image) {
            String substring = image.substring("data:image/jpeg;base64,".length());
            AipFace aipFace = new AipFace(APP_ID, API_KEY, SECRET_KEY);
            
            //保存一张图片,与之后调用摄像头而来的图片进行对比
            String img1="D:\\IntelliJ_IDEAProjects\\springBoot_face\\src\\main\\resources\\img\\img1.jpg";
            //两张不一样的图片
            String getImageStr1 = GetImageStr(img1);
            List<MatchRequest> input = new ArrayList<>();
            MatchRequest mr1 = new MatchRequest(getImageStr1, "BASE64");
            MatchRequest mr2 = new MatchRequest(substring, "BASE64");
    
            input.add(mr1);
            input.add(mr2);
            JSONObject match = aipFace.match(input);
            System.out.println(match);
            return match.toString();
        }
    
        public static String GetImageStr(String imgFile) {//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
            InputStream in = null;
            byte[] data = null;
            //读取图片字节数组
            try {
                in = new FileInputStream(imgFile);
                data = new byte[in.available()];
                in.read(data);
                in.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            //对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);//返回Base64编码过的字节数组字符串
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    在这里插入图片描述

    在这里插入图片描述
    这个图片的对比与我们在controller中存的那张图片有关:

    //保存一张图片,与之后调用摄像头而来的图片进行对比
     String img1="D:\\IntelliJ_IDEAProjects\\springBoot_face\\src\\main\\resources\\img\\img1.jpg";
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    Linux源码&文件系统目录结构
    共享主机安全吗(以及如何保护它)?
    利用python批量读取大量Excel表格文件中指定内容并汇总
    c语言数据结构 排序(一)
    数据结构01 栈及其相关问题讲解【C++实现】
    Django Swagger文档库drf-spectacular
    Android之UI Automator框架源码分析(第九篇:UiDevice获取UiAutomation对象的过程分析)
    最新完成的一个全栈微信小程序商城,包含后台和小程序端,服务器端
    类 —— 友元、常/静态成员函数
    数据库中查询所有表信息,查询所有字段信息
  • 原文地址:https://blog.csdn.net/m0_70083523/article/details/128024551