【STC32G12K128开发板】第3-9讲:手势识别(基于PAJ7620U2)

news2024/9/20 5:31:39

第3-9讲:手势识别(基于PAJ7620U2)

    1. 学习目的
  1. 了解IK-PAJ7620U2手势识别传感器模块的功能。
  2. 掌握IK-PAJ7620U2的I2C协议、操作流程,并编程实现配置IK-PAJ7620U2工作于接近检测和手势识别模式以及读取检测结果。
    1. PAJ7620手势识别模块
      1. 产品型号

IK-PAJ7620U2手势识别模块型号命名如下,其中IK是艾克姆科技的公司缩写,PAJ7620U2是该模块使用的手势识别芯片的型号。

图1:产品型号

      1. 产品描述

艾克姆科技IK-PAJ7620手势识别模块是一款采用原相科技(Pixart)公司的PAJ7620U2芯片的高性能手势识别模块。PAJ7620U2支持上移、下移、左移、右移、前进、后退,顺时针转,逆时针转、摇摆9种手势识别和接近检测。PAJ7620U2广泛应用于智能家居、机器人交互、手势玩具、体感游戏装备等。

图2:IK-PAJ7620手势识别模块

IK-PAJ7620手势识别模块通过I2C接口访问,最大通信速率为400kbps,模块通过5芯单排针将信号引出,同时,考虑到模块对不同电源系统的兼容性,模块硬件上设计了电平转换电路,供电和IO电平均兼容3.3V和5V,可直接用于3.3V电源系统和5V电源系统的单片机,这极大地方便了用户在不同的电源系统中使用该模块,而无需自己做信号转换。

  1. 规格参数

表1:IK-PAJ7620U2手势识别模块规格参数

参数

规格

工作电压

3.3V/5V。

通信接口

I2C,最大通信速率:400 kbps。

硬件接口

5芯单排针,针间距2.54mm。

识别距离

5cm~15cm。

环境光免疫力

<100k Lux。

尺寸

20.32mm×19.81mm。

重量

约16.4g。

工作温度

-20°C至+ 70°C。

  1. 模块尺寸

IK-PAJ7620U2手势识别模块尺寸如下图所示,模块对外接口为针间距为2.54mm的5芯的单排针,模块上设计了2个孔径为2mm的固定孔,以便于用户安装固定。

图3:IK-PAJ7620U2手势识别模块尺寸

  1. 模块引脚定义

IK-PAJ7620U2手势识别模块通过排针接入电源和信号,针脚信号定义如下表所示。

图4:IK-PAJ7620U2手势识别模块引脚描述

  • 注:I2C的SCL和SDA信号上已经在模块上加了上拉电阻,用户无需自己再加上拉电阻。
  1. 典型应用电路

IK-PAJ7620手势识别模块和单片机之间的典型应用电路如下图所示。

图5:IK-PAJ7620U2手势识别模块典型应用电路

    1. 软件设计
      1. 手势识别实验
  • 注:本节的实验是在“实验2-6-1:串口1数据收发实验”的基础上修改,本节对应的实验源码是:“实验3-9-1:手势识别实验(基于PAJ7620U2)”。
        1. 实验内容

通过开发板上的按键控制IK-PAJ7620手势识别模块工作于接近检测或手势识别模式,并通过串口输出检测结果。

        1. 代码编写
  1. 定义引脚

本例中,我们用P5.0和P5.1分别用于I2C的SDA和SCA信号引脚,定义如下。

代码清单:定义用于I2C通信的引脚

  1. sbit    SDA = P5^0;    //定义I2C数据信号引脚SDA    
  2. sbit    SCL = P5^1;    //定义I2C时钟信号引脚SCL  
  1. 确定PAJ7620的I2C地址

PAJ7620的7位I2C地址为0x73,对应的8位I2C读写地址分别是:

  1. I2C写地址:0xE6。
  2. I2C读地址:0xE7。

程序中定义PAJ7620的I2C地址如下。

代码清单:I2C地址

  1. #define   PAJ7620_ADDR_W   0x46     //I2C从机写地址  
  2. #define   PAJ7620_ADDR_R   0x47     //I2C从机读地址 
  1. 编写PAJ7620U2 I2C协议实现代码

PAJ7620U2 I2C协议包含“Wake-up”、“Single Write”、“Single Read”和“Burst Read”4种。

  1. 唤醒(Wake-up)

