传感器模块编程实践(一)AS608指纹模块简介及驱动源码

news2024/10/7 4:33:13

文章目录

    • 一.概要
    • 二.AS608模块主要技术指标
    • 三.AS608模块接线说明
    • 四.AS608模块通讯协议介绍
    • 五.AS608模块指纹录入与刷指纹流程
    • 六.STM32单片机与AS608模块指纹录入与刷指纹实验
      • 1.硬件准备
      • 2.软件工程
      • 3.软件主要代码
      • 4.实验效果
    • 七.CubeMX工程源代码下载
    • 八.小结

一.概要

AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块。
AS608 指纹识别模块是一款高性能的光学指纹识别模块。芯片内置DSP 运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB 通讯接口,只需通过简单的串口、USB 按照通讯协议便可控制模块,本模块可应用于各种考勤机、保险箱柜、指纹门禁系统、指纹锁等场合。

在这里插入图片描述

二.AS608模块主要技术指标

在这里插入图片描述

三.AS608模块接线说明

在这里插入图片描述

在这里插入图片描述

AS608模块与单片机只要4根线就能连接

单片机开发板 指纹模块
3.3V-----------------------红色线
GND----------------------黑色线
PA9-----------------------白色线
PA10---------------------黄色线

四.AS608模块通讯协议介绍

串口通讯参数:57600波特率,8位数据,1位停止位,无校验。

MCU与模块通讯发送与接收模块指令和数据按照模块指令格式打包,MCU对接收到的数据包数据解析也按照模块指令格式。
模块指令格式分为三种:命令包格式、数据包格式、结束包格式。
一般指令包是由MCU发送到模块上,模块接收到指令包后,返回对应的数据包。
包长度=包长度至校验和(指令、参数或数据)的总字节数,包含校验和,但不包含包长度本身的字节数。
校验和是从包标识至校验和之间所有字节之和。
模块芯片地址在没有生成之前为缺省的 0xFFFFFFFF,一旦MCU通过指令配置了新的芯片地址,则所有的数据包都必须按照生成的地址收发,模块将拒绝地址错误的数据包,一般我们都是以默认0xFFFFFFFF为地址,不需要配置地址。

命令包格式:
在这里插入图片描述

常用命令集及功能描述
在这里插入图片描述
在这里插入图片描述

数据包格式:
在这里插入图片描述

结束包格式:
在这里插入图片描述

模块应答是将有关命令执行情况与结果上报给MCU,应答包含有参数,并可跟后续数据包。
MCU只有在收到模块的应答包后才能确认模块收包情况与指令执行情况。模块应答包中包含一个参数:确认码。确认码表示执行指令完毕的情况。

模块应答包格式:
在这里插入图片描述

确认码定义:
00H:表示指令执行完毕或OK;
01H:表示数据包接收错误;
02H:表示传感器上没有手指;
03H:表示录入指纹图像失败;
07H:表示指纹图像正常,但特征点太少(或面积太小)而生不成特征;
08H:表示指纹不匹配;
09H:表示没搜索到指纹;

我们以录入图像为例,具体收发指令协议如下:
在这里插入图片描述

五.AS608模块指纹录入与刷指纹流程

单片机与AS608模块握手成功之后,说明通讯没问题,就可以进行指纹录入与刷指纹的操作。

指纹录入操作流程

在系统里面录入指纹信息主要以下步骤:
录入图像->生成特征->快速查找图像->自动注册模板。
在这里插入图片描述
录指纹代码实现


