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

news2025/8/17 6:28:20

人脸对比

此文档功能:

  • 两张人脸图片相似度对比:比对两张图片中人脸的相似度,并返回相似度分值。
  • 存档一张图片与调用的摄像中的人脸进行对比。
  • 项目、资源下载: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.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20180130</version>
</dependency>

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编码过的字节数组字符串
    }
}

▶运行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标签上设置宽高 -->
    <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>

创建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编码过的字节数组字符串
    }
}

在这里插入图片描述

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编译原理—语法制导翻译、S属性、L属性、自上而下、自下而上计算

编译原理—语法制导翻译、S属性、L属性、自上而下、自下而上计算1.语法制导翻译1.1属性文法1.2算术表达式的计数器1.3属性的分类1.4属性依赖图继承属性的计算1.5语义规则的计算方法1.6属性计算次序2. S属性定义2.1 语法树与分析树2.2 语法树与DAG2.2.1构造表达式的语法树(DAG)2…

Android中常见的那些内存泄漏——【问题分析+方案】

1.静态Activity(Activity上下文Context)和View 静态变量Activity和View会导致内存泄漏&#xff0c;在下面代码中对Activity的Context和TextView设置为静态对象&#xff0c;从而产生内存泄漏&#xff1b; public class MemoryTestActivity extends AppCompatActivity {private…

[附源码]SSM计算机毕业设计健身健康规划系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

noexcept说明符/运算符

一、noexcept说明符 1、语法 &#xff08;1&#xff09;noexcept 与 noexcept(true) 相同 &#xff08;2&#xff09;noexcept&#xff08;表达式&#xff09; 如果 表达式 求值为 true&#xff0c;那么声明函数不会抛出任何异常。 &#xff08;3&#xff09;throw() //c1…

Ubuntu配置FTP服务