图6:Wake-up协议

Wake-up协议的代码清单如下:

代码清单:PAJ7620U2唤醒

  1. /************************************************************************************** 
  2.  * 功  能 : 唤醒PAJ7620U2:命令格式:S(起始条件) + (I2C ADDRESS + W) + P(停止条件) 
  3.  * 参  数 : 无 
  4.  * 返回值 : 无 
  5.  **************************************************************************************/   
  6. void gs_wakeup(void)  
  7. {  
  8.     I2C_Start();                   //发送起始命令,产生起始条件   
  9.     I2C_SendData(PAJ7620_ADDR_W);  //发送器件地址(写)  
  10.     I2C_Stop();                    //发送停止命令,产生停止条件  
  1. Single Write:写单个寄存器

图7:Single Write协议

Single Write协议的代码清单如下:

代码清单:写单个寄存器

  1. /************************************************************************************** 
  2.  * 功  能 : 向指定的寄存器写入一个字节数据 
  3.  * 参  数 : regAddr[in]:寄存器地址 
  4.  *        : regDat[in]:写入的数据 
  5.  * 返回值 : GS_SUCCESS:写寄存器成功,GS_ERR:写寄存器出错 
  6.  **************************************************************************************/  
  7. u8 gs_write_byte(u8 regAddr,u8 regDat)  
  8. {  
  9.     if(!I2C_Start())   return GS_ERR;              //发送起始命令,产生起始条件   
  10.     I2C_SendData(PAJ7620_ADDR_W);                  //发送器件地址(写)  
  11.     if(!I2C_RecvACK()){I2C_Stop(); return GS_ERR;} //接收ACK  
  12.     I2C_SendData(regAddr);                         //发送寄存器地址  
  13.     I2C_RecvACK();                                 //接收ACK  
  14.     I2C_SendData(regDat);                          //发送写入的数据  
  15.     I2C_RecvACK();                                 //接收ACK  
  16.     I2C_Stop();                                    //发送停止命令,产生停止条件   
  17.   
  18.     return GS_SUCCESS;  
  19. }  
  1. Single Read:读取单个寄存器的数据。

图8:Single Read协议

Single Read协议的代码清单如下:

代码清单:读单个寄存器

  1. /************************************************************************************** 
  2.  * 功  能 : 从指定寄存器读取一个字节数据 
  3.  * 参  数 : regAddr[in]:寄存器地址 
  4.  * 返回值 : 读取的数据,如果出错会进入错误处理程序 
  5.  **************************************************************************************/  
  6. u8 gs_read_byte(u8 regAddr)  
  7. {  
  8.     u8 dat;  
  9.       
  10.     if(!I2C_Start())   return GS_ERR;              //发送起始命令,产生起始条件   
  11.     I2C_SendData(PAJ7620_ADDR_W);                  //发送器件地址(写)  
  12.     if(!I2C_RecvACK()){I2C_Stop(); return GS_ERR;} //接收ACK  
  13.     I2C_SendData(regAddr);                         //发送寄存器地址  
  14.     I2C_RecvACK();                                 //接收ACK  
  15.       
  16.     I2C_Start();                                   //发送起始命令,产生起始条件  
  17.     I2C_SendData(PAJ7620_ADDR_R);                  //发送器件地址(读)  
  18.     I2C_RecvACK();                                 //接收ACK  
  19.     dat = I2C_RecvData();                          //读取一个字节数据  
  20.     I2C_SendNAK();                                 //发送NAK  
  21.     I2C_Stop();                                    //发送停止命令,产生停止条件   
  22.     return dat;  
  1. Burst Read:从给定的地址开始,连续读取数据,读取过程中,地址自动递增。

图9:Burst Read协议

Burst Read协议的代码清单如下:

代码清单:连续读取

  1. /************************************************************************************** 
  2.  * 功  能 : 从给定的起始地址开始连续读取给定长度的数据
  3.  * 参  数 : regAddr[in]:寄存器地址 
  4.  *        : *buf[out]:指向保存读出数据的缓存 
  5.  *        : len[in]:读出的数据长度(字节数) 
  6.  * 返回值 : GS_SUCCESS:操作成功,如果出错会进入错误处理程序 
  7.  **************************************************************************************/   
  8. u8 gs_read_bytes(u8 regAddr,u8 *buf,u16 len)  
  9. {  
  10.     if(!I2C_Start())   return GS_ERR;              //发送起始命令,产生起始条件   
  11.     I2C_SendData(PAJ7620_ADDR_W);                  //发送器件地址(写)  
  12.     if(!I2C_RecvACK()){I2C_Stop(); return GS_ERR;} //接收ACK  
  13.     I2C_SendData(regAddr);                         //发送寄存器地址  
  14.     I2C_RecvACK();                                 //接收ACK  
  15.           
  16.     if(!I2C_Start())   return GS_ERR;              //发送起始命令,产生起始条件  
  17.     I2C_SendData(PAJ7620_ADDR_R);                  //发送器件地址(读)  
  18.     I2C_RecvACK();                                 //接收ACK  
  19.     while(len)                                     //读取数据  
  20.     {  
  21.         if(len==1)  
  22.         {  
  23.             *(buf+1) = I2C_RecvData();  
  24.             I2C_SendNAK();  
  25.         }  
  26.         else  
  27.         {  
  28.             *buf = I2C_RecvData();  
  29.             I2C_SendACK();  
  30.         }  
  31.         buf++;  
  32.         len--;  
  33.     }  
  34.     I2C_Stop();                                   //发送停止命令,产生停止条件   
  35.     return GS_SUCCESS;                            //返回操作成功  
  1. 初始化PAJ7620

PAJ7620使用之前需要先进行初始化配置,首次上电启动后步骤如下:

  1. 写入从机ID或I2C读取命令唤醒PAJ7620。建议读取Reg_0x00,当唤醒完成时,它将返回“0x20”,以此确认唤醒成功。
  2. 写入手势识别初始配置:将数据手册提供的配置数组中的数据写入到配置寄存器。

对应的代码清单如下:

代码清单:初始化PAJ7620U2

  1. /************************************************************************************** 
  2.  * 功  能 : 初始化PAJ7620U2 
  3.  * 参  数 : 无 
  4.  * 返回值 : 无 
  5.  **************************************************************************************/  
  6. u8 paj7620u2_init(void)  
  7. {  
  8.     u8 i;  
  9.       
  10.     gs_wakeup();                   //唤醒PAJ7620U2  
  11.     delay_ms(5);                   //唤醒时间>700us  
  12.     gs_wakeup();                   //唤醒PAJ7620U2  
  13.     delay_ms(5);                   //唤醒时间>700us  
  14.     gs_write_byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);//进入BANK0寄存器区域  
  15.     if(gs_read_byte(0x00) != 0x20) //唤醒PAJ7620U2  
  16.     {  
  17.         return GS_WAKEUP_ERR;      //唤醒失败  
  18.     }  
  19.     gs_write_byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);//进入BANK0寄存器区域  
  20.     for(i=0;i<GS_INIT_ARRAY_SIZE;i++)  
  21.     {  
  22.         //写入上电初始配置  
  23.         gs_write_byte(initial_register_array[i][0],initial_register_array[i][1]);
  24.     }  
  25.     //写入初始化配置数据时会进入BANK1,这里再切换回BANK0寄存器区域  
  26.     gs_write_byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);  
  27.     return GS_SUCCESS;   
  28. }  
  1. 更改为PS(接近检测)模式、读取物体亮度和物体大小

