TCS3200颜色识别模块

news2025/1/20 1:50:32

TCS3200颜色识别模块

TCS3200简介

  • 供电电源(2.7V to 5.5V)
  • 可配置颜色滤波器和输出信号频率
  • 高分辨率光强转换到频率(工作原理)

TCS3200工作原理

在这里插入图片描述
在这里插入图片描述

  • TCS3200是TAOS公司推出的可编程彩色光到频率的转换器,它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时集成了三种颜色(RGB)的滤光器;TCS3200能检测物体反射的光强,并生成不同频率的方波信号(50%占空比)

  • TCS3200有一个8*8的光电二极管矩阵,其中分别有三组16个光电二极管有RGB三种滤波器,一组16个光点二极管无滤波器,共64个光电二极管

  • 具有不同滤波器的光电二极管分别检测RGB的值

  • S2和S3用于配置光电二极管矩阵(选择上面四组光电二极管中的一组),S0和S1用于配置电流频率转换器(可以控制输出信号的频率范围)

TCS3200引脚定义

在这里插入图片描述

  • 注意: 对于常见TCS3200颜色识别模块 O E ‾ \overline {OE} OE引脚一般不引出,但会有LED引脚控制模块的LED灯亮灭(一般四个),用于在无光源环境下识别物体

TCS3200功能表

在这里插入图片描述

  • S2、S3用于选择滤波器 对应有 RGB 无滤波器

  • S0、S1用于选择输出波形的频率范围(可以理解为限制输出信号频率的最大值)

  • 下面对TCS3200的输出信号频率作一个简单讲解

在这里插入图片描述

根据网上资料: 该传感器的典型输出频率范围从2Hz-500KHz (但官方资料好像典型值应该到600KHz, 不重要)

S0=H, S1=H对应输出状态为100% 输出典型值为600KHz

S0=H, S1=L对应输出状态为20% 输出典型值为600*0.2 = 120KHz

S0=L, S1=H对应输出状态为2% 输出典型值为 600*0.02=12KHz

注意:该值应为输出频率的最大值, 接着往下看
在这里插入图片描述

这是TCS3200运行特征表的一部分,可以看到在100%输出的模式下, 不同颜色光照对应的输出信号频率范围

TCS3200工作流程

在这里插入图片描述

白平衡校准

白平衡就是告诉TCS3200什么是白色的,以此为参照才能计算其他颜色的RGB。理论上,白色是由等量的RGB混合而成(255、255、255)但实际中,由于光照条件人的感知能力有限等原因,我们看到的白色很有可能不是由均匀的RGB组成,并且TCS3200对三种颜色的敏感性也不相同(参考TCS3200运行特征表),因此进行白平衡给TCS3200一个标准(这个标准有时候不一定准确,会导致识别的结果出现一定的误差)

白平衡的方法: 在装置启动前,先将一个白色物体(不是白色就校验不准)置于传感器处,等待传感器检测,MCU计算出比例因子

题外话: 校验不准容易导致后续的检测中出现异常值,RGB的值超出255,这样在现有的RGB体系下我们无法找到对应的颜色;校验的越准,越不容易出现异常值

颜色识别

参考TCS230,大致有两种思路

在这里插入图片描述

这里采用第二种思路

程序设计

设计思路

设置一个定时器每隔1s进入一次中断服务,期间对TCS3200输出的信号进行采集和处理;设置另外一个定时器,捕获TCS3200的输出信号**(外部时钟源模式2,上升沿使计数器加一);第一次的检测用于白平衡,后续循环检测RGB**,每完成一组将RGB的值显示在OLED屏幕上

标准库下使用外部时钟源模式2

1. 通用定时器框图(部分)

在这里插入图片描述

回顾一下这个图,要想用外部时钟源模式2,信号的流向是这样子的。

可简单分为三个部分:

  • 外部时钟源模式2参数配置 (极性选择,边沿检测,预分频器,滤波器)
  • 从模式控制器配置(复位、使能、向上/下、计数)
  • 时基单元配置(TimeBase)

