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智慧社区--人脸识别
前端 人脸的采集按钮: 首先对于选中未认证的居民记录,进行人脸采集 前端的按钮 <el-form-item><el-button v-has"sys:person:info" type"info" icon"el-icon-camera" :disabled"ids.length < 0" …...

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

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

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

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】
一、MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。它最初由IBM在1999年发布,主要用于在硬件性能受限和网络状况不佳的情…...

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

基于SpringBoot的智慧康老疗养院管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

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

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

【Rust自学】16.2. 使用消息传递来跨线程传递数据
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 16.2.1. 消息传递 有一种很流行而且能保证安全并发的技术(或者叫机制)叫做消息传递。在这种机制里,线…...

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

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

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

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

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

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

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

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

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

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. 承前 本文主旨: 本文通过中…...

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

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

tiktok 国际版抖抖♬♬ X-Bogus参数算法逆向分析
加密请求参数得到乱码,最终得到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 代表时间到期了, -1 代表…...

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

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

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

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