PAJ7620更改为PS模式、进行接近检测的步骤如下:

  1. 写入接近检测配置:将数据手册提供的接近检测配置数组中的数据写入到配置寄存器。
  2. 读取Bank_0_Reg_0xB0获取物体亮度,读取Bank_0_Rg_0xB1和Bank_0_Rg_0xB2获取物体大小。

对应的代码清单如下:

代码清单:接近检测初始化

  1. /************************************************************************************** 
  2.  * 功  能 : 初始化接近检测 
  3.  * 参  数 : 无 
  4.  * 返回值 : 无 
  5.  **************************************************************************************/  
  6. void ps_init(void)  
  7. {  
  8.     u8 i;  
  9.     gs_write_byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);//进入BANK0寄存器区域  
  10.     for(i=0;i<GS_PROXIM_ARRAY_SIZE;i++)  
  11.     {  
  12.         gs_write_byte(proximity_arry[i][0],proximity_arry[i][1]);//写入接近检测初始配置  
  13.     }  
  14.     //写入初始化配置数据时会进入BANK1,这里再切换回BANK0寄存器区域  
  15.     gs_write_byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);

读取接近检测结果的代码清单如下:

代码清单:读取接近检测结果

  1. /************************************************************************************** 
  2.  * 功  能 : 读取接近检测结果 
  3.  * 参  数 : p_brightness[out]:物体亮度;p_size[out]:物体大小 
  4.  * 返回值 : GS_SUCCESS:读取成功 
  5.  **************************************************************************************/  
  6. u8 get_ps_result(u16 *p_brightness, u16 *p_size)  
  7. {  
  8.     u8 read_buf[2];  
  9.     u8 temp;  
  10.     temp = gs_read_byte(PAJ_OBJECT_BRIGHTNESS);  //读取物体亮度  
  11.       
  12.     *p_brightness = (u16)temp;  
  13.     read_buf[0] = gs_read_byte(PAJ_OBJECT_SIZE_1);//读取物体大小  
  14.     read_buf[1] = gs_read_byte(PAJ_OBJECT_SIZE_2);  
  15.     *p_size = ((u16)read_buf[1] & 0x0f)<<8 | read_buf[0];  
  16.           
  17.     return GS_SUCCESS;  
  1. 更改为GS(手势识别)模式、读取手势识别结果

PAJ7620更改为GS模式、进行手势识别的步骤如下:

  1. 写入接近检测配置:将数据手册提供的手势识别配置数组中的数据写入到配置寄存器。
  2. 根据中断引脚状态或者定时读取Bank_0_Reg_0x43/0x44以获取手势结果,I2C读取完成时手势结果寄存器将清空。

对应的代码清单如下:

代码清单:手势识别初始化

  1. /************************************************************************************** 
  2.  * 功  能 : 写入手势识别初始化配置 
  3.  * 参  数 : 无 
  4.  * 返回值 : 无 
  5.  **************************************************************************************/  
  6. void gesture_init(void)  
  7. {  
  8.     u8 i;  
  9.     gs_write_byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);//进入BANK0寄存器区域  
  10.     for(i=0; i<GS_GESTURE_ARRAY_SIZE; i++)  
  11.     {  
  12.         gs_write_byte(gesture_arry[i][0],gesture_arry[i][1]);//写入手势识别初始配置  
  13.     } 
  14.     //写入初始化配置数据时会进入BANK1,这里再切换回BANK0寄存器区域  
  15.     gs_write_byte(PAJ_REGITER_BANK_SEL,PAJ_BANK0);
  16. }