//录指纹
void Add_FR(void)
{
	uint8_t i=0,ensure ,processnum=0;
	uint16_t ID;
	while(1)
	{
		switch (processnum)
		{
			case 0:
				i++;
				OLED_ShowCHinese(36,3,5);//请
				OLED_ShowCHinese(52,3,6);//按
				OLED_ShowCHinese(68,3,7);//手
				OLED_ShowCHinese(84,3,8);//指
				ensure=GZ_GetImage();
				if(ensure==0x00) 
				{
					ensure=GZ_GenChar(CharBuffer1);//生成特征
					if(ensure==0x00)
					{
						i=0;
						processnum=1;//跳到第二步						
					}			
				}						
				break;
			
			case 1:
				i++;
				ensure=GZ_GetImage();
				if(ensure==0x00) 
				{
					ensure=GZ_GenChar(CharBuffer2);//生成特征			
					if(ensure==0x00)
					{
						i=0;
						processnum=2;//跳到第三步
					}
				}	
				break;

			case 2:
				ensure=GZ_Match();
				if(ensure==0x00) 
				{
					processnum=3;//跳到第四步
				}
				else 
				{
					i=0;
					processnum=0;//跳回第一步		
				}
				HAL_Delay(1000);
				break;

			case 3:

				ensure=GZ_RegModel();
				if(ensure==0x00) 
				{
					processnum=4;//跳到第五步
				}else {processnum=0;}
				HAL_Delay(1000);
				break;
				
			case 4:	

		  	ID=0;
				ensure=GZ_StoreChar(CharBuffer2,ID);//储存模板
				if(ensure==0x00) 
				{			
					OLED_ShowCHinese(36,3,9);//录
					OLED_ShowCHinese(52,3,10);//入
					OLED_ShowCHinese(68,3,11);//成
					OLED_ShowCHinese(84,3,12);//功
					GZ_ValidTempleteNum(&ValidN);//读库指纹个数
					HAL_Delay(1500);//延时后清除显示	
					return ;
				}else {processnum=0;}					
				break;				
		}
		HAL_Delay(800);
		if(i==10)//超过10次没有按手指则退出
		{
			OLED_ShowCHinese(36,3,13);//录
			OLED_ShowCHinese(52,3,14);//入
			OLED_ShowCHinese(68,3,15);//超
			OLED_ShowCHinese(84,3,16);//时
			break;	
		}				
	}
}

刷指纹流程

刷指纹,就是匹配已经存进去的指纹数据,高速搜索指纹库数据进行匹配,匹配得分高,说明刷的指纹跟录入指纹一致。
录入图像->生成特征->高速搜索指纹库进行匹配。
在这里插入图片描述
刷指纹代码实现

//刷指纹
void press_FR(void)
{
	SearchResult seach;
	uint8_t ensure;
	char *str;
	OLED_ShowCHinese(36,3,17);//请
	OLED_ShowCHinese(52,3,18);//刷
	OLED_ShowCHinese(68,3,19);//指
	OLED_ShowCHinese(84,3,20);//纹
	ensure=GZ_GetImage();
	if(ensure==0x00)//获取图像成功 
	{	
		ensure=GZ_GenChar(CharBuffer1);
		if(ensure==0x00) //生成特征成功
		{		
			ensure=GZ_HighSpeedSearch(CharBuffer1,0,300,&seach);
			if(ensure==0x00)//搜索成功
			{	
          if(seach.mathscore>100)匹配得分大于100,说明匹配成功
					{
						OLED_ShowCHinese(52,6,21);//匹
						OLED_ShowCHinese(68,6,22);//配
						HAL_Delay(20000);
					}else
					{
						OLED_ShowCHinese(52,6,23);//错
						OLED_ShowCHinese(68,6,24);//误
					}

			}else
			{
						OLED_ShowCHinese(52,6,23);//错
						OLED_ShowCHinese(68,6,24);//误
			}

	  }
	}
		
}

六.STM32单片机与AS608模块指纹录入与刷指纹实验

1.硬件准备

STLINK接STM32F103C8T6开发板,STLINK接电脑USB口。

指纹模块与单片机开发板接线:
单片机开发板
3.3V-----------------------模块红色线
GND----------------------模块黑色线
PA9-----------------------模块白色线
PA10---------------------模块黄色线

在这里插入图片描述

2.软件工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述

配置系统主频
在这里插入图片描述

配置串口1,57600波特率,8位数据,1位停止位,无校验
在这里插入图片描述

串口1中断使能
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码
在这里插入图片描述
添加串口中断接收相关代码
在这里插入图片描述
空闲中断使能
在这里插入图片描述
添加应用相关代码
在这里插入图片描述

3.软件主要代码

串口数据接收相关代码

uint8_t aRxBuffer[RXBUFFERSIZE];//接收缓冲
uint8_t RX_len;//接收字节计数
void UsartReceive_IDLE(UART_HandleTypeDef *huart)//空闲中断回调函数
{
  __HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除中断

  RX_len = RXBUFFERSIZE - huart1.RxXferCount; //计算接收数据长度
  HAL_UART_AbortReceive_IT(huart); //终止接收

  HAL_UART_Receive_IT(&huart1, (uint8_t*)aRxBuffer, RXBUFFERSIZE); //接收完数据后再次打开中断接收函数
}