参考目录1.安装FTP服务器软件2.配置FTP服务3.Ubuntud登录ftp服务器4.windows下通过cuteFTPlianjei1.安装FTP服务器软件 (1) FTP文件传送协议(File Transfer Protocol&#xff0c;简称FTP)&#xff0c;是一个用于从一台主机到另一台主机传输文件的协议。 (2&#xff09;Linux下有…

Jetpack 之 LiveData 实现事件总线

事件总线相信大家很多时候都会用到&#xff0c;那大家常用的也就是常青树 EventBus&#xff0c;以及 RxJava 流行起来的后起之秀 RxBus。它们的使用方式都差不多&#xff0c;思想也都是基于观察者模式&#xff0c;正好 LiveData 的核心思想也是观察者模式&#xff0c;因此我们完…

做Android 开发这么久,还不明白 Android Framework 知识重要性?

Framework作为Android的框架层&#xff0c;为App提供了很多API调用&#xff0c;但很多机制都是Framework包装好后直接给App用的&#xff0c;如果不懂这些机制的原理&#xff0c;就很难在这基础上进行优化。 从做Android的第一天起&#xff0c;你一定听过无数次关于Framework的…

计算机音乐-乐理知识(1)

一、节拍 节拍&#xff08;Beat/Meter&#xff09;&#xff0c;是一个衡量节奏的单位&#xff0c;在音乐中&#xff0c;有一定强弱分别的一系列拍子在每隔一定时间重复出现。如 2 / 4 、 4 / 4 、 3 / 4 拍等。节拍&#xff0c;乐曲中表示固定单位时值和强弱规律的组织形式。 …

测试员工作三年后的工资对比,没达到这个数的都属于拖后腿了

“毕业三年的薪资是职场阶段的一个分水岭。” 不知什么时候开始&#xff0c;这句话深刻的引入了所有打工人的心中&#xff0c;程序员们自然也不例外。 事实上&#xff0c;这句话说的并不无道理&#xff0c;毕业的三年&#xff0c;不仅是学生到职场人身份上的一个转变&#xf…

初阶数据结构学习记录——아홉 二叉树和堆(2)

接着上一篇 之前写过一些关于堆的代码&#xff0c;向下调整&#xff0c;向上调整算法&#xff0c;以及常用的几个函数。这一篇继续完善堆&#xff0c;难度也会有所上升。先来看上一篇文末提到的创建堆算法。 首先要有空间&#xff0c;要有数据&#xff0c;之后再形成堆。我们…

9.5 利用可执行内存挑战DEP

目录 一、实验环境 二、实验思路 三、实验代码 四、实验步骤 1、寻找memcpy函数的地址 2、查看内存中可读可写可执行的内存 3、修复EBP 4、保证memcpy的源地址位于shellcode之前 一、实验环境 操作系统&#xff1a;windows 2000 软件&#xff1a;原版OD、VC6.0 二、实…

删除的数据如何恢复?误删了文件怎么恢复

文件的误删除&#xff0c;相信大部分人都经历过。不过因为很多人删除的文件都不算是很重要&#xff0c;所以有与没有并没有太大的区别。但是一旦你删除的文件正是你最近急需的&#xff0c;删除的数据如何恢复&#xff1f;别着急&#xff0c;可以试试以下的几种方法&#xff1a;…

STM32串口详解

实验一&#xff1a;简单的利用串口接收中断回调函数实现数据的返回 关于串口调试助手&#xff0c;还应知道&#xff1a; 发送英文字符需要用一个字符即8位&#xff0c;发送汉字需要两个字符即16位&#xff0c;如上图&#xff0c;发送汉字“姜”实际是发送“BD AA”而发送英文字…

外卖项目06---套餐管理业务开发(移动端的后台代码编辑开发)

菜品展示、购物车、下单 目录 一、导入用户地址簿相关功能代码 90 1.1需求分析 90 1.2数据模型 90 1.3导入功能代码 90 二、菜品展示 91 2.1需求分析 91 2.2商品展示---代码开发---梳理交互过程 92 2.3菜品展示---代码开发---修改DishController的list方法并测试 93 2…

OpenGL原理与实践——核心模式(二):Shader变量、Shader类的封装以及EBO

目录 Shader内的一些关键字 向量 举例&#xff1a;shader之间的数据传输&#xff0c;并实现渐变颜色 举例&#xff1a;C向shader传输数据的过程 代码整理——shader类的封装 加入颜色信息 索引绘制——EBO 整体代码以及渲染结果 Shader内的一些关键字 in&#xff1a;上…

网站被劫持勒索怎么办

互联网出现后的几十年时间里&#xff0c;世界便由一张张网串联了起来&#xff0c;给我们的生活带来了无限的便利。但在互联网飞速发展的同时&#xff0c;恶意网络攻击也随之而来&#xff0c;近年来&#xff0c;互联网攻击事件频发&#xff0c;不法分子利用常见的DDoS攻击、CC攻…

【生成式网络】入门篇(二):GAN的 代码和结果记录

GAN非常经典&#xff0c;我就不介绍具体原理了&#xff0c;直接上代码。 感兴趣的可以阅读&#xff0c;里面有更多变体。 https://github.com/rasbt/deeplearning-models/tree/master/pytorch_ipynb/gan GAN 在 MINIST上的代码和效果 import os # os.chdir(os.path.dirname(_…

springBoot集成websocket实现消息实时推送提醒

在浏览某些网页的时候&#xff0c;例如 WebQQ、京东在线客服服务、CSDN私信消息等类似的情况下&#xff0c;我们可以在网页上进行在线聊天&#xff0c;或者即时消息的收取与回复&#xff0c;可见&#xff0c;这种功能的需求由来已久&#xff0c;并且应用广泛,和pc端web系统待办…

新建anaconda使用jupyter出现的一系列问题

1&#xff0c;运行一段机器学习代码&#xff0c;报缺少h5py的错误. 使用conda install h5py1.8.0 安装无法安装&#xff0c;因为当前环境的python版本是3.9&#xff0c;只能用3.7及以下的版本。无奈只能新建一个conda 环境。 2&#xff0c;新建一个 python3.7的conda 环境。运行…

「风控算法服务平台」高性能在线推理服务设计与实现

本文作者&#xff1a;郁昌存 来自京东科技-风险管理中心 一、背景/目标 1&#xff09; 风控智能化体系建设依赖大量深度学习/机器学习模型进行实时在线的风险识别、智能决策。要求可以将算法模型快速部署为在线服务&#xff0c;供决策引擎调用。 2&#xff09; 风控决策引擎…