STM32模拟IIC+颜色识别TCS34725

2024-02-09 04:59

本文主要是介绍STM32模拟IIC+颜色识别TCS34725,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32模拟IIC+颜色识别TCS34725

一、硬件参数

1.参数及接口

VCC3.3/5V 电源正
GND电源地
SDAI2C 数据输入
SCLI2C 时钟输入

二、通信协议

1.IIC时序图

[Alt]
从I2C时序图的得知使用的是 I2C 通信,I2C 通信,一条数据线,一条时钟线。 I2C 总线在传送数据
过程中共有三种类型信号:开始信号、结束信号和应答信号。

开始信号:SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。

结束信号:SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低
电平脉冲,表示已收到数据。

2.读写时序

在这里插入图片描述
这是一个标准的IIC通信时序

1、写命令寄存器时序:开始信号—写7位IIC地址—写1位读写标识—等待从机ACK—写命令寄存器地址—等待从机ACK—写数据—等待从机ACK–……–停止信号。

2、读命令寄存器时序:开始信号—写7位IIC地址—写1位读写标识—等待从机ACK—写命令寄存器地址—等待从机ACK—开始信号—写7位IIC地址—写1位读写标识—等待从机ACK—等待从机数据—写应答ACK—等待从机数据—写应答ACK–……–停止信号。

链接:https://www.waveshare.net/w/upload/3/3c/TCS34725_Color_Sensro_user_manual_cn.pdf

微雪电子的用户手册都有详细说明,里面也有驱动例程。

三、模拟IIC驱动

了解IIC的通信后,就可以着手写IIC的驱动的程序了,我也搜了一些网上其他的一些模拟IIC的通信,程序都大同小异,基本上都差不多。但有些毕竟具体的细节的和一些IO口设置并不是很明确。所以IIC的驱动程序我也就不详细说了(程序在下面也会附上),主要重点说一些我自己总节的一些细节。

1、IO口的配置

在这里插入图片描述

我看的网上的文章基本大部分用的都是推挽输出,然后用GPIO的内部寄存器(如上图)去调换IO的输入输出模式。这样确实是可行的,但对于刚刚学习的小白,去理解寄存器操作可以并不是很明白,并且这种是适用不了51这种单片机的。51单片机的IO是作为标准双向IO口,也就是既可以做输出,也可以做输入,同理开漏输出模式也是双向IO口,所以我个人觉得这里把IO引脚设为开漏输出模式更方便实用。

在这里插入图片描述
我这里用的是单片机STMF030RCT6的PC4和PCB口,我是用MXCube直接配置的开漏浮空,也可以用代码直接实现在程序运行前初始化GPIO口就行。

  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;  //开漏输出GPIO_InitStruct.Pull = GPIO_NOPULL;		   //浮空GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct是一个结构体,名字是GPIO_InitStructure,结构体原型由GPIO_InitTypeDef 确定,STM32里面初始化GPIO用的。

HAL_GPIO_Init(GPIOC, &GPIO_InitStructure),括号里后面那个就是你问题里面声明的那个结构体,这个函数是HAL库已经帮我们封装好的函数。

2、us延时

IIC的延时都是微秒级而且是要求精确的,一般STM的系统延时都是毫秒级的,明显是无法使用的,所以这里得用定时器。我这里用的是定时器14。
在这里插入图片描述

使用定时器就得了解单片机的时钟频率和定时器的预分频系数,STMF030RCT6单片机是时钟频率是48MHz,我要得到1us的计时也就是要得到1MHz的频率,也就是要分频48-1,预分频系数就是47,自动重装载值为1,向上计数模式。

同样可以用代码实现

static void MX_TIM14_Init(void)
{/* USER CODE BEGIN TIM14_Init 0 *//* USER CODE END TIM14_Init 0 *//* USER CODE BEGIN TIM14_Init 1 *//* USER CODE END TIM14_Init 1 */htim14.Instance = TIM14;htim14.Init.Prescaler = 47;htim14.Init.CounterMode = TIM_COUNTERMODE_UP;htim14.Init.Period = 65535;htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim14) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM14_Init 2 *//* USER CODE END TIM14_Init 2 */}HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

定时器开启之后,就要编写延时函数