/**
  * @brief  Start Receive operation in interrupt mode.
  * @note   This function could be called by all HAL UART API providing reception in Interrupt mode.
  * @note   When calling this function, parameters validity is considered as already checked,
  *         i.e. Rx State, buffer address, ...
  *         UART Handle is assumed as Locked.
  * @param  huart UART handle.
  * @param  pData Pointer to data buffer (u8 or u16 data elements).
  * @param  Size  Amount of data elements (u8 or u16) to be received.
  * @retval HAL status
  */
HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  huart->pRxBuffPtr = pData;
  huart->RxXferSize = Size;
  huart->RxXferCount = Size;

  huart->ErrorCode = HAL_UART_ERROR_NONE;
  huart->RxState = HAL_UART_STATE_BUSY_RX;

  /* Process Unlocked */
  __HAL_UNLOCK(huart);

  /* Enable the UART Parity Error Interrupt */
  __HAL_UART_ENABLE_IT(huart, UART_IT_PE);

  /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
  __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);

  /* Enable the UART Data Register not empty Interrupt */
  __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
  __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);//空闲中断打开,为了方便收一帧数据,串口接收的时候空闲,说明收到完整一帧数据
  return HAL_OK;
}
  


main函数代码

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,72M主频
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();//串口1配置,PA9-> USART1_TX,PA10-> USART1_RX ,57600波特率,8位数据,1位停止位,无校验
  /* USER CODE BEGIN 2 */
	if (HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//接收中断打开,空闲中断打开
  {
   
  }
	OLED_Init();//OLED初始化
	OLED_Clear();//清屏
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		OLED_Clear();//清屏
    	OLED_ShowCHinese(18,0,0);//光
		OLED_ShowCHinese(36,0,1);//子
		OLED_ShowCHinese(54,0,2);//物
		OLED_ShowCHinese(72,0,3);//联
		OLED_ShowCHinese(90,0,4);//网
    /* USER CODE BEGIN 3 */
		while(GZ_HandShake(&AS608Addr))//与AS608模块握手
		{
			HAL_Delay(1000);//等待1秒	  
		}
		HAL_Delay(100);
		GZ_ValidTempleteNum(&ValidN);//读库指纹个数
		GZ_ReadSysPara(&AS608Para);  //读AS608模块参数 
		Add_FR();//录入指纹
		HAL_Delay(1000);
		while(1)
		{
			press_FR();//刷指纹
		}
  }
  /* USER CODE END 3 */
}

AS608配置相关