接下来根据信号的流向,讲解整个流程的配置

2. 配置外部时钟模式2

在这里插入图片描述

  • 首先从参考手册的描述中可知,设定该模式主要操作的是SMCR寄存器也就是所谓的从模式寄存器

  • 第二句话说明它的功能,即我们所需的功能

在这里插入图片描述

  • 框图: 对应第一部分

  • 调用的库函数
    在这里插入图片描述

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0);
  • 不分频,极性不翻转(高电平有效), 不滤波

3. 配置从模式

  • 在参考手册中,只对从模式中的四个做出详细的介绍

在这里插入图片描述

  • 但在手册对于定时器寄存器描述中,我们找到从模式控制寄存器(TIMx_SMCR)

在这里插入图片描述

  • 可以看到其实有八种模式可以配置,然后可以发现外部时钟模式1,刚好对应了我们框图中的信号流向,因此我们需要将从模式配置为外部时钟模式1,从模式的外部时钟模式1和时钟选择的外部时钟源模式1不同

  • 下面介绍需要使用和了解的库函数

    • 函数TIM_ITRxExternalClockConfig

在这里插入图片描述

    /**
      * @brief  Configures the TIMx Internal Trigger as External Clock
      * @param  TIMx: where x can be  1, 2, 3, 4, 5, 9, 12 or 15 to select the TIM peripheral.
      * @param  TIM_ITRSource: Trigger source.
      *   This parameter can be one of the following values:
      * @param  TIM_TS_ITR0: Internal Trigger 0
      * @param  TIM_TS_ITR1: Internal Trigger 1
      * @param  TIM_TS_ITR2: Internal Trigger 2
      * @param  TIM_TS_ITR3: Internal Trigger 3
      * @retval None
      */
    void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
    {
      /* Check the parameters */
      assert_param(IS_TIM_LIST6_PERIPH(TIMx));
      assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource));
      /* Select the Internal Trigger */
      TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource);  // 选择输入触发的通道
      /* Select the External clock mode1 */
      TIMx->SMCR |= TIM_SlaveMode_External1;   // 内部使用了从模式的外部模式1
    }
  • 可以看到该函数无论是在库函数编程手册,还是在ST库的注释中,都只有4个参数可选择(但实际不是, 接着往下看)

  • 可以看到该函数内部调用了函数TIM_SelectInputTrigger

  • 函数TIM_SelectInputTrigger

在这里插入图片描述

 /**
   * @brief  Selects the Input Trigger source
   * @param  TIMx: where x can be  1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
   * @param  TIM_InputTriggerSource: The Input Trigger source.
   *   This parameter can be one of the following values:
   *     @arg TIM_TS_ITR0: Internal Trigger 0
   *     @arg TIM_TS_ITR1: Internal Trigger 1
   *     @arg TIM_TS_ITR2: Internal Trigger 2
   *     @arg TIM_TS_ITR3: Internal Trigger 3
   *     @arg TIM_TS_TI1F_ED: TI1 Edge Detector
   *     @arg TIM_TS_TI1FP1: Filtered Timer Input 1
   *     @arg TIM_TS_TI2FP2: Filtered Timer Input 2
   *     @arg TIM_TS_ETRF: External Trigger input  // 我们要选的参数
   * @retval None
   */
 void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
 {
   uint16_t tmpsmcr = 0;
   /* Check the parameters */
   assert_param(IS_TIM_LIST6_PERIPH(TIMx));
   assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));
   /* Get the TIMx SMCR register value */
   tmpsmcr = TIMx->SMCR;
   /* Reset the TS Bits */
   tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS));
   /* Set the Input Trigger source */
   tmpsmcr |= TIM_InputTriggerSource;
   /* Write to TIMx SMCR */
   TIMx->SMCR = tmpsmcr;
 }
  • 实际可调用参数有8个

  • 配置代码

TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ETRF);

4. 配置时基单元(略)

至此,框图信号流动路线全部配置完毕,外部时钟源模式2即可使用

主要代码

TCS.h