extern TIM_HandleTypeDef htim14;
void delay_s(uint32_t i)
{uint16_t differ = 0xffff- i - 5;//65535-5-i,计数初值,由这个数计数到65535刚好计数us次,//也就实现了n us延时__HAL_TIM_SET_COUNTER(&htim14, differ);	//设置计数值HAL_TIM_Base_Start(&htim14);	//开启定时器while(differ < 0xffff-6){differ = __HAL_TIM_GET_COUNTER(&htim14); //获取当前计数值}HAL_TIM_Base_Stop(&htim14);//停止定时器
}

这样我们就得到一个微秒级的延时函数。

3、IIC驱动程序

这里我用的是rt-thread系统,rt_pin_read是rt-thread系统对HAL_GPIO_ReadPin的进一步封装,两者用法相同。同样rt_pin_write也是一样的。

PC4就是CLK,PC5就是SDA。
这里我就不细讲了,直接把程序附上。

#define TCS_SDA_READ   rt_pin_read(SDA) //读取SDA#define TCS_SCL_H     rt_pin_write(SCK, PIN_HIGH) //时钟线置高
#define TCS_SCL_L     rt_pin_write(SCK, PIN_LOW)  //时钟线置低
#define TCS_SDA_H     rt_pin_write(SDA, PIN_HIGH) //数据线置高
#define TCS_SDA_L     rt_pin_write(SDA, PIN_LOW) //数据线置低void TCS34725_I2C_Start()
{TCS_SDA_H;TCS_SCL_H;delay_s(40);//delay_us(4);TCS_SDA_L;delay_s(40);//delay_us(4);TCS_SCL_L;
}
/*********************************************/
void TCS34725_I2C_Stop()
{//TCS_SDA_OUT();TCS_SCL_L;TCS_SDA_L;delay_s(40);//delay_us(4);TCS_SCL_H;TCS_SDA_H;delay_s(40);//delay_us(4);
}
/*********************************************/
//返回值:1,接收应答失败
//        0,接收应答成功
uint8_t TCS34725_I2C_Wait_ACK()
{uint32_t t=0;TCS_SDA_H;delay_s(10);//delay_us(1);TCS_SCL_H;delay_s(10);//delay_us(1);while(TCS_SDA_READ){t++;if(t > 250){TCS34725_I2C_Stop();return 1;}}TCS_SCL_L;return 0;
}
/*********************************************/
//产生ACK应答
void TCS34725_I2C_ACK()
{TCS_SCL_L;TCS_SDA_L;delay_s(20);//delay_us(2);TCS_SCL_H;delay_s(20);//delay_us(2);TCS_SCL_L;
}
/*********************************************/
//不产生ACK应答
void TCS34725_I2C_NACK()
{TCS_SCL_L;TCS_SDA_H;delay_s(20);//delay_us(2);TCS_SCL_H;delay_s(20);//delay_us(2);TCS_SCL_L;
}
/*********************************************/
//I2C发送一个字节
void TCS34725_I2C_Send_Byte(uint8_t byte)
{uint8_t i;TCS_SCL_L;//拉低时钟开始数据传输for(i = 0; i < 8; i++){if(((byte&0x80)>>7)==1)TCS_SDA_H;elseTCS_SDA_L;byte <<= 1;delay_s(20);//delay_us(2);TCS_SCL_H;delay_s(20);//delay_us(2);TCS_SCL_L;delay_s(20);//delay_us(2);}
}
/*********************************************/
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t TCS34725_I2C_Read_Byte(uint8_t ack)
{uint8_t i,receive = 0;//TCS_SDA_IN();for(i = 0; i < 8; i++){TCS_SCL_L;delay_s(20);//delay_us(2);TCS_SCL_H;receive <<= 1;if(TCS_SDA_READ) receive++;delay_s(10);//delay_us(1);}if (!ack) TCS34725_I2C_NACK();//发送nACKelse TCS34725_I2C_ACK(); //发送ACKreturn receive;
}

四、TCS34725驱动程序

这里我们就要查TCS34725的数据手册了

https://www.alldatasheetcn.com/datasheet-pdf/pdf/894928/AMSCO/TCS34725.html