//录入图像 GZ_GetImage
//功能:探测手指,探测到后录入指纹图像存于ImageBuffer。 
//模块返回确认字
uint8_t GZ_GetImage(void)
{
  uint16_t temp;
  uint8_t  ensure;
	uint8_t  *data;
	SendHead();
	SendAddr();
	SendFlag(0x01);//命令包标识
	SendLength(0x03);
	Sendcmd(0x01);
  temp =  0x01+0x03+0x01;
	SendCheck(temp);
	data=JudgeStr(2000);
	if(data)
		ensure=data[9];
	else
		ensure=0xff;
	return ensure;
}
//生成特征 GZ_GenChar
//功能:将ImageBuffer中的原始图像生成指纹特征文件存于CharBuffer1或CharBuffer2			 
//参数:BufferID --> charBuffer1:0x01	charBuffer1:0x02												
//模块返回确认字
uint8_t GZ_GenChar(uint8_t BufferID)
{
	uint16_t temp;
  uint8_t  ensure;
	uint8_t  *data;
	SendHead();
	SendAddr();
	SendFlag(0x01);//命令包标识
	SendLength(0x04);
	Sendcmd(0x02);
	Com_SendData(BufferID);
	temp = 0x01+0x04+0x02+BufferID;
	SendCheck(temp);
	data=JudgeStr(2000);
	if(data)
		ensure=data[9];
	else
		ensure=0xff;
	return ensure;
}
//精确比对两枚指纹特征 GZ_Match
//功能:精确比对CharBuffer1 与CharBuffer2 中的特征文件 
//模块返回确认字
uint8_t GZ_Match(void)
{
	uint16_t temp;
  uint8_t  ensure;
	uint8_t  *data;
	SendHead();
	SendAddr();
	SendFlag(0x01);//命令包标识
	SendLength(0x03);
	Sendcmd(0x03);
	temp = 0x01+0x03+0x03;
	SendCheck(temp);
	data=JudgeStr(2000);
	if(data)
		ensure=data[9];
	else
		ensure=0xff;
	return ensure;
}
//搜索指纹 GZ_Search
//功能:以CharBuffer1或CharBuffer2中的特征文件搜索整个或部分指纹库.若搜索到,则返回页码。			
//参数:  BufferID @ref CharBuffer1	CharBuffer2
//说明:  模块返回确认字,页码(相配指纹模板)
uint8_t GZ_Search(uint8_t BufferID,uint16_t StartPage,uint16_t PageNum,SearchResult *p)
{
	uint16_t temp;
  uint8_t  ensure;
	uint8_t  *data;
	SendHead();
	SendAddr();
	SendFlag(0x01);//命令包标识
	SendLength(0x08);
	Sendcmd(0x04);
	Com_SendData(BufferID);
	Com_SendData(StartPage>>8);
	Com_SendData(StartPage);
	Com_SendData(PageNum>>8);
	Com_SendData(PageNum);
	temp = 0x01+0x08+0x04+BufferID
	+(StartPage>>8)+(uint8_t)StartPage
	+(PageNum>>8)+(uint8_t)PageNum;
	SendCheck(temp);
	data=JudgeStr(2000);
	if(data)
	{
		ensure = data[9];
		p->pageID   =(data[10]<<8)+data[11];
		p->mathscore=(data[12]<<8)+data[13];	
	}
	else
		ensure = 0xff;
	return ensure;	
}
//录指纹
void Add_FR(void)
{
	uint8_t i=0,ensure ,processnum=0;
	uint16_t ID;
	while(1)
	{
		switch (processnum)
		{
			case 0:
				i++;
				OLED_ShowCHinese(36,3,5);//请
				OLED_ShowCHinese(52,3,6);//按
				OLED_ShowCHinese(68,3,7);//手
				OLED_ShowCHinese(84,3,8);//指
				ensure=GZ_GetImage();
				if(ensure==0x00) 
				{
					ensure=GZ_GenChar(CharBuffer1);//生成特征
					if(ensure==0x00)
					{
						i=0;
						processnum=1;//跳到第二步						
					}			
				}						
				break;
			
			case 1:
				i++;
				ensure=GZ_GetImage();
				if(ensure==0x00) 
				{
					ensure=GZ_GenChar(CharBuffer2);//生成特征			
					if(ensure==0x00)
					{
						i=0;
						processnum=2;//跳到第三步
					}
				}	
				break;

			case 2:
				ensure=GZ_Match();
				if(ensure==0x00) 
				{
					processnum=3;//跳到第四步
				}
				else 
				{
					i=0;
					processnum=0;//跳回第一步		
				}
				HAL_Delay(1000);
				break;

			case 3:

				ensure=GZ_RegModel();
				if(ensure==0x00) 
				{
					processnum=4;//跳到第五步
				}else {processnum=0;}
				HAL_Delay(1000);
				break;
				
			case 4:	

		  	ID=0;
				ensure=GZ_StoreChar(CharBuffer2,ID);//储存模板
				if(ensure==0x00) 
				{			
					OLED_ShowCHinese(36,3,9);//录
					OLED_ShowCHinese(52,3,10);//入
					OLED_ShowCHinese(68,3,11);//成
					OLED_ShowCHinese(84,3,12);//功
					GZ_ValidTempleteNum(&ValidN);//读库指纹个数
					HAL_Delay(1500);//延时后清除显示	
					return ;
				}else {processnum=0;}					
				break;				
		}
		HAL_Delay(800);
		if(i==10)//超过10次没有按手指则退出
		{
			OLED_ShowCHinese(36,3,13);//录
			OLED_ShowCHinese(52,3,14);//入
			OLED_ShowCHinese(68,3,15);//超
			OLED_ShowCHinese(84,3,16);//时
			break;	
		}				
	}
}

//刷指纹
void press_FR(void)
{
	SearchResult seach;
	uint8_t ensure;
	char *str;
	OLED_ShowCHinese(36,3,17);//请
	OLED_ShowCHinese(52,3,18);//刷
	OLED_ShowCHinese(68,3,19);//指
	OLED_ShowCHinese(84,3,20);//纹
	ensure=GZ_GetImage();
	if(ensure==0x00)//获取图像成功 
	{	
		ensure=GZ_GenChar(CharBuffer1);
		if(ensure==0x00) //生成特征成功
		{		
			ensure=GZ_HighSpeedSearch(CharBuffer1,0,300,&seach);
			if(ensure==0x00)//搜索成功
			{	
          if(seach.mathscore>100)
					{
						OLED_ShowCHinese(52,6,21);//匹
						OLED_ShowCHinese(68,6,22);//配
						HAL_Delay(20000);
					}else
					{
						OLED_ShowCHinese(52,6,23);//错
						OLED_ShowCHinese(68,6,24);//误
					}

			}else
			{
						OLED_ShowCHinese(52,6,23);//错
						OLED_ShowCHinese(68,6,24);//误
			}
	  }
	}	
}

