当前位置: 首页 > news >正文

AI智慧社区--人脸识别

前端

人脸的采集按钮:

首先对于选中未认证的居民记录,进行人脸采集

前端的按钮

  <el-form-item><el-button v-has="'sys:person:info'" type="info" icon="el-icon-camera" :disabled="ids.length <= 0" @click="cameraHandle()">人脸采集</el-button></el-form-item>

对应的采集方法:

    cameraHandle() {//选择多条数据的情况下if (this.ids.length > 1) {this.$message.error('人脸采集只能选择单条数据')return}//已经认证的情况下if (this.ids[0].state === 2) {this.$message.error('人脸识别已通过,不需要重复识别')return}this.faceVisible = truethis.$nextTick(() => {this.$refs.face.init(this.ids[0].personId)})},

 跳转到人脸采集的弹窗

弹窗代码代码

<template><el-dialog:title="'采集人脸相片'":close-on-click-modal="false":visible.sync="visible"width="1100px"><el-form ref="dataForm" :model="dataForm" label-width="100px" style="width:95%;"><el-row><el-col :span="9"><el-form-item label="" style="margin: 0;"><video v-if="openSuccess" id="videoCamera" autoplay width="260" height="200" style="border: none;" /></el-form-item></el-col><el-col :span="3" style="height: 200px;display: flex; justify-content: center;align-items: center;flex-wrap: wrap;"><el-button v-if="openSuccess" size="small" type="primary" style="width: 80px; text-align: center;" @click="setImage()">拍照</el-button><el-uploadclass="upload-demo"action="#":show-file-list="false":http-request="fileUpload"><el-button size="small" type="primary">上传人脸</el-button></el-upload></el-col><el-col :span="8" style="display: flex; justify-content: center; align-items: center;"><canvas id="canvasCamera" style="display:none;" width="640" height="480" /><img v-if="imgSrc" :src="imgSrc" alt height="200"></el-col></el-row><hr><el-row><el-col :span="12"><el-card><div class="text item"><b><font color="red">常见问题:</font></b><br><br>1、不支持IE浏览器,建议使用火狐、谷歌、Edge浏览器进行考试<br><br>2、若浏览器弹出是否允许调用摄像头,请点击允许<br><br>3、<font color="red">必须使用https加密协议,摄像头方能正常使用</font><br><br>4、如果问题还存在,请按<ahref="https://examai.cn/pc/zhinan.pdf"target="_blank"><font color="red"><b>启用摄像头操作指南</b></font></a>进行操作><br><br>5、本模块仅供测试接口,具体使用请以实际情况为准</div></el-card></el-col><el-col :span="12"><img src="@/assets/images/cm.png" width="100%"></el-col></el-row></el-form></el-dialog>
</template>
<script>
import { addPerson } from '@/api/sys/person'
export default {data() {return {visible: false,dataForm: {personId: '',extName: '',fileBase64: ''},imgSrc: '',video: null,context: null,canvas: null,openSuccess: true}},watch: {visible(val) {if (val) {this.imgSrc = ''setTimeout(() => {this.getCamera()}, 1000)} else {if (this.openSuccess) {this.closeCamera()}}}},created() {setTimeout(() => {this.getCamera()}, 1000)this.init()},methods: {init(personId) {this.visible = truethis.dataForm.personId = personId},// 表单提交dataFormSubmit() {const _this = thisthis.$refs['dataForm'].validate((valid) => {if (valid) {const param = {//人员的ID'personId': this.dataForm.personId,//文件的后缀'extName': this.dataForm.extName,//文件的Base64编码'fileBase64': this.dataForm.fileBase64}addPerson(param).then(res => {if (res.code === 200) {_this.visible = false_this.$emit('refreshDataList')_this.$message.success(res.msg)} else {_this.$message.error(res.msg)}})}})},// 打开摄像头getCamera() {this.video = document.getElementById('videoCamera')this.canvas = document.getElementById('canvasCamera')this.context = this.canvas.getContext('2d')const errocb = () => {this.$message.error('摄像头打开失败!')this.openSuccess = false}if (navigator.webkitGetUserMedia) {navigator.webkitGetUserMedia({ audio: false, video: true }, (stream) => {// video.src=window.URL.createObjectURL(stream);this.video.srcObject = streamthis.video.play()}, errocb)} else if (navigator.mediaDevices.getUserMedia) {// var constraints = { audio: true, video: { width: 1280, height: 720 } };const constraints = { audio: false, video: true }navigator.mediaDevices.getUserMedia(constraints).then((stream) => {// var video = document.querySelector('video');this.video.srcObject = streamthis.video.onloadedmetadata = (e) => {this.video.play()}})} else if (navigator.getUserMedia) {navigator.getUserMedia({ audio: false, video: true }, (stream) => {this.video.src = window.webkitURL.createObjectURL(stream)this.video.srcObject = streamthis.video.play()}, errocb)} else {alert('你的浏览器不支持打开摄像头')}},//  绘制图片(拍照功能)setImage() {this.context.drawImage(this.video,0,0,this.video.videoWidth,this.video.videoHeight)this.imgSrc = this.canvas.toDataURL('image/png')this.dataForm.extName = this.imgSrc.substring(this.imgSrc.indexOf('/') + 1, this.imgSrc.indexOf(';'))this.dataForm.fileBase64 = this.imgSrc.substring(22)this.dataFormSubmit()},// 关闭摄像头closeCamera() {this.video.srcObject.getTracks()[0].stop()},// 关闭弹出层closeDialog() {this.visible = false},// 重写文件上传方法fileUpload(file) {this.fileToBase64(file.file).then(res => {// console.log(res)this.imgSrc = resthis.dataForm.extName = res.substring(res.indexOf('/') + 1, res.indexOf(';'))const len = 19 + this.dataForm.extName.lengththis.dataForm.fileBase64 = res.substring(len)// console.log(this.dataForm.fileBase64)this.dataFormSubmit()}).catch(err => {console.log(err)this.$message.error(err)})},// 转base64fileToBase64(file) {return new Promise((resolve, reject) => {const reader = new FileReader()let fileResult = ''if (file.size > 1024 * 1024) {reject('文件大小不能超过1M')}reader.readAsDataURL(file)// 开始转reader.onload = () => {fileResult = reader.result// data:image/jpeg;base64,}// 转 失败reader.onerror = function(error) {reject(error)}// 转 结束  咱就 resolve 出去reader.onloadend = function() {resolve(fileResult)}})}}
}
</script>
<style>.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;}.avatar-uploader .el-upload:hover {border-color: #409EFF;}.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;line-height: 178px;text-align: center;}.avatar {width: 178px;height: 178px;display: block;}
</style>

 调用后端接口

export function addPerson(data) {return request({//人脸录入url: '/sys/person/addPerson',method: 'post',data})
}

后端

后端代码

    @LogAnnotation("人脸采集")@PostMapping("/addPerson")public Result addPerson(@RequestBody PersonFaceForm personFaceForm){//通过传入的表单信息中的ID 查询居民信息Person person = this.personService.getById(personFaceForm.getPersonId());//如果没有查询到相应的居民信息 则说明居民不存在if(person == null){return Result.error("居民不存在");}//数据库表中的state字段说明 人脸是否已经录入if(person.getState() == 2){return Result.error("人脸识别已通过,不需要重复识别");}//文件的Base64位编码是否已经存在  如果为空说明没有人脸图片if(personFaceForm.getFileBase64() == null || personFaceForm.getFileBase64().equals("")){return Result.error("请上传Base64编码的图片");}//如果相关的关于人脸上传的配置信息已经配置,则进行下面的内容if(apiConfiguration.isUsed()){//          方式二:调用腾讯API人脸识别//1.人脸认证账号创建//获取人脸识别的IDString faceId = newPerson(personFaceForm,person.getUserName());if(faceId == null){return Result.error("人脸识别失败");}if (faceId != null) {//生成头像访问路径String filename = faceId + "." + personFaceForm.getExtName();String faceUrl = urlPrefix + "community/upload/face/" + filename;person.setFaceUrl(faceUrl);person.setState(2);//更新人脸识别状态及图片地址this.personService.updateById(person);return Result.ok();}//方式一://模拟人脸识别//调用随机数的工具类  随机生成模拟id
//            String faceId = RandomUtil.getBitRandom();
//            //获取Base64编码的前60位
//            String faceBase = personFaceForm.getFileBase64().substring(0, 60);
//            //如果不是头像
//            if(faceBase.equals("iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c")) {
//                return Result.error("人脸识别失败");
//            }
//            //存储头像
//            //生成文件名  随机数+前端传入的文件首字母
//            String filename = faceId + "." + personFaceForm.getExtName();
//            //本地存储路径:D:/community/upload/face/+生成的文件名
//            String savePath = face + filename;
//            try {
//            //将 Base64 编码的字符串解码,并将解码后的二进制数据写入到指定路径(savePath)的文件中
//                Base64Util.decoderBase64File(personFaceForm.getFileBase64(), savePath);
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//            //生成头像访问路径 http://localhost:8181/community/upload/face/+生成的文件名
//            String faceUrl = urlPrefix + "community/upload/face/" + filename;//文件协议
//            //将更新的信息封装到实体类,从而更新数据库
//            person.setFaceUrl(faceUrl);
//            person.setState(2);
//            person.setFaceBase(faceBase);
//            //更新人脸识别状态及图片地址
//            this.personService.updateById(person);
//            return Result.ok();}return Result.error("未开启人脸识别");}

两种人脸识别的方式:

第一种:模拟人脸识别
基本思路:

1.通过传入的表单信息中的ID 查询居民信息

  • 没有查询到相应的居民信息 则说明居民不存在
  • 检查居民是否已经完成人脸认证
  • 文件的Base64位编码是否已经存在 如果为空说明没有人脸图片

2.进行人脸认证

  • 生成模拟的faceid 和 文件的Base64位编码
  • 将人脸信息存储在本地
  • 更新数据库中的信息
实现代码
package com.southwind.form;import lombok.Data;@Data
public class PersonFaceForm {//居民IDprivate Integer personId;//人脸图片的后缀private String extName;//文件的Base64编码private String fileBase64;
}
    @LogAnnotation("人脸采集")@PostMapping("/addPerson")public Result addPerson(@RequestBody PersonFaceForm personFaceForm){//通过传入的表单信息中的ID 查询居民信息Person person = this.personService.getById(personFaceForm.getPersonId());//如果没有查询到相应的居民信息 则说明居民不存在if(person == null){return Result.error("居民不存在");}//数据库表中的state字段说明 人脸是否已经录入if(person.getState() == 2){return Result.error("人脸识别已通过,不需要重复识别");}//文件的Base64位编码是否已经存在  如果为空说明没有人脸图片if(personFaceForm.getFileBase64() == null || personFaceForm.getFileBase64().equals("")){return Result.error("请上传Base64编码的图片");}//如果相关的关于人脸上传的配置信息已经配置,则进行下面的内容if(apiConfiguration.isUsed()){//方式一://模拟人脸识别//调用随机数的工具类  随机生成模拟idString faceId = RandomUtil.getBitRandom();//获取Base64编码的前60位String faceBase = personFaceForm.getFileBase64().substring(0, 60);//如果不是头像if(faceBase.equals("iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c")) {return Result.error("人脸识别失败");}//存储头像//生成文件名  随机数+前端传入的文件首字母String filename = faceId + "." + personFaceForm.getExtName();//本地存储路径:D:/community/upload/face/+生成的文件名String savePath = face + filename;try {//将 Base64 编码的字符串解码,并将解码后的二进制数据写入到指定路径(savePath)的文件中Base64Util.decoderBase64File(personFaceForm.getFileBase64(), savePath);} catch (Exception e) {e.printStackTrace();}//生成头像访问路径 http://localhost:8181/community/upload/face/+生成的文件名String faceUrl = urlPrefix + "community/upload/face/" + filename;//文件协议//将更新的信息封装到实体类,从而更新数据库person.setFaceUrl(faceUrl);person.setState(2);person.setFaceBase(faceBase);//更新人脸识别状态及图片地址this.personService.updateById(person);return Result.ok();}return Result.error("未开启人脸识别");}
    第二种:利用腾讯云的人脸识别
    人员库的创建

    1.创建密钥

    在控制台中,进入访问管理

    API密钥管理---新建密钥   切记复制密钥

    在项目的配置文件当中,配置密钥的信息

    2.创建人员库

    搜索人脸认证,创建人员库

     配置相关的人员库信息

     

    serverIp area 不需要修改
    used 表示启用
    passPercent 表示识别率,比如 80 表示图片相似度 80即认为通过
    基本思路

    腾讯云的人脸识别:

    • 创建人脸认证账号
    • 将人脸信息保存到腾讯云
    • 将人脸信息保存到本地
    实现代码:
        @LogAnnotation("人脸采集")@PostMapping("/addPerson")public Result addPerson(@RequestBody PersonFaceForm personFaceForm){//通过传入的表单信息中的ID 查询居民信息Person person = this.personService.getById(personFaceForm.getPersonId());//如果没有查询到相应的居民信息 则说明居民不存在if(person == null){return Result.error("居民不存在");}//数据库表中的state字段说明 人脸是否已经录入if(person.getState() == 2){return Result.error("人脸识别已通过,不需要重复识别");}//文件的Base64位编码是否已经存在  如果为空说明没有人脸图片if(personFaceForm.getFileBase64() == null || personFaceForm.getFileBase64().equals("")){return Result.error("请上传Base64编码的图片");}//如果相关的关于人脸上传的配置信息已经配置,则进行下面的内容if(apiConfiguration.isUsed()){//          方式二:调用腾讯API人脸识别
    //            1.人脸认证账号创建
    //            获取人脸识别的IDString faceId = newPerson(personFaceForm,person.getUserName());if(faceId == null){return Result.error("人脸识别失败");}if (faceId != null) {//生成头像访问路径String filename = faceId + "." + personFaceForm.getExtName();String faceUrl = urlPrefix + "community/upload/face/" + filename;person.setFaceUrl(faceUrl);person.setState(2);//更新人脸识别状态及图片地址this.personService.updateById(person);return Result.ok();}}return Result.error("未开启人脸识别");}
     
    private String newPerson(PersonFaceForm vo,String personName) {String faceId = null;//获取PersonFaceForm中的属性值String faceBase64 = vo.getFileBase64();String extname = vo.getExtName();String personId = vo.getPersonId()+"";//保存路径为 D:/community/upload/face/String savePath = face;//if (faceBase64!=null && !faceBase64.equals("")) {FaceApi faceApi = new FaceApi();RootResp resp = faceApi.newperson(apiConfiguration, personId, personName, faceBase64);if(resp.getRet()==0) {JSONObject data = JSON.parseObject(resp.getData().toString());faceId = data.getString("FaceId");if(faceId!=null) {String filename = faceId + "." + extname;savePath += filename;try {Base64Util.decoderBase64File(faceBase64, savePath);} catch (Exception e) {e.printStackTrace();}}}else {return faceId;}}return faceId;}

    调用的faceApi的newperson

      public RootResp newperson(ApiConfiguration config, String personId, String personName, String image) {RootResp result = new RootResp();try{//使用配置对象中的 SecretId 和 SecretKey 创建一个 Credential 对象,用于身份验证Credential cred = new Credential(config.getSecretId(), config.getSecretKey());//用于配置HTTP请求HttpProfile httpProfile = new HttpProfile();//设置请求发送的目标服务器地址httpProfile.setEndpoint(config.getServerIp());//配置客户端的相关信息ClientProfile clientProfile = new ClientProfile();clientProfile.setHttpProfile(httpProfile);//与腾讯云真正进行交互的对象IaiClient client = new IaiClient(cred, config.getArea(), clientProfile);//创建一个 JSONObject 对象,用于存储请求参数JSONObject paramObj = new JSONObject();paramObj.put("GroupId", config.getGroupId());paramObj.put("PersonId", config.getPersonIdPre() + personId);paramObj.put("PersonName", personName);paramObj.put("Image", image);CreatePersonRequest req = CreatePersonRequest.fromJsonString(paramObj.toJSONString(), CreatePersonRequest.class);CreatePersonResponse resp = client.CreatePerson(req);result.setData(CreatePersonResponse.toJsonString(resp));} catch (TencentCloudSDKException e) {result.setRet(-1);result.setMsg(e.toString());logger.error(e.toString());}logger.info(result);return result;}
    

    相关文章:

    AI智慧社区--人脸识别

    前端 人脸的采集按钮&#xff1a; 首先对于选中未认证的居民记录&#xff0c;进行人脸采集 前端的按钮 <el-form-item><el-button v-has"sys:person:info" type"info" icon"el-icon-camera" :disabled"ids.length < 0" …...

    对象的实例化、内存布局与访问定位

    一、创建对象的方式 二、创建对象的步骤: 一、判断对象对应的类是否加载、链接、初始化: 虚拟机遇到一条new指令&#xff0c;首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已经被加载、解析和初始化…...

    React基础知识回顾详解

    以下是React从前端面试基础到进阶的系统性学习内容&#xff0c;包含核心知识点和常见面试题解析&#xff1a; 一、React基础核心 JSX原理与本质 JSX编译过程&#xff08;Babel转换&#xff09;虚拟DOM工作原理面试题&#xff1a;React为何使用className而不是class&#xff1f;…...

    开发第一个安卓页面

    一&#xff1a;在java.com.example.myapplication下创建MainActivity的JAVA类 里面的代码要把xml的页面名字引入 二&#xff1a;如果没有这两个&#xff0c;可以手动创建layout文件夹和activity_main.xml activity_main.xml使用来做页面的。 三、找到这个文件 把你的JAVA类引入…...

    物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

    一、MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;是一种基于发布/订阅模式的轻量级通讯协议&#xff0c;构建于TCP/IP协议之上。它最初由IBM在1999年发布&#xff0c;主要用于在硬件性能受限和网络状况不佳的情…...

    微服务-配置管理

    配置管理 到目前为止我们已经解决了微服务相关的几个问题&#xff1a; 微服务远程调用微服务注册、发现微服务请求路由、负载均衡微服务登录用户信息传递 不过&#xff0c;现在依然还有几个问题需要解决&#xff1a; 网关路由在配置文件中写死了&#xff0c;如果变更必须重…...

    基于SpringBoot的智慧康老疗养院管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

    专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

    100.1 AI量化面试题:解释夏普比率(Sharpe Ratio)的计算方法及其在投资组合管理中的应用,并说明其局限性

    目录 0. 承前1. 夏普比率的基本概念1.1 定义与计算方法1.2 实际计算示例 2. 在投资组合管理中的应用2.1 投资组合选择2.2 投资组合优化 3. 夏普比率的局限性3.1 统计假设的限制3.2 实践中的问题 4. 改进方案4.1 替代指标4.2 实践建议 5. 回答话术 0. 承前 如果想更加全面清晰地…...

    LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略

    LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之o3&#xff1a;《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读 LLMs之OpenAI o系列&#xff1a;OpenAI o3-mini的简介、安…...

    深度解析:网站快速收录与网站安全性的关系

    本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/58.html 网站快速收录与网站安全性之间存在着密切的关系。以下是对这一关系的深度解析&#xff1a; 一、网站安全性对收录的影响 搜索引擎惩罚&#xff1a; 如果一个网站存在安全隐患&am…...

    【Rust自学】16.2. 使用消息传递来跨线程传递数据

    喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 16.2.1. 消息传递 有一种很流行而且能保证安全并发的技术&#xff08;或者叫机制&#xff09;叫做消息传递。在这种机制里&#xff0c;线…...

    如何实现滑动网格的功能

    文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverList组件相关的内容&#xff0c;本章回中将介绍SliverGrid组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverGrid组件是一种网格类组件&#xff0c;主要用来…...

    使用C# 如何获取本机连接的WIFI名称[C# ---1]

    前言 楼主最近在写一个WLAN上位机&#xff0c;遇到了使用C#查询SSID 的问题。CSDN上很多文章都比较老了&#xff0c;而且代码过于复杂。楼主自己想了一个使用CMD来获得SSID的方法 C#本身是没有获得WINDOWS网路信息的能力&#xff0c;必须要用系统API&#xff0c;WMI什么的&…...

    【Docker】快速部署 Nacos 注册中心

    【Docker】快速部署 Nacos 注册中心 引言 Nacos 注册中心是一个用于服务发现和配置管理的开源项目。提供了动态服务发现、服务健康检查、动态配置管理和服务管理等功能&#xff0c;帮助开发者更轻松地构建微服务架构。 仓库地址 https://github.com/alibaba/nacos 步骤 拉取…...

    OpenCV:闭运算

    目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;开运算-CSDN博客 1. 简述…...

    Python | Pytorch | Tensor知识点总结

    如是我闻&#xff1a; Tensor 是我们接触Pytorch了解到的第一个概念&#xff0c;这里是一个关于 PyTorch Tensor 主题的知识点总结&#xff0c;涵盖了 Tensor 的基本概念、创建方式、运算操作、梯度计算和 GPU 加速等内容。 1. Tensor 基本概念 Tensor 是 PyTorch 的核心数据结…...

    aws(学习笔记第二十六课) 使用AWS Elastic Beanstalk

    aws(学习笔记第二十六课) 使用aws Elastic Beanstalk 学习内容&#xff1a; AWS Elastic Beanstalk整体架构AWS Elastic Beanstalk的hands onAWS Elastic Beanstalk部署node.js程序包练习使用AWS Elastic Beanstalk的ebcli 1. AWS Elastic Beanstalk整体架构 官方的guide AWS…...

    《OpenCV》——图像透视转换

    图像透视转换简介 在 OpenCV 里&#xff0c;图像透视转换属于重要的几何变换&#xff0c;也被叫做投影变换。下面从原理、实现步骤、相关函数和应用场景几个方面为你详细介绍。 原理 实现步骤 选取对应点&#xff1a;要在源图像和目标图像上分别找出至少四个对应的点。这些对…...

    9 点结构模块(point.rs)

    一、point.rs源码 use super::UnknownUnit; use crate::approxeq::ApproxEq; use crate::approxord::{max, min}; use crate::length::Length; use crate::num::*; use crate::scale::Scale; use crate::size::{Size2D, Size3D}; use crate::vector::{vec2, vec3, Vector2D, V…...

    Java线程认识和Object的一些方法ObjectMonitor

    专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchron…...

    【高等数学】贝塞尔函数

    贝塞尔函数&#xff08;Bessel functions&#xff09;是数学中一类重要的特殊函数&#xff0c;通常用于解决涉及圆对称或球对称的微分方程。它们在物理学、工程学、天文学等多个领域都有广泛的应用&#xff0c;例如在波动方程、热传导方程、电磁波传播等问题中。 贝塞尔函数的…...

    99.20 金融难点通俗解释:中药配方比喻马科维茨资产组合模型(MPT)

    目录 0. 承前1. 核心知识点拆解2. 中药搭配比喻方案分析2.1 比喻的合理性 3. 通俗易懂的解释3.1 以中药房为例3.2 配方原理 4. 实际应用举例4.1 基础配方示例4.2 效果说明 5. 注意事项5.1 个性化配置5.2 定期调整 6. 总结7. 代码实现 0. 承前 本文主旨&#xff1a; 本文通过中…...

    实现使用K210单片机进行猫脸检测,并在检测到猫脸覆盖屏幕50%以上时执行特定操作

    要实现使用K210单片机进行猫脸检测&#xff0c;并在检测到猫脸覆盖屏幕50%以上时执行特定操作&#xff0c;以及通过WiFi上传图片到微信小程序&#xff0c;并在微信小程序中上传图片到开发板进行训练&#xff0c;可以按照以下步骤进行&#xff1a; 1. 硬件连接 确保K210开发板…...

    小程序设计和开发:如何研究同类型小程序的优点和不足。

    一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前&#xff0c;首先需要明确研究的目的。是为了改进自己的小程序设计和开发&#xff0c;还是为了了解市场趋势和用户需求&#xff1f;不同的研究目的会影响研究的方法和重点。例如&#xff0c;如果研究目的是为了…...

    tiktok 国际版抖抖♬♬ X-Bogus参数算法逆向分析

    加密请求参数得到乱码&#xff0c;最终得到X-Bogus...

    Redis 基础命令

    1. redis 命令官网 https://redis.io/docs/latest/commands/ 2. 在 redis-cli 中使用 help 命令 # 查看 help string 基础命令 keys * # * 代表通配符set key value # 设置键值对del key # 删除键expire key 时间 # 给键设置时间 # -2 代表时间到期了&#xff0c; -1 代表…...

    深入解析Python机器学习库Scikit-Learn的应用实例

    深入解析Python机器学习库Scikit-Learn的应用实例 随着人工智能和数据科学领域的迅速发展&#xff0c;机器学习成为了当下最炙手可热的技术之一。而在机器学习领域&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;拥有庞大的生态系统和丰富的机器学习库。其…...

    专业的定制版软件,一键操作,无限使用

    今天给大家介绍一个专业的PDF转word的小软件&#xff0c;软件只有5.5M。非常小&#xff0c;而且没有文档大小的限制&#xff0c;可以随意使用。 PDFtu PDF转word 软件第一次使用需要安装一下。 安装好之后&#xff0c;我们就能在桌面找到对应的图标&#xff0c;打开就能直接使…...

    小程序-基础加强

    前言 这一节把基础加强讲完 1. 导入需要用到的小程序项目 2. 初步安装和使用vant组件库 这里还可以扫描二维码 其中步骤四没什么用 右键选择最后一个 在开始之前&#xff0c;我们的项目根目录得有package.json 没有的话&#xff0c;我们就初始化一个 但是我们没有npm这个…...

    pytorch实现基于Word2Vec的词嵌入

    PyTorch 实现 Word2Vec&#xff08;Skip-gram 模型&#xff09; 的完整代码&#xff0c;使用 中文语料 进行训练&#xff0c;包括数据预处理、模型定义、训练和测试。 1. 主要特点 支持中文数据&#xff0c;基于 jieba 进行分词 使用 Skip-gram 进行训练&#xff0c;适用于小数…...