读取手势识别结果的代码清单如下:

代码清单:读取手势识别结果

  1. /*************************************************************************************** 
  2.  * 功  能 : 读取手势识别结果 
  3.  * 参  数 : 无 
  4.  * 返回值 : 手势识别结果 
  5. ***************************************************************************************/  
  6. u8 get_gesture_result(u16 *p_gesture)  
  7. {  
  8.     u8 status;  
  9.     u8 read_buf[2];  
  10.     status = gs_read_bytes(PAJ_INT_FLAG1,read_buf,2);//读取手势状态             
  11.     if(!status)  
  12.     {     
  13.         *p_gesture =  (u16)(read_buf[1]<<8) | read_buf[0];  
  14.         return GS_SUCCESS;  
  15.     }  
  16.     else return GS_GESTURE_ERR;   
  17. }  
  1. 主函数

主函数中完成相关的初始化,之后,在主循环中扫描按键状态,根据按键动作执行相应动作。并通过串口输出测量结果。

  1. 按下KEY1按键:系统进入接近检测模式,并将检测结果通过串口输出。
  2. 按下KEY2按键:如果当前正在执行接近检测,再次按动KEY2按键进入手势识别,否则,直接进入手势识别模式,当识别到有效的手势后,通过串口输出识别结果。
  3. 按下KEY3按键:停止手势识别/接近检测。

