基于Ubuntu22.04和OpenCV4.5.4的物联网人脸识别考勤机
前言:本人已有Ubuntu22.04的相关开发环境配置,并且默认C++和机器学习基础,这里直接从安装opencv开始,完整代码在最后。具体情况具体分析,请以实际为主。
视频参考:【大厂敲门砖】从0到1做一个物联网人脸识别考勤机项目!(附源码)_哔哩哔哩_bilibili
博客参考:做一个人脸识别考勤机项目(利用OpenCV)_基于opencv的人脸识别考勤-CSDN博客
目录
1.OpenCV配置
1.1安装OpenCV
1.2OpenCV使用的官方在线帮助文档
2.C++和OpenCV初步编程
2.1连接摄像头
2.2使用OpenCV库
2.3打开摄像头
2.4图像采集和优化处理
2.5人脸检测
2.6人脸截取及图片编码与解码
3.对接百度智能云平台
3.1注册账号
3.2创建人脸库
3.3SDK环境搭建
3.4百度云平台的接入
4.优化数据处理与分析
4.1Json数据解析
4.2记录考勤时间
4.3显示考勤信息
5.最终结果汇总
1.OpenCV配置
OpenCV是一个开源的计算机视觉和机器学习软件库其使用一系列C语言函数和少量C++类实现,内部实现了很多图像处理和计算机视觉的通用算法。
OpenCV可以运行在Linux系统上,且其轻量、高效所以在嵌入式领域得到广泛的应用。
1.1安装OpenCV
在终端输入:(注意联网)(以下使用 apt 也可)
sudo apt-get install libopencv-dev
如果出现错误无法安装(已经联网),进行更新软件包索引:
sudo apt-get update
PS:连不了网图标还不见的进行以下操作,删除NetworkManager缓存文件,重启网络服务(Ubuntu22.04的特别处理)
sudo service NetworkManager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service NetworkManager start
验证是否安装成功:
dpkg -s libopencv-dev
1.2OpenCV使用的官方在线帮助文档
网址:OpenCV - Open Computer Vision Library
找对应版本的文档:
用什么直接搜吧:
2.C++和OpenCV初步编程
2.1连接摄像头
需要让虚拟机使用本机的摄像头,选择USB3.1的兼容性:
之后可以找到摄像头设备,点击连接,之后点击确定 x2:
也可以直接在右下角连接:
PS:如果还是找不到可用的摄像头,win+R:services.msc,在服务页面找到“VMUSBArbService”服务,又发现无法启动,那么多半是因为之前卸载过VMWare且卸载不干净。解决如下:
控制面板 —> 程序与功能 —> 找到VMWare,右键点击更改 —> 点击修复 —> 重启
2.2使用OpenCV库
使用的总的头文件:
include "opencv2/opencv.hpp"
加上命名空间的声明:
using namespace cv;
因为这个头文件的是在opencv4目录下的,注意编译的时添加链接库路径,告诉编译器在指定的路径中查找头文件:(示例)
g++ main.cpp -o main -I/usr/include/opencv4
2.3打开摄像头
类:VideoCapture
头文件:videoio.hpp
作用:从视频文件、图像序列或摄像头捕获视频
VideoCapture cap(0, CAP_V4L2); //创建对象并打开默认摄像头,CAP_V4L2有自动调整参数
//cap.set(CAP_PROP_FRAME_WIDTH, 1000);//宽度
//cap.set(CAP_PROP_FRAME_HEIGHT, 960);//高度if(!cap.isOpened()){cout << "Camera opened failed." << endl;return -1;
}
cout << "Camera opened successfully." << endl;
PS:VideoCapture cap(0, CAP_V4L2)已经创建并打开了摄像头,因此检测是否打开不能用open()。另外为摄像头选择一个后端,否则会有一个不影响运行的警告。而查看启用了哪些后端可使用命令:
opencv_version -v
2.4图像采集和优化处理
类:Mat
库:core
作用:表示图像或矩阵,用于存储图像数据
函数:cvtColor()
库:imgproc
作用:用于将图像从一种颜色空间转换为另一种颜色空间
函数:imshow()
库:highgui
作用:用于在窗口中显示图像;第一个参数是窗口名称,第二个参数是图像矩阵
函数:equalizeHist()
库:imgproc
作用: 用于对灰度图像进行直方图均衡化,增强清晰度和对比度
函数:waitKey()
库:highgui
作用:用于控制图像显示窗口的关闭或循环退出
Mat ColorImage; //定义一个Mat类型的容器变量frame,用于存储视频帧
Mat GrayImage; //存储灰度图
for(;;){cap >> ColorImage; //从视频流中读取下一帧并将其存储到colorImage中cvtColor(ColorImage,GrayImage,COLOR_BGR2GRAY); //转换灰度图equalizeHist(GrayImage,GrayImage); //均衡化灰度图 (清晰度)imshow("实时视频", GrayImage); //显示帧if(waitKey(7) >= 0) break; //暂停7ms,等待用户按下按键
}
提供阶段编译测试的命令:此时编译速度已经比较慢
g++ main.cpp -o main -I/usr/include/opencv4 -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_videoio
阶段效果:
2.5人脸检测
类:cv::CascadeClassifier(级联分类器)
库:objdetect - Object Detection(对象检测)
作用:用于加载预先训练好的级联分类器,并用于在图像中检测特定的对象;级联分类器通过一系列的弱分类器组合而成,能够在图像中快速定位和识别目标对象。
OpenCV已经自带一些训练好的模型,输入以下命令可以查看模型文件:
cd /usr/share/opencv4/haarcascades
ls
选择以下这个人脸识别模型:
pwd获取当前目录,创建对象实例:
CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml");
函数:CascadeClassifier::detectMultiScale()
库:objdetect
作用:从输入图像中检测出不同尺寸的对象,并返回一个矩形框框住识别目标
使用detectMultiScale()需要创建vector< Rect >类型的对象:
vector<Rect> AllFace;
在显示循环中加入:
Classifier.detectMultiScale(GrayImage,AllFace); //选中识别对象
函数:rectangle()
库:core
作用:在图像上绘制一个矩形框
注意一个rectangle()只能显示一个人脸的框框,并且为了防止没检测到脸时出错,加一个检测:
if(AllFace.size()){rectangle(GrayImage,AllFace[0],Scalar(255,255,255)); //只能显示一张图片,显示了第一个检测到的人脸
}
此时编译命令:
g++ main.cpp -o main -I/usr/include/opencv4 -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_videoio -lopencv_objdetect
结果:
2.6人脸截取及图片编码与解码
函数:imencode(函数编码)
库:imgcodecs
作用:从内存中的图像数据解码为 OpenCV 的 Mat 对象;用于处理从网络传输的图像数据或从文件中读取的图像数据
使用Mat容器就可以完成截取图像,但是发送给百度只能云平台的图片还需要格式处理(转为.jpg、.png等):
Mat MatFace;
vector<uchar> JpgFace;...if(AllFace.size()){ //防止没检测到脸时出错rectangle(GrayImage, AllFace[0], Scalar(255,255,255)); //只能显示一张图像MatFace = GrayImage(AllFace[0]); //截取图像imencode(".jpg", MatFace, JpgFace); //格式转换}
...
此时编译验证:
g++ main.cpp -o main -I/usr/include/opencv4 -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_videoio -lopencv_objdetect -lopencv_imgcodecs
3.对接百度智能云平台
3.1注册账号
百度智能云官网:百度智能云-云智一体深入产业
下拉,选择人脸搜索:
点击立即使用,登陆账号(可以使用百度其他产品账号来登陆):
再勾选协议、同意协议之后可以使用:
3.2创建人脸库
找到概览的应用数,点击数字,再点击创建应用:
给应用起名,默认已经选择人脸识别的接口,应用归属选择个人,并填写语言描述:
完成后单击立即创建:
返回应用列表之后就会看到已经创建的应用:
报表里会记录使用这个应用的情况;免费的次数:每秒提交2张识别;以下是使用说明:
可知首先需要将“公司内员工的人脸上传”,点击新建应用的【查看人脸库】,点击新建组,注意选择通用版类型,再上传人脸(尽量找正面清晰的):
完成人脸库创建:
3.3SDK环境搭建
SDK简介:SDK(Software Development Kit,软件开发工具包)是一种用于开发软件的工具集合,一般是软件工程师为特定的软件包、软件框架、硬件平台,操作系统等建立的应用于软件开发和部署的工具集合,通常包括编译器、代码库、API(应用程序编程接口)文档、示例代码等。
搭建原因:百度智能云发回来的识别结果包含各种信息,提前内容的写的代码相关繁琐,而外面可以直接使用百度写好的SDK这个库来简化处理。
在人脸识别的概况中,找到技术文档打开:
在SDK文档中的第一项里选择C++-SDK:
使用最新版本:
点击官方链接,下载C++SDK压缩包,一步步按照指示完成:
官方链接:SDK下载_文字识别SDK_语音识别SDK-百度AI开放平台
好家伙竟然已经变成C了: 点这个C HTTP SDK下载
解压下载的压缩包后,需要搬到Linux里使用(当然也可以直接在Linux的火狐浏览器下载):
依赖库libcurl(HTTP协议相关)、openssl(加密相关)、jsoncpp(提取信息)安装:
sudo apt-get install libcurl4-openssl-dev
dpkg -s libcurl4-openssl-devsudo apt-get install openssl
dpkg -s opensslsudo apt-get install libjsoncpp-dev
dpkg -s libjsoncpp-devsudo apt-get install libssl-dev //为了使用openssl/evp.h
dpkg -s libssl-dev
在写的文件中添加:
#include "face.h"
using namespace aip;
把我们写的和百度SDK的代码放在同一个文件夹里一起编译:
现在要对 base.h 和 http.h 文件中 json 头文件目录位置进行修改(根据我们安装的目录):
#include "jsoncpp/json/json.h" 或 #include <jsoncpp/json/json.h>
进入目录编译测试:
g++ main.cpp -o main -I/usr/include/opencv4 -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_videoio -lopencv_objdetect -lopencv_imgcodecs -std=c++11 -lcurl -lcrypto -ljsoncpp
此时出现一个错误:
将 long long int 类型的变量 log_id 赋值给 Json::Value 类型的 data["log_id"] 时,编译器无法确定如何将 long long int 转换为 Json::Value。以下报错详细列出了 Json::Value 各种重载的版本:
解释原因:Json::Value 的构造函数有多种重载版本,编译器无法确定使用哪一个。long long int 是一个 64 位的整数类型,但它并不是 Json::Value 的直接支持类型。Json::Value 提供了 Int64 和 UInt64 类型,但它们与 long long int 不完全匹配,上面那些都可以转换。
在 face.h 中错误的行数修改:对 log_id 赋值这一行进行修改,明确指定类型转换,以消除歧义。
保存,重新编译即可成功。
3.4百度云平台的接入
现在需要创建一个客户端然后使用百度云平台的服务。以下是百度官方的参考代码
// 设置APPID/AK/SK
std::string app_id = "你的 App ID";
std::string api_key = "你的 Api key";
std::string secret_key = "你的 Secret Key";aip::Face client(app_id, api_key, secret_key);
在上面代码中,常量APP_ID在百度云控制台中创建,常量API_KEY与SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。 在之前的代码基础上添加代码或者直接用最后一行就可以了。
回到应用列表,将以下三个对应的key复制到代码中绑定:
本次项目使用的接口是人脸搜索,按需添加对应代码(以下是百度官方提供的参考):
Json::Value result;std::string image = "取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串";std::string image_type = "BASE64";std::string group_id_list = "3,2";// 调用人脸搜索
result = client.face_search_v3(image, image_type, group_id_list, aip::json_null);// 如果有可选参数
std::map<std::string, std::string> options;
options["match_threshold"] = "70";
options["quality_control"] = "NORMAL";
options["liveness_control"] = "LOW";
options["user_id"] = "233451";
options["max_user_num"] = "3";// 带参数调用人脸搜索
result = client.face_search_v3(image, image_type, group_id_list, options);
参数规定:
image :图片信息(总数据大小应小于10M)
image_type:图片类型 BASE64(不超过2M),图片的 URL 地址,FACE_TOKEN人脸图片的唯一标识。
group_id_list:从指定的group中进行查找用逗号分隔,上限10个
这里选择转换成 BASE64 格式。在下载的SDK中的base64.h文件中,可以查看到已经给出的转换函数:
写入自己的代码:
string Base64Face; //定义转换完成的base64格式图片
Json::Value result; //获取返回结果的容器
...
//编码成base64
Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size());
//调用人脸搜索
result = client.face_search_v3(Base64Face, "BASE64", "learning", json_null);
cout << result << endl;
编译测试:如果你出现了以下结果,表示“Open API QPS 请求限制已达到”
去查看发现:原来收到限制了,可恶
解决:去个人实名认证,领取500次调用机会,抠啊。。不过也够了
运行效果:返回Json格式的结果
返回数据说明:
{"face_token": "fid", //人脸标志"user_list": [{"group_id" : "test1", //用户所属组别"user_id": "u333333", //用户的id,名"user_info": "Test User", //说明"score": 99.3 //匹配分数}] }
4.优化数据处理与分析
4.1Json数据解析
要获取的百度所给的返回数据目标是人脸所对应的人的信息,所以需要从数据中提取特定信息:
①判断是否检测到人脸
opencv所给模型不太精确,会将疑似为人脸的物体也上传。百度会进行第二次检测是否有人脸。如果返回为空则不打印信息
②判断人脸匹配得分
匹配得分很低说明只是有人脸;百度会返回得分最高的人,即使得分很低(没有这个人脸的资料库),所以结果会不准确。所以要控制得分在一定的高分(70-90)以上才返回信息。
③只返回人脸所匹配的人的名字
增加代码:
//判断是否检测到人脸(opencv所给模型不一定准确,百度会进行第二次检测是否有人脸)
if(!result["result"].isNull())
{//判断人脸匹配得分是否大于80if(result["result"]["user_list"][0]["score"].asInt() >= 80){cout<<result["result"]["user_list"][0]["user_id"]<<endl; //输出人名}
}
运行效果:
4.2记录考勤时间
利用Linux本身提供的时间获取函数
时间容器:time_t
说明:获取 (从1970.1.1 0:0:0到现在的秒数) time(NULL);
时间转换(转换为正常时间)函数:ctime()
增加代码:
time_t sec;
...
sec = time(NULL);
cout << ctime(&sec) << endl;
运行效果:
4.3显示考勤信息
记录考勤信息:运行程序时将信息定向到文本文件中
./main >> log.txt
问题:这样执行就只会将信息存在log.txt中,不再从终端窗口显示
解决:改为从摄像头窗口的人脸识别框上直接显示人名和时间
函数:putText (图像上写字)
库:core
原型:void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )
img:要写字的图像
text:要写的字
org:字在图像上的坐标
fontFace:图像的字体(具体看官方文档)
fontScale:字的大小
color:字的颜色
添加代码:
putText(GrayImage, result["result"]["user_list"][0]["user_id"].asString(), Point(0,50), FONT_HERSHEY_SIMPLEX, 1, Scalar(255,255,255));
putText(GrayImage, ctime(&sec), Point(0,100), FONT_HERSHEY_SIMPLEX, 1, Scalar(255,255,255));
运行后的文件中:
识别效果:
5.最终结果汇总
main.cpp完整代码:
#include <iostream>
#include "opencv2/opencv.hpp"
#include "face.h"using namespace std;
using namespace cv;
using namespace aip;int main(){VideoCapture cap(0, CAP_V4L2); //创建对象并打开默认摄像头cap.set(CAP_PROP_FRAME_WIDTH, 1000); //宽度 //cap.set(CAP_PROP_FRAME_HEIGHT, 960); //高度if(!cap.isOpened()){cout << "Camera opened failed." << endl;return -1;}cout << "Camera opened successfully." << endl;Mat ColorImage; //定义一个Mat类型的容器变量frame,用于存储视频帧Mat GrayImage; //存储灰度图Mat MatFace; //保存截取的人脸图像vector<Rect> AllFace; //获取识别的人脸vector<uchar> JpgFace; //保存改格式后的人脸CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml"); //加载人脸识别模型Face client("***", "***", "***"); //客户端和人脸库绑定关系string Base64Face; //定义转换完成的base64格式图片Json::Value result; //获取返回结果的容器time_t sec; //时间容器for(;;){cap >> ColorImage; //从视频流中读取下一帧并将其存储到colorImage中(采集图像)cvtColor(ColorImage, GrayImage, COLOR_BGR2GRAY); //转换灰度图equalizeHist(GrayImage, GrayImage); //均衡化灰度图 (清晰)Classifier.detectMultiScale(GrayImage, AllFace); //选中识别对象//防止没检测到脸时出错if(AllFace.size()){rectangle(GrayImage, AllFace[0], Scalar(255,255,255)); //只能显示一张图像MatFace = GrayImage(AllFace[0]); //截取图像imencode(".jpg", MatFace, JpgFace); //格式转换Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size()); //编码成base64result = client.face_search_v3(Base64Face, "BASE64", "learning", json_null); //传输到百度,获取返回结果//cout << result << endl;//判断是否检测到人脸(opencv所给模型不一定准确,百度会进行第二次检测是否有人脸)if(!result["result"].isNull()){//判断人脸匹配得分是否大于80if(result["result"]["user_list"][0]["score"].asInt() >= 80){sec = time(NULL); //获取(从1970.1.1 0:0:0到现在的秒数)cout << ctime(&sec) << endl; //输出时间信息cout << result["result"]["user_list"][0]["user_id"] << endl; //输出人名//显示考勤信息putText(GrayImage, result["result"]["user_list"][0]["user_id"].asString(), Point(0,70), FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 255, 255));putText(GrayImage,ctime(&sec), Point(0,100), FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 255, 255));}}}imshow("实时视频", GrayImage); //显示帧waitKey(40); //暂停40ms}return 0;
}
编译:
g++ main.cpp -o main -I/usr/include/opencv4 -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_videoio -lopencv_objdetect -lopencv_imgcodecs -std=c++11 -lcurl -lcrypto -ljsoncpp
运行:
./main >> log.txt
效果:
相关文章:
基于Ubuntu22.04和OpenCV4.5.4的物联网人脸识别考勤机
前言:本人已有Ubuntu22.04的相关开发环境配置,并且默认C和机器学习基础,这里直接从安装opencv开始,完整代码在最后。具体情况具体分析,请以实际为主。 视频参考:【大厂敲门砖】从0到1做一个物联网人脸识别…...
java 排序算法-快速排序
快速排序(Quick Sort)是一种高效的排序算法,它使用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 快速排序算法的基本思想: 选择基准值&…...
openEuler系统下源码编译安装Nginx实践教程
openEuler 24.03 LTS 源码编译安装Nginx实践教程 前言一、环境准备1. 系统要求2. 更新系统与基础配置二、依赖安装1. 安装编译工具链2. 安装Nginx核心依赖三、源码编译安装1. 下载Nginx源码2. 创建专用系统用户3. 配置编译参数4. 编译与安装四、服务配置与管理1. 创建Systemd服…...
helloword 1(安卓逆向工具简单利用)
题目 做法 下载,不要解压,直接拖入Exeinfo PE进行分析 文件后缀是apk,判断为安卓逆向题 拖进ApkIDE 先找主函数main函数,这题的flag直接出来了 (搜索内容不要习惯性空格之类,这样会找不出来)…...
基于ONT数据的乳腺癌BRCA1和BRCA2变异检测方法
评估 BRCA1/2 分子状态已成为乳腺癌患者治疗的标准操作。例如聚合酶抑制剂(PARPi)的开发和临床应用,PARPi 是肿瘤学家新疗法中的关键方式。已发现 PARPi 可改善携带 BRCA1/2 种系或体细胞突变的乳腺癌患者的临床结局,提高患者生存率和生活质量。因此,目前全球指南强烈建议…...
uniapp运行在app端如何使用缓存
uniapp运行在app端如何使用缓存 众所周知,uniapp可以一套代码,多端运行。但是需要注意的是,window对象以及document是浏览器特有的(所以app端无法使用localStorage等api),因此,uniapp贴心的为我们准备了getStorage…...
人工智能代理重塑数字成功:为何面向机器的营销是下一前沿
随着人工智能(AI)改变消费者与数字世界的互动方式,数字营销正迎来一场革命性变革。2025年4月14日发布的一项研究揭示了AI代理——代表用户自主研究、比较和推荐产品或服务的系统——的日益增长的影响力。该研究探讨了这些代理如何与在线内容交…...
《奇迹世界起源》:神之月晓活动介绍!
神之月晓是《奇迹世界起源》手游中的一项限时抽奖活动,为玩家提供了获取丰厚奖励的机会。活动期间,玩家可以通过充值达到指定金额获得抽奖资格,每次充值一定金额即可获得一次抽奖机会,每天有抽奖次数上限。 活动规则:…...
AI测试用例生成平台
AI测试用例生成平台 项目背景技术栈业务描述项目展示项目重难点 项目背景 针对传统接口测试用例设计高度依赖人工经验、重复工作量大、覆盖场景有限等行业痛点,基于大语言模型技术实现接口测试用例智能生成系统。 技术栈 LangChain框架GLM-4模型Prompt Engineeri…...
【web服务_负载均衡Nginx】二、Nginx 核心技术之负载均衡与反向代理
一、负载均衡与反向代理概述 在互联网应用场景中,随着用户访问量的不断增加,单台服务器往往难以满足性能和可靠性的需求。负载均衡与反向代理技术应运而生,成为保障高并发、稳定服务的关键技术。负载均衡旨在将大量的客户端请求合理分配到…...
前端基础之《Vue(6)—组件基础(2)》
接上一篇。 七、v-model深入学习 <html> <head><title>组件基础-4</title><style>.score {display: inline-block;}.score>span {display: inline-block;width: 25px;height: 25px;background: url(./assets/star.png) center center / 25p…...
计算机网络——应用层
一、HTTP报文结构 (1)请求 请求行:请求头:空行:请求体: (2)响应 状态行:响应头:空行:响应体: (3)补充说明…...
基于springBoot+vue的PC 端学习系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时,在疫…...
《软件设计师》复习笔记(11.3)——需求获取、分析、定义、验证、管理
目录 一、软件需求概述 真题示例: 二、质量功能部署(QFD) 三、需求开发流程 需求获取 需求分析 需求定义(SRS) 需求验证 真题示例: 四、需求管理 真题示例: 一、软件需求概述 软件…...
iOS Google登录
iOS Google登录 SDK下载地址在 Firebase 有下载,要下载整个SDK文件,然后拿其中的Google 登录SDK来使用 Firebase 官方文档 github 下载链接...
使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互
引言 在现代前端开发中,与后端 API 进行数据交互是一项核心任务。Axios 作为一个基于 Promise 的 HTTP 客户端,以其简洁易用、功能强大的特点,成为了前端开发者处理 API 请求的首选工具。本文将深入探讨如何使用 Axios 进行 API 请求&#x…...
使用VHDL语言实现TXT文件的读写操作
使用FPGA进行图像处理时,通常需要将TXT文件中的图像数据读出到TestBench中,并将仿真的结果写入到TXT文件中,用于确认图像处理的结果是否正确。 VHDL中TXT文件的读写操作如下所示, --------------------------------------------…...
【家政平台开发(55)】家政平台数据生命线:备份与恢复策略全解析
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
AbMol—细胞因子,你用对了么?
细胞因子是干细胞、类器官、肿瘤、免疫等研究中常用到的一类蛋白试剂,它的种类十分丰富,AbMole为大家介绍各类细胞因子及其适用的实验类型。AbMole提供高品质抑制剂、细胞因子、人源单抗、天然产物、荧光染料、多肽、抗生素。 细胞因子的定义与分类 细胞…...
【AI】实现中文文章摘要的AI模型
【AI】实现中文文章摘要的AI模型 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【AI】实现中文文章摘要的AI模型简介安装库加载模型获取 PEFT 模型测试模型简介 最近逛github查看…...
累计达2.04亿户!中国联通首次公布5G网络用户数据
快科技4月18日消息,日前中国联通公布了2025年第一季度运营数据。 中国联通表示,为更好反映本公司5G发展情况,公司将定期披露的5G套餐用户数更新为5G网络用户数,5G网络用户为当期使用过5G网络的移动用户。 数据方面,截…...
【重学Android】1.关于@Composer注解的一点知识笔记
最新因为一些原因,开始重新学习Android及kotlin编程,也觉得可以顺带记录下这个过程中的一些知识点,也可以用作日后自己查找复习。 Composable 注解在 Android 开发中的使用 Composable 是 Jetpack Compose(Android 的现代声明式…...
OAuth2AuthorizationEndpointConfigurer类介绍、应用场景和示例代码
概述 OAuth2AuthorizationEndpointConfigurer 是 Spring Security OAuth2 授权服务器模块中的一个重要配置类,用于配置 OAuth2 授权端点(/oauth2/authorize)。 核心功能 这个配置类主要负责: 处理授权码授权流程中的授权请求 处理用户同意(consent)流…...
方德桌面操作系统V5.0-G23部署Ollama+DeekSeep+OpenWebUI
一、解压并安装 Ollama 1. 解压文件 链接:ollama-linux-amd64.tgz下载地址 rootyuhua-virtualmachine:~# tar -xzvf ollama-linux-amd64.tgz bin/ollama lib/ollama/cuda_v11/ lib/ollama/cuda_v11/libggml-cuda.so lib/ollama/cuda_v11/libcublas.so.1…...
过去十年前端框架演变与技术驱动因素剖析
一、技术演进脉络(2013-2023) 2013-2015:结构化需求催生框架雏形 早期的jQuery虽然解决了跨浏览器兼容性问题(如IE8兼容性处理),但其松散的代码组织方式难以支撑复杂应用开发。Backbone.js的出现首次引入M…...
Web三漏洞学习(其三:rce漏洞)
靶场:NSSCTF 三、RCE漏洞 1、概述 在Web应用开发中会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞 所以常见的RCE漏洞函数又分为代码执行函数和系统命令执行函数…...
【人力资源管理系统】C#实现
软件项目实训报告2025版 第1部分 实训的目标与主要内容1.1 实训目标1.2 实训主要内容 第2部分 最终作品的完成情况2.1 课堂上要求的功能完成情况2.1.1 完成的功能及完成情况分析1. 建立数据库2. 登录界面3. MDI主窗体显示4. 登录日志功能5.员工列表查询功能 2.2 作业中要求的功…...
C#插件与可扩展性
外接程序为主机应用程序提供了扩展功能或服务。.net framework提供了一个编程模型,开发人员可以使用该模型来开发加载项并在其主机应用程序中激活它们。该模型通过在主机和外接程序之间构建通信管道来实现此目的。该模型是使用: System.AddIn, System.AddIn.Hosting, System.…...
【工具】gtest
在写代码的时候大家是怎么判断自己所写的程序运行有没有问题呢?可能是在程序中穿插打印数据,看比对数据是否有问题,这是传统的肉眼观察法。如果代码量并不大,数据量比较少的话是比较好用的。那在数据量庞大时,打印信息…...
力扣DAY56-59 | 热100 | 回溯:子集、电话号码的字母组合、组合总和、括号生成
前言 中等 √ 怒刷回溯,逐渐有了手感,重点就在于设计树复原状态sometimes剪枝。 子集 我的题解 全排列的基础上修改:1)每个状态(而不是size等于数组长度)都加入答案数组中。2)设置指针&…...
ChatUI vs Ant Design X 技术选型对比
引言 本文从核心功能、架构设计、易用性等维度对比分析阿里巴巴的 ChatUI 和 Ant Design 的 Ant Design X,帮助开发者选择适合的对话式 UI 开发方案。 核心功能对比 维度ChatUIAnt Design X定位聚焦对话界面(Chatbot)的轻量级解决方案全面的…...
第24周:Resnet结合DenseNet
目录 前言 一、 前期准备 1. 设置GPU 2.查看数据 二、构建模型 1.划分数据集 2.划分标签 3.编译及训练模型 三、结果可视化 四、总结 前言 🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、 前期准备 1.…...
【论文阅读20】-CNN-Attention-BiGRU-滑坡预测
这篇论文主要探讨了基于深度学习的滑坡位移预测模型,结合了MT-InSAR(多时相合成孔径雷达干涉测量)观测数据,提出了一种具有可解释性的滑坡位移预测方法。 [1] Zhou C, Ye M, Xia Z, et al. An interpretable attention-based deep…...
Linux根据 PID 进行性能分析
根据 PID 进行性能分析 当需要深入分析某个特定进程的性能问题时,Linux 提供了多种强大的工具来监控和分析进程行为。以下是针对 PID 进行性能分析的完整方法: 1. 基础监控命令 1.1 top - 实时监控指定进程 top -p PID1,PID2,PID3 # 监控多个PID交互…...
Spring MVC 初体验~~
Java EE三层架构 在Java EE开发中,系统经典的三层架构包括表现层、业务层和持久层。三层架构中,每一层各司其职。 表现层(Web层)负责接收客户端请求,并向客户端响应结果 业务层(Service层)负责…...
2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(五级)真题
青少年软件编程(Python)等级考试试卷(五级) 分数:100 题数:38 答案解析:https://blog.csdn.net/qq_33897084/article/details/147341437 一、单选题(共25题,共50分) 1. 以下哪个选…...
警惕阿里云中的yum update操作不当导致:/sbin/init被清空导致Linux无法正常启动
由于使用阿里云进行部署测试,因而会对yum update进行操作,这两天更新了systemd-239-82.0.3.4.al8.2.x86_64,但存在报错,然后进行yum history undo和清空yum cache,但出现操作Linux命令行无效。具体来说,几个…...
使用Selenium和Python实现Web抓取指南
1. 环境准备 安装Selenium库 bash 复制 pip install selenium 下载浏览器驱动(以Chrome为例) 下载对应浏览器版本的驱动: ChromeDriver: https://chromedriver.chromium.org/downloads 将驱动文件(如chromedriver.exe&…...
避免IP地址关联,多个手机设备的完美公网IP问题
在现代工作室中,手机设备的数量常常多于一个,为了方便管理和使用,通常会将这些设备连接到同一个Wi-Fi网络。这样的做法看似无害,却隐藏着一个普遍而被忽视的问题:多个手机共用同一个公网IP。这个看似技术性的细节&…...
深入浅出 MVCC:MySQL 并发背后的多版本世界
📌 一句话理解 MVCC(Multi-Version Concurrency Control): MVCC 指的是多版本并发控制,MVCC 通过为每个事务提供数据的快照版本,让读取操作无需加锁,从而实现高并发的同时,又能维持…...
鸿蒙-跨设备互通,设备互通提供跨设备的相机、扫描、图库访问能力,平板或2in1设备可以调用手机的相机、扫描、图库等功能。
跨设备互通 跨设备互通提供跨设备的相机、扫描、图库访问能力,平板或2in1设备可以调用手机的相机、扫描、图库等功能。 约束与限制 需同时满足以下条件,才能使用该功能: 设备限制 本端设备:HarmonyOS版本为HarmonyOS NEXT及以上…...
C#进阶学习(六)单向链表和双向链表,循环链表(下)循环链表
目录 📊 链表三剑客:特性全景对比表 一、循环链表节点类 二、循环链表的整体设计框架 三、循环列表中的重要方法: (1)头插法,在头结点前面插入新的节点 (2)尾插法实现插入元素…...
Spring Boot配置文件优先级全解析:如何优雅覆盖默认配置?
📚 一、为什么需要了解配置文件优先级? 想象一下,你正在玩一个游戏🎮,游戏里有默认设置,但你可以通过不同的方式修改这些设置: 游戏内置的默认设置(就像Spring Boot的默认配置&…...
【多目标进化算法】NSGA-II 算法(结合例子)
目录 一、NSGA-II 是干什么的? 二、通过一个简单例子来解释 例子:挑选手机 三、NSGA-II 解决步骤 1. 初始化种群 2. 非支配排序(Fast Non-dominated Sorting) 3. 拥挤度距离(Crowding Distance) 4. 选择 + 交叉 + 变异 5. 合并种群、排序、更新 四、最后结果(…...
【Spring Boot】把jar包导入本地系统
【Java】把jar包导入本地maven仓库 一、方法一:将 JAR 添加到项目本地的 libs/ 目录二、方法二:把 JAR 安装到本地 Maven 仓库(推荐)三、查看是否安装成功(1)直接用文件管理器/终端查看(2&#…...
钧瓷收藏防坑指南:如何科学评估与理性收藏
关注大禹智库及时接收干货报告和视频 大禹智库 第 8期〔总第462期〕2025-4-17 一、价格敏感背后的收藏心理 每次钧瓷估价速算表的更新都会引发收藏圈的热议,这反映出藏家最核心的关切:“买得值不值?” 即便对部分藏家而言价格并非首要因素…...
CrewAI Community Version(一)——初步了解以及QuickStart样例
目录 1. CrewAI简介1.1 CrewAI Crews1.2 CrewAI Flows1.3 Crews和Flows的使用情景 2. CrewAI安装2.1 安装uv2.2 安装CrewAI CLI 3. 官网QuickStart样例3.1 创建CrewAI Crews项目3.2 项目结构3.3 .env3.4 智能体角色及其任务3.4.1 agents.yaml3.4.2 tasks.yaml 3.5 crew.py3.6 m…...
Vue 3.0 Composition API 与 Vue 2.x Options API 的区别
引言 Vue 作为一款流行的 JavaScript 框架,经历了多个版本的迭代。Vue 2.x 时期,Options API 是主要的开发方式;而到了 Vue 3.0,引入了 Composition API。这两种 API 风格各有特点,理解它们的区别对于开发者来说至关重…...
江苏广电HC2910-创维代工-Hi3798cv200-2+8G-海美迪安卓7.0-强刷包
江苏广电HC2910-创维代工-Hi3798cv200-28G-海美迪安卓7.0-强刷包 说明 1、由于原机的融合网关路由不能设置,原网口无法使用,需要用usb2.0的RJ45usb网卡接入。 通过usb接口网卡联网可以实现百兆网口连接。原机usb3.0的接口可以以接入硬盘,播放…...
clickhouse数据导出导入
clickhouse数据导出导入 CSV格式导出为csv格式导入为csv格式 JSON格式导出为json格式导入为json格式 SQL格式导出为SQL CSV格式 导出为csv格式 # 不带表头 clickhouse-client -h 127.0.0.1 --database"db" --query"select * from db.test_table FORMAT CSV&qu…...