#ifndef __TCS_H
#define __TCS_H
#include "stm32f10x.h"

/**
 * @breif TCS3200端口定义
 * 		  S0: PA4
 * 		  S1: PA5
 * 		  S2: PA6
 * 		  S3: PA7
 * 		  LED: PB0
 */
#define  S0_L 		GPIO_ResetBits(GPIOA, GPIO_Pin_4);
#define  S0_H       GPIO_SetBits(GPIOA, GPIO_Pin_4);

#define  S1_L       GPIO_ResetBits(GPIOA, GPIO_Pin_5);
#define  S1_H    	GPIO_SetBits(GPIOA, GPIO_Pin_5);

#define  S2_L       GPIO_ResetBits(GPIOA, GPIO_Pin_6);
#define  S2_H       GPIO_SetBits(GPIOA, GPIO_Pin_6);

#define  S3_L       GPIO_ResetBits(GPIOA, GPIO_Pin_7);
#define  S3_H       GPIO_SetBits(GPIOA, GPIO_Pin_7);

#define  LED_OFF    GPIO_ResetBits(GPIOB, GPIO_Pin_0);
#define  LED_ON     GPIO_SetBits(GPIOB, GPIO_Pin_0);

extern float RGB_Scale[3];  // R、G、B 比例因子
extern uint16_t count;  // 脉冲计数
extern uint16_t cnt[3]; // RGB 三种颜色的脉冲数

// 频率选择
typedef enum
{
	TCS_2Percentage = 0x01,
	TCS_20Percentage = 0x02,
	TCS_100Percentage = 0x03,
	TCS_Frequent_OFF = 0x04
}TCS_FrequentTypeDef;

// 滤波器
typedef enum
{
	TCS_Filter_Red = 0x01,
	TCS_Filter_Blue = 0x02,
	TCS_Filter_Green = 0x03,
	TCS_Filter_None = 0x04
} TCS_FilterTypeDef;

void TCS_Init(void);
void TCS_FrequentKeyer(TCS_FrequentTypeDef TCS_Frequent);

#endif

TCS.c

#include "stm32f10x.h"
#include "MyNVIC.h"
#include "TCS.h"

float RGB_Scale[3];  // R、G、B 比例因子
uint16_t count;  // 脉冲计数
uint16_t cnt[3]; // RGB 三种颜色的脉冲数
static TCS_FilterTypeDef flag = TCS_Filter_None;  // 滤波器选择模式标志

/**
 *  @brief 颜色识别端口初始化  PA 4 5 6 7;  PB 0 
 */
void TCS_PortInit(void)
{
	// RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);	
	// GPIO  S0-S3(PA4-7) 用来控制TCS3200工作模式 配置为通用推挽输出
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	// LED(PB0) 用来控制TCS3200的LED的亮灭 配置为通用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}	

/**
 * @brief TIM1 初始化 用于计时 定时时间为1s
 */
void TCS_TIM1_Init(void)
{
	// RCC
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
	
	// TimeBase
	TIM_TimeBaseInitTypeDef TimeBase_InitStructure;
	TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TimeBase_InitStructure.TIM_Period = 10000-1; // ARR
	TimeBase_InitStructure.TIM_Prescaler = 7200-1; // PSC
	TimeBase_InitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1, &TimeBase_InitStructure);
	
	// NVIC
	MyNVIC_TIM1_Config();
	
	// 开启中断
	TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
	
	TIM_Cmd(TIM1, ENABLE);
}

/**
 *  @brief TIM2 初始化 外部时钟模式 用于捕获TCS3200 OUT口的信号 PA0信号输入口 TIM_ETR
 */
void TCS_TIM2_Init(void)
{
	// RCC
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	// GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);  // 拉倒低电平
	
	// TimeBase
	TIM_TimeBaseInitTypeDef TimeBase_InitStructure;
	TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TimeBase_InitStructure.TIM_Period = 0xFFFF; // ARR  65535
	TimeBase_InitStructure.TIM_Prescaler = 0;  // PSC
	TimeBase_InitStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2, &TimeBase_InitStructure);
	
	// Select the clock source  选择时钟源
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0);
	TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ETRF);
	TIM_SetCounter(TIM2, 0);  // 将CNT置零
	
	TIM_Cmd(TIM2, ENABLE);  // 开启定时器
}