代码清单:主函数

  1. /************************************************************************** 
  2. 功能描述:主函数 
  3. 参    数:无 
  4. 返 回 值:int类型 
  5. **************************************************************************/  
  6. int main(void)  
  7. {  
  8.     u8  button_num;  
  9.     u16 gesture_result;  
  10.     u16 obj_brightness;  
  11.     u16 obj_size;  
  12.       
  13.     P2M1 &= 0x3F;   P2M0 &= 0x3F;     //设置P2.6~P2.7为准双向口(指示灯D1和D2)  
  14.     P3M1 &= 0xFE;   P3M0 &= 0xFE;     //设置P3.0为准双向口(串口1的RxD)  
  15.     P3M1 &= 0xFD;   P3M0 |= 0x02;     //设置P3.1为推挽输出(串口1的TxD)  
  16.     P3M1 &= 0x3F;   P3M0 &= 0x3F;     //设置P3.6~P3.7为准双向口(按键KEY2和KEY1)  
  17.     P0M1 &= 0x5F;   P0M0 &= 0x5F;     //设置P0.5,P0.7为准双向口(按键KEY4和KEY3)  
  18.     I2C_init();  
  19.     uart1_init();                     //串口1初始化  
  20.     EA = 1;                           //使能总中断  
  21.     delay_ms(10);                     //初始化后延时  
  22.     //初始化PAJ7620U2  
  23.     if(paj7620u2_init() != GS_SUCCESS)  
  24.     {  
  25.         while(1)  
  26.         {  
  27.             printf("PAJ7620Y2 wakeup err!\r\n"); //串口输出错误信息  
  28.             delay_ms(1000);  
  29.         }         
  30.     }  
  31.     while(1)  
  32.     {  
  33.         button_num = buttons_scan(0);          //获取开发板用户按键检测值,不支持连按  
  34.         if(button_num == BUTTON1_PRESSED)      //按键KEY1按下  
  35.         {  
  36.             ps_init();                         //初始化接近检测  
  37.             leds_off();                        //熄灭指示灯  
  38.             printf("PS test started\r\n");     //串口打印提示信息  
  39.             while(1)  
  40.             {  
  41.                 if(get_ps_result(&obj_brightness,&obj_size) == GS_SUCCESS)  
  42.                 {  
  43.                     printf("obj_brightness: %d   ",obj_brightness);  
  44.                     printf("obj_size: %d\r\n",obj_size);  
  45.                 }  
  46.                 delay_ms(80);                  //软件延时80ms  
  47.                 led_toggle(LED_1);             //翻转指示灯D1状态  
  48.                 button_num = buttons_scan(0);
  49.                 //如果案件S3按下,停止检测  
  50.                 if((button_num == BUTTON2_PRESSED) || (button_num == BUTTON3_PRESSED))break;  
  51.             }  
  52.         }  
  53.         else if(button_num == BUTTON2_PRESSED)  //按键KEY2按下  
  54.         {  
  55.             gesture_init();                     //手势识别初始化  
  56.             leds_off();                         //熄灭指示灯  
  57.             printf("Gesture test started\r\n");  
  58.             while(1)  
  59.             {  
  60.                 if(get_gesture_result(&gesture_result) == GS_SUCCESS)//获取手势识别结果  
  61.                 {  
  62.                     switch(gesture_result)  
  63.                     {  
  64.                         case GESTURE_UP:                 
  65.                             printf("Up\r\n");             break//向上  
  66.                         case GESTURE_DOWM:                     
  67.                             printf("Dowm\r\n");           break//向下  
  68.                         case GESTURE_LEFT:                          
  69.                             printf("Left\r\n");           break//向左  
  70.                         case GESTURE_RIGHT:                    
  71.                             printf("Right\r\n");          break//向右  
  72.                         case GESTURE_FORWARD:                   
  73.                             printf("Forward\r\n");        break//向前  
  74.                         case GESTURE_BACKWARD:               
  75.                             printf("Backward\r\n");       break//向后  
  76.                         case GESTURE_CLOCKWISE:             
  77.                             printf("Clockwise\r\n");      break//顺时针  
  78.                         case GESTURE_COUNT_CLOCKWISE:     
  79.                             printf("AntiClockwise\r\n");  break//逆时针  
  80.                         case GESTURE_WAVE:                   
  81.                             printf("Wave\r\n");           break//挥动  
  82.                         default:    
  83.                             break;  
  84.                     }  
  85.                 }  
  86.                 delay_ms(80);                  //软件延时80ms  
  87.                 led_toggle(LED_2);             //翻转指示灯D2状态  
  88.                 button_num = buttons_scan(0);   
  89.                 if((button_num == BUTTON1_PRESSED) || (button_num == BUTTON3_PRESSED))  
  90.                 {  
  91.                     break;                     //如果按键S3按下,停止检测  
  92.                 }  
  93.             }  
  94.         }     
  95.     }  
  96. }
        1. 硬件连接

如下图所示,将IK-PAJ7620手势识别传感器安装J22插座上。