我们知道 一般IIC 的从机地址是 8 bit ,前 7 bit 是器件地址,最后 1 bit 代表是读操作(1)还是写操作(0),但从手册提供的时序可以看出TCS34725是7位地址,所以我们需要将地址左移一位。查手册可知TCS34725的地址是0x29。所以有:

写地址:0x29<<1

读地址:(0x29<<1)|0x01

在这里插入图片描述
手册里面有告诉我们发送命令最高位必须为1,若要寻址,此 bit 必须置 1 ,也就是说我们在发送需要操作的寄存器地址时,必需要将 MSB 置为 1 。所以:

通常命令寄存器的头部为:0x80

寄存器地址应该是:0x80|Address

知道了这些我们就可以开始编写代码了。

#define TCS34725_ADDRESS          (0x29)#define TCS34725_COMMAND_BIT      (0x80)#define TCS34725_ENABLE           (0x00)
#define TCS34725_ENABLE_AIEN      (0x10)    /* RGBC Interrupt Enable */
#define TCS34725_ENABLE_WEN       (0x08)    /* Wait enable - Writing 1 activates the wait timer */
#define TCS34725_ENABLE_AEN       (0x02)    /* RGBC Enable - Writing 1 actives the ADC, 0 disables it */
#define TCS34725_ENABLE_PON       (0x01)    /* Power on - Writing 1 activates the internal oscillator, 0 disables it */
#define TCS34725_ATIME            (0x01)    /* Integration time */
#define TCS34725_WTIME            (0x03)    /* Wait time (if TCS34725_ENABLE_WEN is asserted) */
#define TCS34725_WTIME_2_4MS      (0xFF)    /* WLONG0 = 2.4ms   WLONG1 = 0.029s */
#define TCS34725_WTIME_204MS      (0xAB)    /* WLONG0 = 204ms   WLONG1 = 2.45s  */
#define TCS34725_WTIME_614MS      (0x00)    /* WLONG0 = 614ms   WLONG1 = 7.4s   */
#define TCS34725_AILTL            (0x04)    /* Clear channel lower interrupt threshold */
#define TCS34725_AILTH            (0x05)
#define TCS34725_AIHTL            (0x06)    /* Clear channel upper interrupt threshold */
#define TCS34725_AIHTH            (0x07)
#define TCS34725_PERS             (0x0C)    /* Persistence register - basic SW filtering mechanism for interrupts */
#define TCS34725_PERS_NONE        (0b0000)  /* Every RGBC cycle generates an interrupt                                */
#define TCS34725_PERS_1_CYCLE     (0b0001)  /* 1 clean channel value outside threshold range generates an interrupt   */
#define TCS34725_PERS_2_CYCLE     (0b0010)  /* 2 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_3_CYCLE     (0b0011)  /* 3 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_5_CYCLE     (0b0100)  /* 5 clean channel values outside threshold range generates an interrupt  */
#define TCS34725_PERS_10_CYCLE    (0b0101)  /* 10 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_15_CYCLE    (0b0110)  /* 15 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_20_CYCLE    (0b0111)  /* 20 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_25_CYCLE    (0b1000)  /* 25 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_30_CYCLE    (0b1001)  /* 30 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_35_CYCLE    (0b1010)  /* 35 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_40_CYCLE    (0b1011)  /* 40 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_45_CYCLE    (0b1100)  /* 45 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_50_CYCLE    (0b1101)  /* 50 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_55_CYCLE    (0b1110)  /* 55 clean channel values outside threshold range generates an interrupt */
#define TCS34725_PERS_60_CYCLE    (0b1111)  /* 60 clean channel values outside threshold range generates an interrupt */
#define TCS34725_CONFIG           (0x0D)
#define TCS34725_CONFIG_WLONG     (0x02)    /* Choose between short and long (12x) wait times via TCS34725_WTIME */
#define TCS34725_CONTROL          (0x0F)    /* Set the gain level for the sensor */
#define TCS34725_ID               (0x12)    /* 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727 */
#define TCS34725_STATUS           (0x13)
#define TCS34725_STATUS_AINT      (0x10)    /* RGBC Clean channel interrupt */
#define TCS34725_STATUS_AVALID    (0x01)    /* Indicates that the RGBC channels have completed an integration cycle */
#define TCS34725_CDATAL           (0x14)    /* Clear channel data */
#define TCS34725_CDATAH           (0x15)
#define TCS34725_RDATAL           (0x16)    /* Red channel data */
#define TCS34725_RDATAH           (0x17)
#define TCS34725_GDATAL           (0x18)    /* Green channel data */
#define TCS34725_GDATAH           (0x19)
#define TCS34725_BDATAL           (0x1A)    /* Blue channel data */
#define TCS34725_BDATAH           (0x1B)#define TCS34725_INTEGRATIONTIME_2_4MS   0xFF   /**<  2.4ms - 1 cycle    - Max Count: 1024  */
#define TCS34725_INTEGRATIONTIME_24MS    0xF6   /**<  24ms  - 10 cycles  - Max Count: 10240 */
#define TCS34725_INTEGRATIONTIME_50MS    0xEB   /**<  50ms  - 20 cycles  - Max Count: 20480 */
#define TCS34725_INTEGRATIONTIME_101MS   0xD5   /**<  101ms - 42 cycles  - Max Count: 43008 */
#define TCS34725_INTEGRATIONTIME_154MS   0xC0   /**<  154ms - 64 cycles  - Max Count: 65535 */
#define TCS34725_INTEGRATIONTIME_240MS   0x9C   /**<  240ms - 100 cycles - Max Count: 65535 */
#define TCS34725_INTEGRATIONTIME_700MS   0x00   /**<  700ms - 256 cycles - Max Count: 65535 */#define TCS34725_GAIN_1X                 0x00   /**<  No gain  */
#define TCS34725_GAIN_4X                 0x01   /**<  4x gain  */
#define TCS34725_GAIN_16X                0x02   /**<  16x gain */
#define TCS34725_GAIN_60X                0x03   /**<  60x gain */#define max3v(v1, v2, v3)   ((v1)<(v2)? ((v2)<(v3)?(v3):(v2)):((v1)<(v3)?(v3):(v1)))
#define min3v(v1, v2, v3)   ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1)>(v3)?(v3):(v1)))//.h文件声明的两个结构体
typedef struct{unsigned short  c;      //[0-65536]unsigned short  r;unsigned short  g;unsigned short  b;
}COLOR_RGBC;//RGBC/******************************************************************************** @brief Writes data to a slave device.** @param slaveAddress - Adress of the slave device.* @param dataBuffer - Pointer to a buffer storing the transmission data.* @param bytesNumber - Number of bytes to write.* @param stopBit - Stop condition control.*                  Example: 0 - A stop condition will not be sent;*                           1 - A stop condition will be sent.
*******************************************************************************/
void TCS34725_I2C_Write(uint8_t slaveAddress, uint8_t* dataBuffer,uint8_t bytesNumber, uint8_t stopBit)
{uint8_t i = 0;TCS34725_I2C_Start();TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x00);	   //发送从机地址写命令TCS34725_I2C_Wait_ACK();for(i = 0; i < bytesNumber; i++){TCS34725_I2C_Send_Byte(*(dataBuffer + i));TCS34725_I2C_Wait_ACK();}if(stopBit == 1) TCS34725_I2C_Stop();
}
/******************************************************************************** @brief Reads data from a slave device.** @param slaveAddress - Adress of the slave device.* @param dataBuffer - Pointer to a buffer that will store the received data.* @param bytesNumber - Number of bytes to read.* @param stopBit - Stop condition control.*                  Example: 0 - A stop condition will not be sent;*                           1 - A stop condition will be sent.
*******************************************************************************/
void TCS34725_I2C_Read(uint8_t slaveAddress, uint8_t* dataBuffer, uint8_t bytesNumber, uint8_t stopBit)
{uint8_t i = 0;TCS34725_I2C_Start();TCS34725_I2C_Send_Byte((slaveAddress << 1) | 0x01);	   //发送从机地址读命令TCS34725_I2C_Wait_ACK();for(i = 0; i < bytesNumber; i++){if(i == bytesNumber - 1){*(dataBuffer + i) = TCS34725_I2C_Read_Byte(0);//读取的最后一个字节发送NACK}else{*(dataBuffer + i) = TCS34725_I2C_Read_Byte(1);}}if(stopBit == 1) TCS34725_I2C_Stop();
}
/******************************************************************************** @brief Writes data into TCS34725 registers, starting from the selected*        register address pointer.** @param subAddr - The selected register address pointer.* @param dataBuffer - Pointer to a buffer storing the transmission data.* @param bytesNumber - Number of bytes that will be sent.** @return None.
*******************************************************************************/
void TCS34725_Write(uint8_t subAddr, uint8_t* dataBuffer, uint8_t bytesNumber)
{uint8_t sendBuffer[10] = {0, };uint8_t byte = 0;sendBuffer[0] = subAddr | TCS34725_COMMAND_BIT;for(byte = 1; byte <= bytesNumber; byte++){sendBuffer[byte] = dataBuffer[byte - 1];}TCS34725_I2C_Write(TCS34725_ADDRESS, sendBuffer, bytesNumber + 1, 1);
}
/******************************************************************************** @brief Reads data from TCS34725 registers, starting from the selected*        register address pointer.** @param subAddr - The selected register address pointer.* @param dataBuffer - Pointer to a buffer that will store the received data.* @param bytesNumber - Number of bytes that will be read.** @return None.
*******************************************************************************/
void TCS34725_Read(uint8_t subAddr, uint8_t* dataBuffer, uint8_t bytesNumber)
{subAddr |= TCS34725_COMMAND_BIT;TCS34725_I2C_Write(TCS34725_ADDRESS, (uint8_t*)&subAddr, 1, 0);TCS34725_I2C_Read(TCS34725_ADDRESS, dataBuffer, bytesNumber, 1);
}
/******************************************************************************** @brief TCS34725设置积分时间** @return None
*******************************************************************************/
void TCS34725_SetIntegrationTime(uint8_t time)
{TCS34725_Write(TCS34725_ATIME, &time, 1);
}
/******************************************************************************** @brief TCS34725设置增益** @return None
*******************************************************************************/
void TCS34725_SetGain(uint8_t gain)
{TCS34725_Write(TCS34725_CONTROL, &gain, 1);
}
/******************************************************************************** @brief TCS34725使能** @return None
*******************************************************************************/
void TCS34725_Enable(void)
{uint8_t cmd = TCS34725_ENABLE_PON;TCS34725_Write(TCS34725_ENABLE, &cmd, 1);cmd = TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN;TCS34725_Write(TCS34725_ENABLE, &cmd, 1);//delay_s(600000);//delay_ms(3);//延时应该放在设置AEN之后
}
/******************************************************************************** @brief TCS34725失能** @return None
*******************************************************************************/
void TCS34725_Disable(void)
{uint8_t cmd = 0;TCS34725_Read(TCS34725_ENABLE, &cmd, 1);cmd = cmd & ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);TCS34725_Write(TCS34725_ENABLE, &cmd, 1);
}
/******************************************************************************** @brief TCS34725初始化** @return ID - ID寄存器中的值
*******************************************************************************/
uint8_t TCS34725_Init(void)
{uint8_t id=0;//TCS34725_I2C_Init();TCS34725_Read(TCS34725_ID, &id, 1);  //TCS34725 的 ID 是 0x44 可以根据这个来判断是否成功连接if(id==0x44){TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_240MS);TCS34725_SetGain(TCS34725_GAIN_1X);TCS34725_Enable();return 1;}return 0;
}
/******************************************************************************** @brief TCS34725获取单个通道数据** @return data - 该通道的转换值
*******************************************************************************/
uint16_t TCS34725_GetChannelData(uint8_t reg)
{uint8_t tmp[2] = {0,0};uint16_t data;TCS34725_Read(reg, tmp, 2);data = (tmp[1] << 8) | tmp[0];return data;
}
/******************************************************************************** @brief TCS34725获取各个通道数据** @return 1 - 转换完成,数据可用*   	   0 - 转换未完成,数据不可用
*******************************************************************************/
uint8_t TCS34725_GetRawData(COLOR_RGBC *rgbc)
{uint8_t status = TCS34725_STATUS_AVALID;TCS34725_Read(TCS34725_STATUS, &status, 1);if(status & TCS34725_STATUS_AVALID){rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL);rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL);rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL);rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);return 1;}return 0;
}

到这里TSC34725的驱动程序就完成了,这里读出来的数据是未处理的数据,如果要转化成能使用的RGB转化一下即可。

这篇关于STM32模拟IIC+颜色识别TCS34725的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693189

相关文章

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象