/**
 *  @brief 频率调制	
 *
 *  @param TCS_FrequentTypeDef:  TCS_2Percentage TCS_20Percentage TCS_100Percentage TCS_Frequent_OFF
 */
void TCS_FrequentKeyer(TCS_FrequentTypeDef TCS_Frequent)
{
	switch(TCS_Frequent)
	{	
		case TCS_2Percentage:
			S0_L;
			S1_H;
			break;
		case TCS_20Percentage:
			S0_L;
			S1_H;
			break;
		case TCS_100Percentage:
			S0_H;
			S1_H;
			break;
		case TCS_Frequent_OFF:
			S0_L;
			S1_L;
			break;
		default:
			break;
	}
}

/**
 *  @brief 选择滤波器
 *  @param TCS_Filter: TCS_Filter_Red TCS_Filter_Blue TCS_Filter_Green TCS_Filter_None 
 */
void TCS_SelectFilter(TCS_FilterTypeDef TCS_Filter)
{
	flag = TCS_Filter;  // 更新标志位
	switch(TCS_Filter)
	{
		case TCS_Filter_Red:
			S2_L;
			S3_L;
			break;
		case TCS_Filter_Blue:
			S2_L;
			S3_H;
			break;
		case TCS_Filter_Green:
			S2_H;
			S3_H;
			break;
		case TCS_Filter_None:
			S2_H;
			S3_L;
			break;
		default:
			break;
	}
}

/**
 * @brief TCS3200初始化 初始化端口 和两个用到的定时器 
 */
void TCS_Init(void)
{
	TCS_PortInit();   // 控制端口
	TCS_TIM1_Init();  // 定时计时器
	TCS_TIM2_Init();  // 捕获脉冲数 包括输入端口初始化 
	TCS_FrequentKeyer(TCS_Frequent_OFF);  // 频率调制器断电
	TCS_SelectFilter(TCS_Filter_None);  // 关闭TCS滤波器
	LED_OFF;  // 关闭LED
}

/**
 * @brief TIM1更新中断
 */
void TIM1_UP_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM1, TIM_IT_Update))
	{
		count = TIM_GetCounter(TIM2);  // 读取脉冲数
		// 依次读取 RGB三种颜色的值
		switch(flag)
		{
			case TCS_Filter_None:
				count = 0;
				TCS_SelectFilter(TCS_Filter_Red);  // 选择红色滤波器
				break;
			case TCS_Filter_Red:
				cnt[0] = count;  
				TCS_SelectFilter(TCS_Filter_Green);  // 选择绿色滤波器
				break;
			case TCS_Filter_Green:
				cnt[1] = count;
				TCS_SelectFilter(TCS_Filter_Blue);  // 选择蓝色滤波器
				break;
			case TCS_Filter_Blue:
				cnt[2] = count;
				TCS_SelectFilter(TCS_Filter_None);  // 关闭滤波器
				break;
			default:
				break;
		}
		// 将TIM2的计数器清零
		TIM_SetCounter(TIM2, 0);
		
		// 清除标志位
		TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
	}
}

MyNVIC.h

#ifndef __MyNVIC_H
#define __MyNVIC_H

void MyNVIC_TIM1_Config(void);

#endif

MyNVIC.c

#include "stm32f10x.h"

/**
 * @brief TIM1 中断向量嵌套配置 
 */
void MyNVIC_TIM1_Config(void)
{
	NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	
	NVIC_Init(&NVIC_InitStructure);

}

main.c