图10:硬件连接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验3-9-1:手势识别实验(基于PAJ7620)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\GS_PAJ7620\project”目录下的工程文件“GS_PAJ7620.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“GS_PAJ7620.hex”位于工程的“…\GS_PAJ7620\Project\Object”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 电脑上打开串口调试助手,选择开发板对应的串口号,将波特率设置为9600bps。
  6. 程序运行后,分别按下KEY1~ KEY3:
  1. 按下KEY1按键:系统进入接近检测模式,用手掌靠近传感器开窗部分,串口调试助手中可以实时观察到目标物体亮度和大小数值,如下图所示。

图11:接近检测测量结果

  1. 按下KEY2按键:如果当前正在执行接近检测,再次按动KEY2按键进入手势识别,否则,直接进入手势识别模式,识别到正确的手势后,串口调试助手中会观察到手势信息,如下图所示。

图12:手势识别测试结果

  1. 按下KEY3按键:停止手势识别/接近检测。

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

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

相关文章

灰狼优化算法(GWO)的详细解读

一、引言 在优化问题中&#xff0c;我们常常需要寻找一个最优解&#xff0c;使得某个目标函数达到最小或最大值。为了高效地解决这类问题&#xff0c;研究者们从自然界中的生物行为汲取灵感&#xff0c;提出了多种群智能优化算法。灰狼优化算法&#xff08;Grey Wolf Optimize…

行为验证码的介绍

1.什么是行为验证码 行为式验证码是一种较为流行的验证码。从字面来理解&#xff0c;就是通过用户的操作行为来完成验证&#xff0c;而无需去读懂扭曲的图片文字。常见的有两种&#xff1a;拖动式与点触式。 2.行为验证码的概念 行为式验证的核心思想是利用用户的“行为特征”…

单火供电零线发生器 单火变零火线开关面板零火开关老房改造必备

创作 史新华 零线发生器套件与单火线供电套件&#xff0c;作为现代智能家居解决方案中的创新之作&#xff0c;它们犹如智能电气领域的魔术师&#xff0c;巧妙地解决了传统智能开关在单火线路环境中因无零线而难以应用的难题。这些套件&#xff0c;如同智能电气世界的桥梁&…

SQLite库笔记:命令行shell

SQLite项目提供了一个简单的命令行程序sqlite3&#xff0c;它允许用户对SQLite数据库手动输入和执行SQL语句。更多详情可参考官网&#xff08;https://www.sqlite.org/cli.html&#xff09;。 help SQLite shell命令的help信息如下&#xff1a; .auth ON|OFF Sho…

卷积神经网络 - 动机(Motivation)篇

序言 在深度学习的浩瀚星空中&#xff0c;卷积神经网络&#xff08; Convolutional Neural Networks, CNNs \text{Convolutional Neural Networks, CNNs} Convolutional Neural Networks, CNNs&#xff09;无疑是最为璀璨的一颗星&#xff0c;其诞生与崛起深刻改变了图像识别、…

线程池的优势与应用

线程池的优势与应用 1、线程池的优势2、应用场景 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、线程池的优势 资源复用&#xff1a;减少线程创建和销毁的开销&#xff0c;通过重用已存在的线程来提高效率。控制并发&#xff1a;有效管…

Solana公链

Solana 链的优势 Solana之所以能够实现高性能&#xff0c;主要是因为它采用了多种创新的技术和设计决策。下面是Solana能够达到高吞吐量、低延迟和低成本的一些关键因素&#xff1a; 1. 历史证明 (Proof of History, PoH)&#xff1a; Solana引入了一种独特的共识机制&#…

【C++题解】1022. 百钱百鸡问题

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1022. 百钱百鸡问题 类型&#xff1a;嵌套穷举 题目描述&#xff1a; 用 100 元钱买 100 只鸡&#xff0c;公鸡&#xff0c;母鸡&#xff0c;小鸡都要有。 公鸡 5 元 1 只&#x…

【Kubernetes】kubeadmu快速部署k8s集群

目录 一.组件部署 二.环境初始化 三.所有节点部署docker&#xff0c;以及指定版本的kubeadm 四.所有节点安装kubeadm&#xff0c;kubelet和kubectl 五.高可用配置 六.部署K8S集群 1.master01 节点操作 2.master02、master03节点 3.master01 节点 4.master02、master…

酒店管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;酒店管理员管理&#xff0c;房间类型管理&#xff0c;房间信息管理&#xff0c;订单信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;房间信息…