4.实验效果

1.会提示请按手指
在这里插入图片描述
2.手指按到指纹模块上,会提示录入成功
在这里插入图片描述

3.录入成功后,板子会提示再刷指纹
在这里插入图片描述
4.仍旧用原先的手指刷指纹,会提示匹配,用别的手指会提示匹配错误,说明指纹录入跟刷指纹都正确了
在这里插入图片描述

七.CubeMX工程源代码下载

通过网盘分享的文件:指纹识别实验(HAL库).rar
链接: https://pan.baidu.com/s/15xXp2_aj3ERzfxp3BlTF1g 提取码: b6t4

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

学会AS608指纹模块编程,可以很方便应用到实际项目中,如指纹锁,门禁系统和考勤管理,可以实现指纹解锁和打卡功能。

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

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

相关文章

打印机驱动安装教程-共享打印机修复工具-打印机扫描教程

金舟打印机驱动修复软件是驱动下载软件&#xff0c;无法解决打印机报错、打印异常、打印机无法连接等问题。 Part 1&#xff1a;打印机驱动安装教程 第一步&#xff1a;确定电脑上的打印机服务已启动 1.1右击桌面的“此电脑”然后点击“管理”。 1.2点击左侧任务栏中的“服务…

传奇GOM引擎架设好进游戏后提示请关闭非法外挂,重新登录,如何处理?

今天在架设一个GOM引擎的版本时&#xff0c;进游戏之后刚开始是弹出一个对话框&#xff0c;提示请关闭非法外挂&#xff0c;重新登录&#xff0c;我用的是绿盟登陆器&#xff0c;同时用的也是绿盟插件&#xff0c;刚开始我以为是绿盟登录器的问题&#xff0c;于是就换成原版gom…

推理攻击-Python案例

1、本文通过推理攻击的方式来估计训练集中每个类别的样本数量、某样本是否在训练集中。 2、一种简单的实现方法&#xff1a;用模型对训练数据标签进行拟合&#xff0c;拟合结果即推理为训练集中的情况。 3、了解这些案例可以帮助我们更好的保护数据隐私。 推理攻击&#xff08;…

华为最新业绩出炉!上半年营收4175亿元,同比增长34%!

华为2024年上半年经营业绩分析:稳健发展,符合预期 [中国,深圳,2024年8月29日] 今日,华为发布了其2024年上半年的经营业绩,整体表现稳健,结果符合预期。在复杂多变的全球市场环境下,华为凭借强大的创新能力和市场洞察力,实现了销售收入和净利润的显著增长。 上半年,华…

ubunut声卡配置 播放视频没有声音的解决方法 蓝牙问题

文章目录 &#x1f315;ubuntu22.04网页没有声音&#xff0c;声卡提示Dummy Output&#x1f319;方法一&#xff1a;&#xff08;亲测可行&#xff09;切换内核&#x1f319;方法二&#xff1a;&#xff08;推荐&#xff09;ubuntu22.04用pipewire替代pulseaudio⭐下载安装pipe…

Operational Concept(OpsCon)与Concept of Operations(ConOps)概念区分

Operational Concept(OpsCon)与Concept of Operations&#xff08;ConOps&#xff09;概念区分 在系统工程相关资料中会看到两个概念&#xff0c;一个是Operational Concept&#xff08;OpsCon&#xff09;&#xff0c;另一个是Concept of Operations&#xff08;ConOps&#x…

车载诊断协议DoIP系列 —— DoIP APP 应用层(AL)

车载诊断协议DoIP系列 —— DoIP APP 应用层(AL) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝…

十四、深入理解Mysql索引底层数据结构与算法

文章目录 一、索引的本质1、索引是帮助MySQL高效获取数据的排好序的数据结构2、索引的数据结构3、数据结构可视化网站 二、常见数据结构介绍1、B-Tree2、BTree&#xff08;B-Tree变种&#xff09;3、Hash结构 三、存储引擎的索引实现1、MyISAM存储引擎索引实现MyISAM索引文件和…

数理统计(第1章第2节:一些常用的抽样分布)