#include "stm32f10x.h" 
#include "delay.h"  // 江科大对应的驱动
#include "OLED.h"  // 江科大对应的驱动
#include "TCS.h"
int main(void)
{
	OLED_Init();
	TCS_Init();  // 初始化TCS3200
	
	TCS_FrequentKeyer(TCS_2Percentage);  // 选择输出频率
	// 这里选2% 因为计数器最多到65535 
	// 若选20%最高输出120kHz 120000 当检测时长为1s时会超出计数器的范围
	// 但输出频率越高,结果越精确
	// 感兴趣的可以尝试两个定时器级联 扩大计数范围
	LED_ON;  // LED 开
	
	// 第一次获得的参数 进行白平衡 
	Delay_ms(8000);  // 延时8s,两轮检测确保白平衡的进行
	RGB_Scale[0] = 255.0/cnt[0];  // Get Red Scale
	RGB_Scale[1] = 255.0/cnt[1];  // Get Green Scale
	RGB_Scale[2] = 255.0/cnt[2];  // Get Blue Scale
	
	while(1)
	{
		Delay_ms(4000);
		OLED_ShowString(1, 1, "R:");
		OLED_ShowNum(1, 3, cnt[0]*RGB_Scale[0], 3);
		OLED_ShowString(2, 1, "G:");
		OLED_ShowNum(2, 3, cnt[1]*RGB_Scale[1], 3);
		OLED_ShowString(3, 1, "B:");
		OLED_ShowNum(3, 3, cnt[2]*RGB_Scale[2], 3);
	}
}

效果展示

【TCS3200颜色识别模块】

参考资料

基于STM32F103的TCS3200颜色传感器的使用

肝了一下午,学会TCS3200颜色识别——基于STM32,分享一波

高分辨颜色传感器TCS230的原理与应用

TCS3200.pdf (DataSheet)

STM32F10xxx参考手册(中文).pdf

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

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

相关文章

Python找出列表中出现次数最多的元素三种方式

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 方式一: 原理:创建一个新的空字典,用循环的方式来获取列表中的每一个元素,判断获取的元素是否存在字典中的key,如果不存在的话,将元素作为key&#xf…

如何保证事件的闭环处理

所谓的闭环,就是指告警发出、认领、协作处理、问题恢复、复盘改进的整个过程。 排班,专人做专事 ​这个手段听起来并不高大上,但确实非常有效。值班期间虽然提心吊胆的,生怕背锅,但因为是轮班制,心里总有…

C语言笔试训练【第12天】

