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

嵌入式项目:STM32刷卡指纹智能门禁系统

 本文详细介绍基于STM32的刷卡指纹智能门禁系统。

 获取资料/指导答疑/技术交流/选题/帮助,请点链接:
https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt

1 系统功能

1.1 功能概述

        本系统由STM32硬件端(下位机)和QT管理平台(上位机)构成,两者通过WiFi无线连接,采用TCP协议通信。

硬件端:STM32及外设模块(RC522刷卡、AS608指纹、OLED显示、ESP8266 WiFi、舵机开门、蜂鸣器、LED);

管理平台:用QT实现并在电脑运行。

主要功能:系统登录、建立连接及通信、录入用户、查看用户、删除用户、刷卡开门、指纹开门、查看开门记录、管理员开门、退出登录等。

系统的管理员界面及STM32硬件端实物图如下:

1.2 主要功能

1.2.1 系统登陆

运行管理平台需要先登录,登录界面如下:

登录后进入管理员系统,界面如下:

1.2.2 连接通信

        上位机与下位机通信需要先建立连接,首先电脑要连接STM32硬件端WiFi模块发射的WiFi(wifi: hello-esp8266,密码:6个8),然后在管理员界面输入IP并点击连接,连接成功后在OLED屏上会显示在线状态,如下:

1.2.3 添加用户

在管理员界面点击“添加用户”,再输入用户信息,点击确定,然录入新卡,接着采集指纹录入(需采集2次并且一致),以上步骤无误后提示录入成功,如下:

1.2.4 查看用户

在管理员界面点击“用户列表”可查看用户,如下:

1.2.5 删除用户

在用户列表上选中某个用户,再点击“删除用户”,即可将该用户删除,如下:

1.2.6 刷卡开门

用已录入的卡去刷卡,能够开门并在OLED屏显示开门成功,如下:

1.2.7 指纹开门

用已录入的指纹去刷指纹,能够开门并在OLED屏显示开门成功,如下:

1.2.8 管理员开门

在管理员界面点击“开门”,可开门并在OLED屏显示开门成功,如下:

1.2.9 查看开门记录

在管理员界面点击“历史记录”,可查看开门记录,如下:

1.2.10 退出登陆

在管理员界面点击“退出”,可退出管理员系统,回到登陆界面,如下:

2 系统硬件

2.1 原理图

2.2 PCB

3 软件实现

3.1 STM32软件

3.1.1 主函数main

        在main函数中,主要完成系统及外设模块的初始化,还有一个重要的模块:time service的初始化以及注册3个不同间隔执行的函数,分别是0间隔(相当于while(1))、100ms间隔、1000ms的间隔执行,主体程序均可在这3个不同间隔执行的函数中运行。

Main程序如下:

int main(void)
{// 配置系统时钟72M,使用外部晶振system_clock_config();delay_init();// 调试打印串口初始化usart_init(115200);printf("\n hello stm32.\r\n");/* 硬件模块驱动初始化 */led_init();		//LED初始化beep_init();	//蜂鸣器初始化oled_init();	// OLED初始化rc522_init();	// RC522 rfid模块初始化// 指纹模块AS608初始化:usart3用于AS608usart3_init(AS608_UART_BAUDRATE, as608_data_recv);as608_init(usart3_send, as608_finger_event_cb);// wifi通信初始化wifi_proto_init();/* time service需要timer提供时钟 */timsrv_init();TIM2_init(72-1, 1000-1, timer_timeout_cb);	// 1ms 定时TIM2_start();// 注册任务,执行间隔以ms为单位timsrv_register_task(0, task_while);timsrv_register_task(100, task_100ms);timsrv_register_task(1000, task_1000ms);//舵机初始化:PWM3为舵机提供pwmpwm3_init(72-1, 20000-1);	//舵机要求:频率1MHz,周期20mspwm3_start();servo_init(20000, pwm3_set_pulse);// 显示主界面ui_show_destop();ui_show_online(false);memset(&g_sys_info, 0, sizeof(system_info_t));g_sys_info.work_mode = WORK_MODE_NORMAL;while(1){// 主任务:根据时间间隔执行注册的任务timsrv_tasks_running();}
}

3.1.2 事件处理process

事务处理主要是上述time service注册的3个不同间隔执行的函数,如下:

/* 0间隔执行,相当于while(1)执行 */
void task_while(void)
{//wifi接收数据处理wifi_data_handle();// 服务器协议处理server_proto_handle();}/* 每间隔100ms执行一次 */
void task_100ms(void)
{static uint8_t card_wait = 0;uint8_t card_id[8];int ret, i;//扫描读卡,每次读到卡间隔2Sif(card_wait == 0) {ret = rc522_read_card(card_id);if(ret == 0) {beep_on();timsrv_set_delay_work(100, beep_off);proto_0x11_sendCardnum(card_id);card_wait = 1;printf("get card: ");for(i=0; i<8; i++)printf("%02X ", card_id[i]);printf("\n");}}else{if(card_wait ++ >= 20)card_wait = 0;}//指纹模块运行处理as608_run_process();
}/* 每间隔1000ms执行一次 */
void task_1000ms(void)
{static int num = 0;printf("%s: %d\r\n", __FUNCTION__, num);num ++;
}

3.1.3 外设事件处理

外设像WiFi、指纹模块AS608等有事件回调的处理,如下:

//wifi模块事件回调处理函数
int wifi_event_cb(wifi_event_e event, int param)
{printf("wifi event: %d, param: %d\n", event, param);switch(event){case WIFI_EVE_TCP_CONNECT: 		//TCP连接g_sys_info.online = true;led_on();ui_show_online(true);break;case WIFI_EVE_TCP_DISCONNECT: 	//TCP断开g_sys_info.online = false;led_off();ui_show_online(false);break;default:break;}return 0;
}//指纹模块事件回调处理函数
int as608_finger_event_cb(as608_event_e event, int param)
{printf("as608 event: %d, param: %d\n", event, param);switch(event){case AS608_EVE_GET_FINGER:	//检测到指纹按下beep_on();timsrv_set_delay_work(100, beep_off);break;case AS608_EVE_SEARCH_FINGER:	//识别到识别proto_0x14_recognFingerId(param);break;case AS608_EVE_ADD_WAIT_FINGER:		//添加指纹:等待指纹break;case AS608_EVE_ADD_1ST_FINGER:	//添加指纹:采集第一个指纹beep_on();timsrv_set_delay_work(100, beep_off);proto_0x13_addFingerResult(1);break;case AS608_EVE_ADD_2ND_FINGER:	//添加指纹:采集第二个指纹beep_on();timsrv_set_delay_work(100, beep_off);proto_0x13_addFingerResult(2);break;case AS608_EVE_ADD_RESULT:	//添加指纹结果if(param == 0)proto_0x13_addFingerResult(0);elseproto_0x13_addFingerResult(4);break;case AS608_EVE_ADD_TIMEOUT:		//添加指纹超时proto_0x13_addFingerResult(3);break;default:break;}	return 0;
}

3.1.3 通信协议处理

        STM32需要跟上位机QT交互,因此需要通信协议,以解析通信的内容及作相关处理。例如STM32端读到卡片需发送给QT端以判断是否开门、若要开门QT端还要发送开门指纹给STM32让其执行开门动作。

STM32主动发送协议的部分代码:

int proto_0x11_sendCardnum(unsigned char *cardnum)	//发送卡号
{unsigned char data_buf[64];int data_len = 0;int pack_len = 0;data_len += proto_add_param(data_buf, ID_CARD_NUM, 8, cardnum);proto_makeup_packet(0x11, data_buf, data_len, proto_tmp_buf, sizeof(proto_tmp_buf), &pack_len);server.send(proto_tmp_buf, pack_len);return 0;
}
int proto_0x13_addFingerResult(unsigned char result)		//发送添加指纹结果
{unsigned char data_buf[64];int data_len = 0;int pack_len = 0;printf("add finger result %d\n", result);data_len += proto_add_param(data_buf, ID_ADD_FINGER_RES, 1, &result);proto_makeup_packet(0x13, data_buf, data_len, proto_tmp_buf, sizeof(proto_tmp_buf), &pack_len);server.send(proto_tmp_buf, pack_len);return 0;
}int proto_0x14_recognFingerId(int id)	//发送识别到的指纹
{unsigned char data_buf[64];int data_len = 0;int pack_len = 0;data_len += proto_add_param(data_buf, ID_FINGER_ID, 4, (unsigned char *)&id);proto_makeup_packet(0x14, data_buf, data_len, proto_tmp_buf, sizeof(proto_tmp_buf), &pack_len);server.send(proto_tmp_buf, pack_len);return 0;
}

STM32接收到协议的处理:

static int server_proto_dispatch(uint8_t *pack, int len)
{uint8_t cmd = 0;uint8_t *data = NULL;int data_len = 0;int ack_len = 0;int ret;ret = proto_packet_analy(pack, len, &cmd, &data_len, &data);if(ret != 0)return -1;printf("ptoto cmd: 0x%02x, pack_len: %d, data_len: %d\n", cmd, len, data_len);switch(cmd){case 0x03:ret = server_0x03_heartbeat(data, data_len, proto_tmp_buf, sizeof(proto_tmp_buf), &ack_len);break;case 0x10:ret = server_0x10_opendoor(data, data_len, proto_tmp_buf, sizeof(proto_tmp_buf), &ack_len);break;case 0x12:ret = server_0x12_toWorkmode(data, data_len, proto_tmp_buf, sizeof(proto_tmp_buf), &ack_len);break;case 0x15:ret = server_0x15_delete_finger(data, data_len, proto_tmp_buf, sizeof(proto_tmp_buf), &ack_len);break;default:printf("error: cmd 0x%02x not found!\r\n", cmd);break;}/* send ack data */if(ret==0 && ack_len>0){proto_makeup_packet(cmd, proto_tmp_buf, ack_len, proto_recv_buf, sizeof(proto_recv_buf), &data_len);server.send(proto_recv_buf, data_len);}return 0;
}

3.2 QT软件

3.2.1 UI界面布局

在Qt creator中布局UI界面,如下:

3.2.2 按钮槽函数处理

        按钮的槽函数是通过信号与槽机制实现的。当用户点击按钮时,按钮会发出一个 clicked() 信号,开发者可以将其连接到一个自定义的槽函数上,以处理按钮点击事件。

void MainWindow::on_connectBtn_clicked()	//点击连接
{if(ui->connectBtn->isChecked()){QString svr_ip;svr_ip = ui->serverIpEdit->text();qDebug() << "server ip" << svr_ip;client->connectToHost(svr_ip, DEFAULT_SERVER_PORT);}else{client->disconnectFromHost();}
}void MainWindow::on_addUserBtn_clicked()	//添加用户
{if(ui->addUserBtn->isChecked()){ui->userIdEdit->clear();ui->userNameEdit->clear();ui->phoneEdit->clear();ui->addUserWidget->setHidden(false);g_sys_info.work_mode = WORK_MODE_ADD_USER;g_sys_info.add_step = ADD_STEP_USERINFO;proto_0x12_toWorkmode(1, 1, 0);}else{to_destop_window();g_sys_info.work_mode = WORK_MODE_NORMAL;proto_0x12_toWorkmode(0, 0, 0);}
}void MainWindow::on_userListBtn_clicked()		//用户列表
{if(ui->userListBtn->isChecked()){set_table_view(SQL_TABLE_USER);ui->tableView->setHidden(false);}else{ui->tableView->setHidden(true);}
}void MainWindow::on_delUserBtn_clicked()		//删除用户
{user_info_t user;QString tips;int id;if(!ui->userListBtn->isChecked())return;QModelIndex cur_index = ui->tableView->currentIndex();if(cur_index.row() == -1)return;id = sqlmodel->data(sqlmodel->index(cur_index.row(), 0)).toInt();memset(&user, 0, sizeof(user_info_t));sql_user_read(id, &user);tips = QString("是否删除用户<%1>?").arg(user.name);if(QMessageBox::No == QMessageBox::question(this, "注意", tips, QMessageBox::Yes|QMessageBox::No, QMessageBox::No))return;proto_0x15_delete_finger(user.finger);sql_user_del(id);sqlmodel->select();sqlmodel->submitAll();
}void MainWindow::on_historyBtn_clicked()		//历史记录
{if(ui->historyBtn->isChecked()){set_table_view(SQL_TABLE_HISTORY);ui->tableView->setHidden(false);}else{ui->tableView->setHidden(true);}
}void MainWindow::on_openDoorBtn_clicked()	//开门
{if(!mainwindow->tcp_connect)return;proto_0x10_opendoor(1);history_info_t history;memset(&history, 0, sizeof(history_info_t));QDateTime dtime = QDateTime::currentDateTime();QString str_dtime = dtime.toString("yyyy-MM-dd hh:mm:ss");history.time = dtime.toTime_t();strncpy(history.time_str, str_dtime.toLatin1().data(), TIME_STR_LEN);strncpy(history.name, "管理员", USER_NAME_LEN);sql_history_write(&history);
}void MainWindow::on_exitBtn_clicked()	//退出
{loginDialog_init();delete this;
}

3.2.3 SQL数据库

用户数据是用SQLite数据库存储的,建立2个数据表:用户表(用户信息)、记录表(开门历史);数据库的操作就是插入添加、删除、查询等动作。

创建数据表:

static int sql_create_user_tbl(void)
{QString sql_cmd;int ret = 0;sql_mutex.lock();sql_cmd = QString("create table if not exists %1(""%2 int primary key not null,""%3 char(32),""%4 char(16), ""%5 char(32), ""%6 int);").arg(SQL_TABLE_USER).arg(SQL_COL_ID).arg(SQL_COL_NAME).arg(SQL_COL_PHONE).arg(SQL_COL_CARD).arg(SQL_COL_FINGER);qDebug() << sql_cmd;if(!sqlquery->exec(sql_cmd)){qDebug() << "sql exec failed!" ;ret = -1;}sql_mutex.unlock();return ret;
}int sql_create_history_tbl(void)
{QString sql_cmd;int ret = 0;sql_mutex.lock();sql_cmd = QString("create table if not exists %1(""%2 int primary key not null,""%3 char(32),""%4 int, ""%5 char(32), ""%6 char(32), ""%7 int);").arg(SQL_TABLE_HISTORY).arg(SQL_COL_TIME).arg(SQL_COL_TIME_STR).arg(SQL_COL_ID).arg(SQL_COL_NAME).arg(SQL_COL_CARD).arg(SQL_COL_FINGER);qDebug() << sql_cmd;if(!sqlquery->exec(sql_cmd)){qDebug() << "sql exec failed!" ;ret = -1;}sql_mutex.unlock();return ret;
}添加、删除、读取:
int sql_user_add(user_info_t *user)
{QString sql_cmd;int ret = 0;sql_mutex.lock();sql_cmd = QString("insert into %1(%2,%3,%4,%5,%6) ""values(%7,'%8','%9','%10',%11);").arg(SQL_TABLE_USER).arg(SQL_COL_ID).arg(SQL_COL_NAME).arg(SQL_COL_PHONE).arg(SQL_COL_CARD).arg(SQL_COL_FINGER).arg(user->id).arg(user->name).arg(user->phone).arg(user->card).arg(user->finger);qDebug() << sql_cmd;if(!sqlquery->exec(sql_cmd)){qDebug() << "sql exec failed!" ;ret = -1;}sql_mutex.unlock();return ret;
}int sql_user_del(int id)
{QString sql_cmd;int ret = 0;sql_mutex.lock();sql_cmd = QString("delete from %1 where %2=%3;").arg(SQL_TABLE_USER).arg(SQL_COL_ID).arg(id);qDebug() << sql_cmd;if(!sqlquery->exec(sql_cmd)){qDebug() << "sql exec failed!" ;ret = -1;}sql_mutex.unlock();return ret;
}int sql_user_read(int id, user_info_t *user)
{QString sql_cmd;int ret = -1;sql_mutex.lock();sql_cmd = QString("select * from %1 where %2=%3;").arg(SQL_TABLE_USER).arg(SQL_COL_ID).arg(id);qDebug() << sql_cmd;if(!sqlquery->exec(sql_cmd)){qDebug() << "sql exec failed!" ;sql_mutex.unlock();return -1;}if(sqlquery->next()){user->id = sqlquery->value(0).toInt();strcpy(user->name, (char *)sqlquery->value(1).toString().toLocal8Bit().data());strcpy(user->phone, (char *)sqlquery->value(2).toString().toLocal8Bit().data());strcpy(user->card, (char *)sqlquery->value(3).toString().toLocal8Bit().data());user->finger = sqlquery->value(4).toInt();ret = 0;}sql_mutex.unlock();return ret;
}

获取资料/指导答疑/技术交流/选题/帮助,请点链接:
https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt

如有任何问题,请联系作者,谢谢!
- - - 曾哥,专注嵌入式。

相关文章:

嵌入式项目:STM32刷卡指纹智能门禁系统

本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助&#xff0c;请点链接&#xff1a; https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端&#xff08;下位机&#xff09;…...

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…...

鸿蒙5.0实战案例:基于measure实现的文本测量

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…...

C#中级教程(2)——走进 C# 面向对象编程:从基础到进阶的深度探索

一、为什么选择面向对象编程 在软件开发的演进过程中&#xff0c;随着程序规模和复杂度的不断增加&#xff0c;传统的编程方式逐渐暴露出局限性。面向对象编程应运而生&#xff0c;它就像是一位智慧的组织者&#xff0c;将程序中的功能进行模块化划分。每个模块各司其职&#x…...

基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“流浪动物救助系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…...

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…...

Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式

Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序&#xff1a; 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…...

应用层的协议-http/https的状态码

1xx&#xff1a;表示临时响应&#xff0c;需要操作者继续操作 2xx&#xff1a;成功&#xff0c;操作被成功接受并处理 3xx&#xff1a;一般是重定向问题 4xx&#xff1a;客户端的问题 5xx&#xff1a;服务端的问题 1xx&#xff1a; 100: 表示服务器收到客户端的第一部分请…...

前端Sass面试题及参考答案

目录 什么是 Sass? Sass 和 CSS 的主要区别是什么? Sass 中如何处理列表? Sass 中如何处理映射(map)? Sass 中如何使用函数? Sass 中如何使用内置函数? Sass 中如何设置默认值? Sass 中的 @function 和 @mixin 有什么区别? Sass 中如何实现模块化? Sass 中…...

python采集京东商品详情API接口系列,json数据示例返回

在Python中采集京东商品详情API接口的数据&#xff0c;你需要与京东开放平台&#xff08;现已更名为京东联盟开放平台&#xff09;进行交互。京东开放平台提供了多种API接口&#xff0c;用于访问京东的商品数据、用户数据等。然而&#xff0c;需要注意的是&#xff0c;京东对于…...

RT-Thread+STM32L475VET6——USB鼠标模拟

文章目录 前言一、板载资源二、具体步骤1.配置icm20608传感器2.打开CubeMX进行USB配置3. 配置USB3.1 打开USB驱动3.2 声明USB3.3 剪切stm32xxxx_hal_msp.c中的void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)函数至board.c3.…...

计算机毕业设计SpringBoot+Vue.js母婴商城(源码+LW文档+PPT+讲解+开题报告)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Teigha(ODA<Open Design Alliance>_开放设计联盟)——cad c# 二次开发

需将dll库文件与exe文件放同一路径下&#xff0c;运行exe即可执行。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Thread…...

Java 中 HTTP 协议版本使用情况剖析

Java 中 HTTP 协议版本使用情况剖析 一、HTTP/1.1 与 HTTP/2 概述 (一)HTTP/1.1 HTTP/1.1 是广泛应用且成熟的 HTTP 协议版本,它在互联网发展历程中扮演了重要角色。其特点主要包括: 连接方式:默认采用短连接,即每次请求都要建立新的 TCP 连接,请求完成后断开。不过也…...

Zama fhEVM应用:摩根大通旗下 Kinexys 发布概念验证

1. 引言 Zama 全同态加密 (FHE) 技术在摩根大通的 Kinexys&#xff08;以前称为 Onyx&#xff09;中成功进行了概念验证。该概念验证是“EPIC 项目&#xff1a;通过链上企业隐私、身份和可组合性推动代币化金融”的一部分&#xff0c;在 Kinexys 数字资产沙盒&#xff08;以前…...

idea 部署 AJ-Report 启动的注意事项

AJ-Report 入门参考&#xff1a; AJ-Report 初学(入门教程) gitee 下载&#xff1a;https://gitee.com/anji-plus/report/releases 根据上面提供的 gitee 下载链接&#xff0c;点击直接下载 最上面的就是最新版本的&#xff0c;旧版本往下拉就可以找到&#xff0c;有三个下载…...

智能化客户行为轨迹分析:AI视频监控在大型商场的技术方案

项目背景&#xff1a;为了提升顾客体验并支持精准营销&#xff0c;卖场或商场需要通过智能化手段分析客户在商场内的行为路线。 一、具体需求 1、行为路径分析&#xff1a;跟踪顾客在商场内的移动轨迹&#xff0c;了解顾客的购物习惯和偏好。 2、高频活动区域识别&#xff1a…...

解决升级flutter 3.29.0 Gradle8.7后报错 Exception has occurred. MissingPluginException

Flutter 升级后 MissingPluginException 及 Proguard 混淆问题解决方案 问题描述 在将 Flutter 从 3.24.5 升级到 3.29&#xff0c;以及 Gradle 升级到 8.7.0 之后&#xff0c;原生自己写的Flutter 插件在运行时出现以下错误&#xff1a; Exception has occurred. MissingPl…...

安全见闻4

今天学了Windows操作系统和驱动程序的相关知识 Windows注册表 注册表是windows系统中具有层次结构的核心数据库 储存的数据对windows 和Windows上运行的应用程序和服务至关重要。注册表时帮助windows控制硬件、软件、用户环境和windows界面的一套数据文件。 打开注册表编辑器…...

Denoising Diffusion Restoration Models论文解读

论文要点 恢复的线性逆问题可以使用预训练的DDPM完成&#xff1a;1. 将降质矩阵使用SVD&#xff0c;得到分解矩阵&#xff1b;2. 使用分解矩阵将图像投影到降质类型间共享的谱空间&#xff1b;3. 谱空间中执行DDPM。 评价 同Track的方法同样很多&#xff0c;比如后续的DDNM、…...

基于SpringBoot的校园消费点评管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

vue 修改el-tree高亮样式

vue 修改el-tree高亮样式 ::v-deep .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content, ::v-deep .el-tree-node > .el-tree-node__content:hover {background-color: #eff8ee !important;color: #009764; }...

【NLP 38、激活函数 ④ GELU激活函数】

别盲目&#xff0c;别着急&#xff0c;慢慢走&#xff0c;没事的 —— 25.2.24 一、定义与数学表达式 GELU&#xff08;Gaussian Error Linear Unit&#xff0c;高斯误差线性单元&#xff09;是一种结合概率分布的非线性激活函数&#xff0c;其核心思想是通过输入值服从标准正…...

QT:paintEvent、QPainter、QPaintDevice

paintEvent 介绍 在 Qt 编程中&#xff0c;paintEvent 是 QWidget 类中的一个非常重要的虚函数&#xff0c;用于处理绘图事件。当一个 QWidget 或其派生类的实例需要进行重绘操作时&#xff0c;Qt 会自动调用该控件的 paintEvent 函数。 触发时机 窗口首次显示&#xff1a;当…...

OpenHarmony-4.基于dayu800 GPIO 实践(2)

基于dayu800 GPIO 进行开发 1.DAYU800开发板硬件接口 LicheePi 4A 板载 2x10pin 插针&#xff0c;其中有 16 个原生 IO&#xff0c;包括 6 个普通 IO&#xff0c;3 对串口&#xff0c;一个 SPI。TH1520 SOC 具有4个GPIO bank&#xff0c;每个bank最大有32个IO&#xff1a;  …...

HTML项目一键打包工具:HTML2EXE 最新版

HTML2EXE 工具可以一键打包生成EXE可执行文件。可以打包任意HTML项目或者是一个网址为单个EXE文件&#xff0c;直接打开即可运行。支持KRPano全景VR项目、WebGL游戏项目、视频播放、,课件打包、网址打包等。 下载地址&#xff1a; 最新版HTML2EXE首次发布下载地址 一、功能特点…...

BGP配置华为——路径优选验证

实验拓扑 实验要求 实现通过修改AS-Path属性来影响路径选择实现通过修改Local_Preference属性来影响路径选择实现通过修改MED属性来影响路径选择实现通过修改preferred-value属性来影响路径选择 实验配置与效果 1.改名与IP配置 2.as300配置OSPF R3已经学到R2和R4的路由 3.…...

深度学习基础--ResNet网络的讲解,ResNet50的复现(pytorch)以及用复现的ResNet50做鸟类图像分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;这篇文章是本人学习ResNet的学习笔记&#xff0c;并且用pytorch复现了ResNet50&…...

TMDS视频编解码算法

因为使用的是DDR进行传输&#xff0c;即双倍频率采样&#xff0c;故时钟只用是并行数据数据的5倍&#xff0c;而不是10倍。 TMDS算法流程&#xff1a; 视频编码TMDS算法流程实现&#xff1a; timescale 1 ps / 1ps //DVI编码通常用于视频传输&#xff0c;将并行数据转换为适合…...

深度解析SmartGBD助力Android音视频数据接入GB28181平台

在当今数字化时代&#xff0c;视频监控与音视频通信技术在各行各业的应用愈发广泛。GB28181协议作为中国国家标准&#xff0c;为视频监控设备的互联互通提供了规范&#xff0c;但在实际应用中&#xff0c;许多Android终端设备并不具备国标音视频能力&#xff0c;这限制了其在相…...