目录 统计量的概率分布称为“抽样分布” 1. 正态母体的子样平均数的抽样分布 正态分布 2. 卡方分布 3. t分布 4. F分布 5. 例题 6. 总结 统计量的概率分布称为“抽样分布” 1. 正态母体的子样平均数的抽样分布 正态分布 若随机变量X的概率密度为&#xff1a; 则称X服…

[C#]winform部署官方yolov11-obb旋转框检测的onnx模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov11-obb&#xff08;You Only Look Once version 8 with Oriented Bounding Boxes&#xff09;是一种先进的对象检测算法&#xff0c;它在传统的Yolov3和Yolov4基础上进行了优化&#xff0c;加…

Python 如何使用 scikit-learn 进行模型训练

如何使用 scikit-learn 进行模型训练 一、简介 在现代的数据科学和机器学习领域&#xff0c;Python 已经成为最流行的编程语言之一。而其中最流行的机器学习库之一就是 scikit-learn。scikit-learn 提供了许多方便的工具和函数来实现常见的机器学习任务&#xff0c;包括数据预…

spi hal库 正点原子版

这个图 是了解一下 spi就是cs片选&#xff0c;clk时钟&#xff0c;miso主机输入从机输出&#xff0c;mosi主机输出从机输入&#xff0c;这四根线 spi最主要就是极性和相位的选择&#xff0c;spi是边沿采集&#xff0c;和iic的电平采集不一样&#xff0c;所以需要通过极性和相位…

SpringBoot 多元化配置(正则表达式,配置文件优先级)

1.配置绑定 所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常&#xff0c;我们会把一些配置信息&#xff08;例如&#xff0c;数据库配置&#xff09;放在配置文件中&#xff0c;然后通过 Java 代码去读取该配置文件&#xff0c;并且把配置文件中…

【持续更新中】MMDetection3训练自己的数据集常见报错解决

博主近来跑自己数据集需要对比试验&#xff0c;故选择了MMDetection3这一算法整合详细的框架&#xff0c;遇到了较多问题在此处留作记录&#xff0c;若你也有相应的问题可以在评论区提出与解决方法。会持续更新&#xff0c;同时欢迎批评指正。 0.ModuleNotFoundError: No modu…

从博士到院士,国家级人才荣誉称号一览

在中国的科技界&#xff0c;两院院士代表着学术成就的巅峰荣誉&#xff0c;享有终身荣耀&#xff0c;并且是科研人员梦寐以求的最高职业荣誉。除了院士头衔之外&#xff0c;国家和各部委还设立了一系列针对不同年龄段学术人才的国家级荣誉称号体系&#xff0c;旨在表彰各类优秀…

8.9K Star,开源自托管离线翻译引擎

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 在全球化的今天&#xff0c;跨语言交流已成为日常需求&#xff0c;然…

U3D游戏开发之中剧情系统的制作

今天我们来揭秘带有人物选项的剧情系统该如何制作。 半年前我接到了一个剧情系统的需求&#xff0c;本着能抄代码绝不自己动手的想法在B站上面找现成系统&#xff0c;大概看了一些内容&#xff0c;发现比较繁琐就直接自己动手写了。 目录 1 需求分析 2 梳理代码逻辑 3 代码书…

k8s 中存储之 NFS 卷

目录 1 NFS 卷的介绍 2 NFS 卷的实践操作 2.1 部署一台 NFS 共享主机 2.2 在所有k8s节点中安装nfs-utils 2.3 部署nfs卷 2.3.1 生成 pod 清单文件 2.3.2 修改 pod 清单文件增加 实现 NFS卷 挂载的 参数 2.3.3 声明签单文件并查看是否创建成功 2.3.4 在 NFS 服务器 创建默认发布…

[c语言]一句话讲清循环中break和continue的作用与区别

1.两者的作用 break和contuinue都只能在循环中使用&#xff0c;都用来停止循环。 2.两者的区别 break 在循环中只要遇到break&#xff0c;就直接永久终止当前循环&#xff0c;开始执行当前循环之外的代码。 continue 在循环中只要遇到continue&#xff0c;就结束本次循环&…

免费送源码:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发 计算机毕业设计原创定制

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品&#xff0c;从而也带动了一系列与此相关产业&#xff0c;是人们的生活发生了翻天覆地的变化&#xff0c;而网络化的出现也在改变着人们传统的生活方式&#xff0c;包括工作&#xff0c;学习&#xff0c;社交…