文章目录 1、请阅读以下程序,其运行结果是( )2、假设编译器规定 int 和 short 类型长度分别为32位和16位,若有下列C语言语句,则 y 的机器数为( )3、下列程序的输出结果是什么( &…

LC-链表的中间节点(遍历)

LC-链表的中间节点(遍历) 链接:https://leetcode.cn/problems/middle-of-the-linked-list/description/ 描述:给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个…

OpenCV-Python中的图像处理-图像直方图

OpenCV-Python中的图像处理-图像直方图 图像直方图统计直方图绘制直方图Matplotlib绘制灰度直方图Matplotlib绘制RGB直方图 使用掩膜统计直方图直方图均衡化Numpy图像直方图均衡化OpenCV中的直方图均衡化CLAHE 有限对比适应性直方图均衡化 2D直方图OpenCV中的2D直方图Numpy中2D…

基于Python科研论文绘制学习 - task1

绘制原则 必要性(避免图多字少) 易读性(完整准确的标题、标签) 一致性(配图需要和上下文一致) 尝试运行代码的时候出现了很多bug,基本都是围绕Scienceplots库的,在更新pip、pandas…

Gin安装解决国内go 与 热加载

get 方式安装超时问题,国内直接用官网推荐的下面这个命令大概率是安装不成功的 go get -u github.com/gin-gonic/gin 可以在你的项目目录下执行下面几个命令: 比如我的项目在E:\Oproject\zl cmd E:\Oproject\zl>就在目录下执行 go env -w GO111…

HCIP学习--MPLS

MPLS-多协议标签交换 标签交换 基于2.5层的标签号进行路由行为,开始传输数据包的时候需要查询两张表,一个路由表一个ARP表然后人们就想可不可以少查点表,然后MPLS就出现了,MPLS就是是在数据包的2.5层压入一个标签号,路由器基于2…

人大进仓数据库ksql命令基础

测试环境信息: 系统为银河麒麟V10 数据库为Kingbase ES V8 数据库安装目录为/opt/Kingbase/ES/V8 ksql命令位于/opt/Kingbase/ES/V8/Server/bin下 使用--help获取帮助 续上图 1.查看数据库列表 ./ksql -U system -l 2.查看数据库版本 ./ksql -V 3.连接指定的数据库tes…

计算机技术综合布线实训室建设方案

一、计算机技术综合布线系统概述 综合布线是指在建筑物或办公室内部,将各种通信设备(如计算机、电话、视频监控、音频设备等)通过统一的电缆系统连接起来的一种网络布线方式。它是构建局域网(LAN)和数据中心基础设施的…

Revit SDK 介绍:PanelSchedule 配电盘明细表

前言 这个例子介绍 Revit 的配电盘明细表,PanelSchedule。Revit 的电器专业在国内用的并不是十分广泛,但从功能上来说还是比较完整的。 内容 这个例子里有三个命令: PanelScheduleExport - 导出配电盘明细表InstanceViewCreation - 创建配…

HTML5的介绍和基本框架

目录 HTML5 HTML5介绍 HTML5的DOCTYPE声明 HTML5基本骨架 html标签 head标签 body标签 title标签 meta标签 在vscode中写出第一个小框架 HTML5 HTML5介绍 HTML5是用来描述网页的一种语言,被称为超文本标记语言。用HTML5编写的文件,后缀以.ht…

JVM编译优化

即时编译器 HotSpot虚拟机中内置了两个即时编译器,分别称为Client Compiler和Server Compiler,或者简称为C1编译器和C2编译器。Java8默认开启Server模式。用户可以使用“-client”或“-server”参数去指定编译模式。 C1编译器启动速度快,关注局部简单可靠的优化,比如方法…

【八大排序】-- 计数排序(动图演示)

计数排序介绍 计数排序是一个非基于比较的排序算法。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(nk)(其中k是整数的范围),快于任何比较排序算法。 当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n…

Java反序列化漏洞笔记

前言 作为Java安全方面的盲对Java反序列化各种链方面了解的并不多,但是这些链条又极为重要,有助于更好的理解各种漏洞的产出和原理,因此以下笔记开始从底慢慢学起。 为什么会产生安全问题? 服务器反序列化数据时,客…

OpenCV-Python中的图像处理-模板匹配

OpenCV-Python中的图像处理-模板匹配 模板匹配单对象的模板匹配多对象的模板匹配 模板匹配 使用模板匹配可以在一幅图像中查找目标函数: cv2.matchTemplate(), cv2.minMaxLoc()模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提…

行业追踪,2023-08-15

自动复盘 2023-08-15 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

3. 爬取自己CSDN博客列表(自动方式)(分页查询)(网站反爬虫策略,需要在代码中添加合适的请求头User-Agent,否则response返回空)

文章目录 步骤打开谷歌浏览器输入网址按F12进入调试界面点击网络,清除历史消息按F5刷新页面找到接口(community/home-api/v1/get-business-list)接口解读 撰写代码获取博客列表先明确返回信息格式json字段解读 Apipost测试接口编写python代码…

浅谈 EMP-SSL + 代码解读:自监督对比学习的一种极简主义风

论文链接:https://arxiv.org/pdf/2304.03977.pdf 代码:https://github.com/tsb0601/EMP-SSL 其他学习链接:突破自监督学习效率极限!马毅、LeCun联合发布EMP-SSL:无需花哨trick,30个epoch即可实现SOTA 主要…

从0到1:通用后台管理系统 Vue3使用wangEditor

那么这一节我们在编辑公司信息的弹窗中使用富文本插件wangEditor官网 Vue3使用wangEditor 安装wangEditor在弹窗中引入wangEditor结构api接口部分editor组件script部分怎么去修改富文本的编辑器? 案例内效果: 安装wangEditor npm install wangeditor/…