29-《夹竹桃》

夹竹桃 夹竹桃&#xff08;学名&#xff1a;Nerium indicum Mill.&#xff09;夹竹桃族夹竹桃属常绿直立大灌木&#xff0c;高可达5米&#xff0c;枝条灰绿色&#xff0c;嫩枝条具棱&#xff0c;被微毛&#xff0c;老时毛脱落。叶3-4枚轮生&#xff0c;叶面深绿&#xff0c;叶背…

Python可视化开发全面教程

Python是一种功能强大且易于学习的编程语言&#xff0c;它还提供了丰富的可视化库&#xff0c;如Matplotlib、Seaborn、Plotly和Bokeh。这些库使得数据可视化变得简单而直观。在本教程中&#xff0c;我们将介绍如何使用Python进行数据可视化&#xff0c;从基础知识到高级技巧。…

AI Agents(智能代理)教程:如何创建信息检索聊天机器人

AI 代理教程&#xff1a;如何创建信息检索聊天机器人 介绍 在本教程中&#xff0c;我们将指导您使用 AI 代理创建用于信息检索的复杂聊天机器人的过程。探索如何利用 AI 的强大功能构建能够高效地从各种来源检索数据的聊天机器人。 设置环境 我们的计划是使用 AI 代理&…

智慧教室建设方案

智慧教室建设方案摘要&#xff1a; 智慧教室发展和现状 智慧教室是教育现代化的重要体现&#xff0c;它经历了传统教学、多媒体教学、信息化教学等阶段。智慧教室利用先进的技术和理念&#xff0c;实现了教学环境的升级&#xff0c;包括本地和网络中控、远程管理、常态录播监控…

[渗透测试学习] PermX-HackTheBox

文章目录 PermX-HackTheBox信息搜集漏洞利用权限提升参考文章PermX-HackTheBox 信息搜集 nmap扫描一下端口 nmap -sC -v 10.10.11.23扫描结果如下 PORT STATE SERVICE 22/tcp open ssh | ssh-hostkey: | 256 e2:5c:5d:8c:47:3e:d8:72:f7:b4:80:03:49:86:6d:ef (ECDSA…

【系统架构设计师】二十二、嵌入式系统架构设计理论与实践③

目录 一、鸿蒙操作系统架构案例分析 1.1 鸿蒙操作系统定义 1.2 鸿蒙的层次化分析 1.2.1 内核层 1.2.2 系统服务层 1.2.3 框架层 1.2.4 应用层 1.3 鸿蒙操作系统的架构分析 1.3.1 鸿蒙操作系统架构具有4个技术特性 1.3.2 分布式架构所带来的优势 1.3.3 HarmonyOS 架构…

康耐视VisionPro GigE相机设置两种方法详细步骤

VisionPro GigE 相机设置方法一 1:关闭防火墙 2:打开 GigE Vision Configuration Tool 2.1:设置网卡巨型帧或者叫大型数据包 2.2:设置网卡 IP、掩码 2.3:设置相机 IP、掩码 VisionPro GigE 相机设置方法二 1:关闭防火墙 2:设置网卡 IP 跟掩码

每日一题~EC168 A+B+C+D

A 题意&#xff1a; 字符串 每一个字符的花费是2&#xff0c;如果ai-1 ai ,那么ai 的花费是1. 现在可以插入一个字符&#xff0c;得到最大花费。输出插入字符之后的字符串。 分析&#xff1a;只需要在相同的连续字符中间插入一个不同的字符就可以了。如果没有连续的相同字符&am…

C++基础知识:构造函数的分类和调用,有参构造和无参构造,有参构造和无参构造,三种调用方式:括号法,显示法,隐式转换法,以及相关代码演示和注意事项

1.构造函数的分类及调用: 2.两种分类方式: 按参数分为: 有参构造和无参构造 按类型分为:有参构造和无参构造 3.三种调用方式: 括号法 显示法 隐式转换法 2.调用方法代码演示 1.括号法代码演示&#xff1a; #include<iostream>using namespace std;//1.构造函数的分类和…

tensorflow2(快速入门)

版本问题 导包 import tensorflow as tf 加载数据 加载并准备 MNIST 数据集。将样本数据从整数转换为浮点数&#xff1a; mnist tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) mnist.load_data() x_train, x_test x_train / 255.0, x_test / 255.0 搭…