OpenMV与STM32之间的通信(附源码)

news2025/2/28 11:48:38

本篇文章旨在记录我电赛期间使用openmv和stm32单片机之间进行串口通信,将openmv识别到的坐标传输给单片机。背景是基于2023年全国大学生电子设计大赛E题:舵机云台追踪识别。

单片机的串口通信原理我便不再详细讲解,下面直接上代码分析。

值得注意的是接线:RX——>TX

                                 TX——>RX

                                 单片机和OPENMV必须共地

非常重要!!!!

一、串口通信传输两个数据(x坐标和y坐标) 

(一)、 OPENMV串口通信部分

import sensor, image, time,math,pyb
from pyb import UART,LED
import json
import ustruct

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
red_threshold_01=(10, 100, 127, 32, -43, 67)
clock = time.clock()

uart = UART(3,115200)   #定义串口3变量
uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters

def find_max(blobs):    #定义寻找色块面积最大的函数
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:
            max_blob=blob
            max_size = blob.pixels()
    return max_blob


def sending_data(cx,cy,cw,ch):
    global uart;
    #frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
    #data = bytearray(frame)
    data = ustruct.pack("<bbhhhhb",      #格式为俩个字符俩个短整型(2字节)
                   0x2C,                      #帧头1
                   0x12,                      #帧头2
                   int(cx), # up sample by 4   #数据1
                   int(cy), # up sample by 4    #数据2
                   int(cw), # up sample by 4    #数据1
                   int(ch), # up sample by 4    #数据2
                   0x5B)
    uart.write(data);   #必须要传入一个字节数组


while(True):
    clock.tick()
    img = sensor.snapshot()
    blobs = img.find_blobs([red_threshold_01])
    max_b = find_max(blobs)
    cx=0;cy=0;
    if blobs:
            #如果找到了目标颜色
            cx=max_b[5]
            cy=max_b[6]
            cw=max_b[2]
            ch=max_b[3]
            img.draw_rectangle(max_b[0:4]) # rect
            img.draw_cross(max_b[5], max_b[6]) # cx, cy
            FH = bytearray([0x2C,0x12,cx,cy,cw,ch,0x5B])
            #sending_data(cx,cy,cw,ch)
            uart.write(FH)
            print(cx,cy,cw,ch)

注意观察下图标注的部分,我不做详细讲解,但是很容易理解: 

 

接下来请看STM32串口通信部分的代码:

#include "uart.h"
#include "oled.h"
#include "stdio.h"

static u8 Cx=0,Cy=0,Cw=0,Ch=0;

void USART1_Init(void)
{
	//USART1_TX:PA 9   
	//USART1_RX:PA10
	GPIO_InitTypeDef GPIO_InitStructure;     //串口端口配置结构体变量
	USART_InitTypeDef USART_InitStructure;   //串口参数配置结构体变量
	NVIC_InitTypeDef NVIC_InitStructure;     //串口中断配置结构体变量

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //打开PA端口时钟

    //USART1_TX   PA9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;          		 //PA9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  		 //设定IO口的输出速度为50MHz
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	   		 //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);             	 	 //初始化PA9
    //USART1_RX	  PA10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;             //PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);                 //初始化PA10 

    //USART1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;  //抢占优先级0
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		  //子优先级2
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			  //IRQ通道使能
		NVIC_Init(&NVIC_InitStructure);	                          //根据指定的参数初始化VIC寄存器

    //USART 初始化设置
		USART_InitStructure.USART_BaudRate = 115200;                  //串口波特率为115200
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;   //字长为8位数据格式
		USART_InitStructure.USART_StopBits = USART_StopBits_1;        //一个停止位
		USART_InitStructure.USART_Parity = USART_Parity_No;           //无奇偶校验位
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件数据流控制
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	                  //收发模式
    USART_Init(USART1, &USART_InitStructure);                     //初始化串口1

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能中断
    USART_Cmd(USART1, ENABLE);                     //使能串口1

  	//如下语句解决第1个字节无法正确发送出去的问题
	  USART_ClearFlag(USART1, USART_FLAG_TC);        //清串口1发送标志
		
}

//USART1 全局中断服务函数
void USART1_IRQHandler(void)			 
{
		u8 com_data; 
		u8 i;
		static u8 RxCounter1=0;
		static u16 RxBuffer1[10]={0};
		static u8 RxState = 0;	
		static u8 RxFlag1 = 0;


		if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  	   //接收中断  
		{
				USART_ClearITPendingBit(USART1,USART_IT_RXNE);   //清除中断标志
				com_data = USART_ReceiveData(USART1);
			
				if(RxState==0&&com_data==0x2C)  //0x2c帧头
				{
					RxState=1;
					RxBuffer1[RxCounter1++]=com_data;OLED_Refresh();
				}
		
				else if(RxState==1&&com_data==0x12)  //0x12帧头
				{
					RxState=2;
					RxBuffer1[RxCounter1++]=com_data;
				}
		
				else if(RxState==2)
				{
					RxBuffer1[RxCounter1++]=com_data;

					if(RxCounter1>=10||com_data == 0x5B)       //RxBuffer1接受满了,接收数据结束
					{
						RxState=3;
						RxFlag1=1;
						Cx=RxBuffer1[RxCounter1-5];
						Cy=RxBuffer1[RxCounter1-4];
						Cw=RxBuffer1[RxCounter1-3];
						Ch=RxBuffer1[RxCounter1-2];
					}
				}
		
				else if(RxState==3)		//检测是否接受到结束标志
				{
						if(RxBuffer1[RxCounter1-1] == 0x5B)
						{
									USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断
									if(RxFlag1)
									{
									OLED_Refresh();
									OLED_ShowNum(0, 0,Cx,3,16,1);
									OLED_ShowNum(0,17,Cy,3,16,1);
									OLED_ShowNum(0,33,Cw,3,16,1);
									OLED_ShowNum(0,49,Ch,3,16,1);
									}
									RxFlag1 = 0;
									RxCounter1 = 0;
									RxState = 0;
									USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
						}
						else   //接收错误
						{
									RxState = 0;
									RxCounter1=0;
									for(i=0;i<10;i++)
									{
											RxBuffer1[i]=0x00;      //将存放数据数组清零
									}
						}
				} 
	
				else   //接收异常
				{
						RxState = 0;
						RxCounter1=0;
						for(i=0;i<10;i++)
						{
								RxBuffer1[i]=0x00;      //将存放数据数组清零
						}
				}

		}
		
}

注意观察下面的图:

二、串口通信传输多个数据(四个点的x、y坐标同时传输给STM32单片机)

(一)OPENMV串口部分

from machine import Pin
import sensor, image, time, pyb
#import seekfree
from pyb import UART

# 初始化TFT180屏幕
#lcd = seekfree.LCD180(3)

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565) # 设置图像色彩格式为RGB565格式
sensor.set_framesize(sensor.QQVGA)  # 设置图像大小为160*120
sensor.set_auto_whitebal(True)      # 设置自动白平衡
sensor.set_brightness(3000)         # 设置亮度为3000
sensor.skip_frames(time = 20)       # 跳过帧
uart = UART(3, 115200,timeout_char=3000) #配置串口
clock = time.clock()

def sending_data(cx,cy,cw,ch):
    global uart;
    data = ustruct.pack("<bbhhb",      #格式为俩个字符俩个短整型(2字节)
                   0x2C,                      #帧头1
                   0x12,                      #帧头2
                   int (cx1), # up sample by 4    #数据26
                   int (cy1),
                   int (cx2), # up sample by 4    #数据26
                   int (cy2),
                   int (cx3), # up sample by 4    #数据26
                   int (cy3),
                   int (cx4), # up sample by 4    #数据26
                   int (cy4),
                   0x5B)
    uart.write(data);   #必须要传入一个字节数组

while(True):
    clock.tick()
    img = sensor.snapshot()

# -----矩形框部分-----
    # 在图像中寻找矩形
    for r in img.find_rects(threshold = 10000):
        # 判断矩形边长是否符合要求
        if r.w() > 20 and r.h() > 20:
            # 在屏幕上框出矩形
            img.draw_rectangle(r.rect(), color = (255, 0, 0), scale = 4)
            # 获取矩形角点位置
            corner = r.corners()
            # 在屏幕上圈出矩形角点
            img.draw_circle(corner[0][0], corner[0][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[1][0], corner[1][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[2][0], corner[2][1], 5, color = (0, 0, 255), thickness = 2, fill = False)
            img.draw_circle(corner[3][0], corner[3][1], 5, color = (0, 0, 255), thickness = 2, fill = False)

        # 打印四个角点坐标, 角点1的数组是corner[0], 坐标就是(corner[0][0],corner[0][1])
        # 角点检测输出的角点排序每次不一定一致,矩形左上的角点有可能是corner0,1,2,3其中一个
            corner1_str = f"corner1 = ({corner[0][0]},{corner[0][1]})"
            corner2_str = f"corner2 = ({corner[1][0]},{corner[1][1]})"
            corner3_str = f"corner3 = ({corner[2][0]},{corner[2][1]})"
            corner4_str = f"corner4 = ({corner[3][0]},{corner[3][1]})"
        print(corner1_str + "\n" + corner2_str + "\n" + corner3_str + "\n" + corner4_str)
    # 显示到屏幕上,此部分会降低帧率
    #lcd.show_image(img, 160, 120, 0, 0, zoom=0)  #屏幕显示

    #串口通信传输的数据
        cx1=(int)(corner[0][0]*10)
        cy1=(int)(corner[0][1]*10)

        cx2=(int)(corner[1][0]*10)
        cy2=(int)(corner[1][1]*10)

        cx3=(int)(corner[2][0]*10)
        cy3=(int)(corner[2][1]*10)

        cx4=(int)(corner[3][0]*10)
        cy4=(int)(corner[3][1]*10)

        FH=bytearray([0x2C,0x12,cx1,cy1,cx2,cy2,cx3,cy3,cx4,cy4,0x5B])

        uart.write(FH)

        cx1=0
        cy1=0

        cx2=0
        cy2=0

        cx3=0
        cy3=0

        cx4=0
        cy4=0

    # 打印帧率
    print(clock.fps())

下面请观察这幅代码截图:

(二)、STM32串口通信部分

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>
#include "OLED.h"
#include "LED.h"
#include "Serial.h"

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;
static int16_t Cx1=0,Cy1=0,Cx2=0,Cy2=0,Cx3=0,Cy3=0,Cx4=0,Cy4=0; 

int Cx5[16];//用于存放分段求的坐标值
int Cy5[16];
//static u8 RxFlag1 = 0;//串口中断接收标志位

extern float Ang1,Ang2,AngFlag;
extern float Angle1,Angle2;

int avel_X1 ;
int avel_X2 ;
int avel_X3 ;
int avel_X4 ;

int avel_Y1 ;
int avel_Y2 ;
int avel_Y3 ;
int avel_Y4 ;

void Serial_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	//TX
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	//RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART3, &USART_InitStructure);
	
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART3, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
	USART_SendData(USART3, Byte);
	while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while (Y --)
	{
		Result *= X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
	}
}

int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;
	va_start(arg, format);
	vsprintf(String, format, arg);
	va_end(arg);
	Serial_SendString(String);
}
//USART3 全局中断服务函数
void USART3_IRQHandler(void)			 
{
		int com_data; 
		u8 i;
		u8 Jieshou = 1;
		
		static u8 RxCounter1=0;
		static int RxBuffer1[16]={0};
		static u8 RxState = 0;	
		static u8 RxFlag1 = 0;//串口中断接收标志位,已被移除至函数体外作为全局变量

		if( USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET && Jieshou == 1)  	   //接收中断  
		{
//			OLED_ShowSignedNum(1,1,520,4);
				USART_ClearITPendingBit(USART3,USART_IT_RXNE);   //清除中断标志
				com_data = USART_ReceiveData(USART3);
			if(Jieshou == 1)
			{
		
				if(RxState==0&&com_data==0x2C)  //0x2c帧头
				{
					RxBuffer1[RxCounter1++]=com_data;
					RxState=1;
				}
		
				else if(RxState==1&&com_data==0x12)  //0x12帧头
				{
					RxBuffer1[RxCounter1++]=com_data;
					RxState=2;
				}			
				else if(RxState==2)
				{
					RxBuffer1[RxCounter1++]=com_data;

					if(RxCounter1>=14||com_data == 0x5B)       //RxBuffer1接受满了,接收数据结束
					{
						RxState=3;
						RxFlag1=1;
						Jieshou = 2;
						
						Cx1=RxBuffer1[RxCounter1-9];
						Cy1=RxBuffer1[RxCounter1-8];
						
						Cx2=RxBuffer1[RxCounter1-7];
						Cy2=RxBuffer1[RxCounter1-6];
						
						Cx3=RxBuffer1[RxCounter1-5];
						Cy3=RxBuffer1[RxCounter1-4];
						
						Cx4=RxBuffer1[RxCounter1-3];
						Cy4=RxBuffer1[RxCounter1-2];
						
						OLED_ShowSignedNum(1,1,Cx1,4);
						OLED_ShowSignedNum(2,1,Cy1,4);
						OLED_ShowSignedNum(3,1,Cx2,4);
						OLED_ShowSignedNum(4,1,Cy2,4);
						
						OLED_ShowSignedNum(1,7,Cx3,4);
						OLED_ShowSignedNum(2,7,Cy3,4);
						OLED_ShowSignedNum(3,7,Cx4,4);
						OLED_ShowSignedNum(4,7,Cy4,4);
						
					}
				}
			}
				else if(RxState==3)		//检测是否接受到结束标志
				{
					if(RxBuffer1[RxCounter1-1] == 0x5B)
					{
						USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);//关闭DTSABLE中断
						if(RxFlag1)
						{	
							
							AngFlag=0;
							HuanRaoZuoBiao();
//										
//							OLED_ShowSignedNum(1,1,Cx1,4);

//							OLED_ShowSignedNum(2,1,Cx2,4);
//							OLED_ShowSignedNum(3,1,avel_X1,4);
//							OLED_ShowSignedNum(4,1,Cx5[0],4);

							AngFlag=1;
							RxFlag1 = 0;
							RxCounter1 = 0;
							RxState = 0;									
						}
						USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);									
					}
					else   //接收错误
					{
								RxState = 0;
								RxCounter1=0;
								for(i=0;i<10;i++)
								{
										RxBuffer1[i]=0x00;      //将存放数据数组清零
								}
					}
				} 
	
				else   //接收异常
				{
						RxState = 0;
						RxCounter1=0;
						for(i=0;i<10;i++)
						{
								RxBuffer1[i]=0x00;      //将存放数据数组清零
							
						}
				}
			
		}
	}

 注意观察下面这副代码截图:

以上便是我对电赛期间OPENMV与单片机之间实现串口通信的代码实现。学者若有疑问或需要代码工程,可以私聊我。收到后我会及时回复。

 

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

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

相关文章

SpringBoot分页其实很简单

分页其实很简单 一、数据库Limit Limit的使用 Limit子句可以被用于强制 SELECT 语句返回指定的记录数。 Limit接受一个或两个数字参数&#xff0c;参数必须是一个整数常量。如果给定两个参数&#xff0c;第一个参数指定第一个返回记录行的偏移量&#xff0c;第二个参数指定返…

Java————初始集合框架

一 、 集合框架 Java 集合框架Java Collection Framework &#xff0c;又被称为容器container &#xff0c; 是定义在 java.util 包下的一组接口interfaces 和其实现类classes 。 其主要表现为将多个元素element 置于一个单元中&#xff0c; 用于对这些元素进行快速、便捷的存…

题目 1056: 二级C语言-温度转换

输入一个华氏温度&#xff0c;要求输出摄氏温度。公式为 保留两位小数 样例输入 -40.00 样例输出 -40.00 这道题很简单&#xff0c;数据代入公式就行。记得设置double或者float的浮点型--》用于保留两位小数。 对于保留小数: 1是可以用iomanip的cout<<fixed<&l…

Mysql的逻辑架构、存储引擎

1. 逻辑架构剖析 1.1 服务器处理客户端请求 首先MySQL是典型的C/S架构&#xff0c;即Clinet/Server 架构&#xff0c;服务端程序使用的mysqld。 不论客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果是&#xff1a;客户端进程向服务器进程发送一段文…

MySQL数据库详解 一:安装MySQL数据库及基本管理

文章目录 1. 数据库的基本概念1.1 数据库的组成1.1.1 数据1.1.2 表1.1.3 数据库 1.2 当前主流数据库及其特点1.3 数据库类型1.3.1 关系数据库1.3.1.1 关系数据库的组成1.3.1.2 非关系数据库 2. 安装MySQL2.1 yum安装2.2 编译安装MySQL2.2.1 前置准备2.2.2 编译安装2.2.3 修改my…

《C和指针》笔记27:递归

递归所需要的两个特性&#xff1a; 存在限制条件&#xff0c;当符合这个条件时递归便不再继续&#xff1b;每次递归调用之后越来越接近这个限制条件。 这里没有用计算阶乘和菲波那契数列的例子说明递归&#xff0c;作者指出前者递归并没有提供任何优越之处。而后者效率之低是…

渗透测试的概况、依据、内容方法和流程有哪些?

一、项目概况 通过模拟黑客的思维和攻击手段&#xff0c;对计算机业务系统的弱点、技术缺陷和漏洞进行探查评估。经过客户授权后&#xff0c;在不影响业务系统正常运行的条件下&#xff0c;渗透人员在黑客可能的不同的位置&#xff0c;采取可控的方法、手段和工具&#xff0c;…

Java计算机毕业设计 基于SpringBoot+Vue的毕业生信息招聘平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Input子系统 - Kernel驱动程序 - Android

Input子系统 - Kernel驱动程序 - Android 1、Input子系统相关定义1.1 代码位置1.2 input_dev结构体&#xff1a;表示输入设备1.3 input_handler结构体&#xff1a;struct input_handler - implements one of interfaces for input devices1.4 input_handle结构体&#xff1a;将…

图文文案音视频素材库流量主小程序开发

适用于全行业的资源素材运营变现小程序&#xff0c;支持文档、图片、文件、图文、音视频、网盘等多种资源形式&#xff0c;多种功能组合运营变现的小程序。 适用领域&#xff1a; 公司/微商素材、学习/考研/论文资料分享、PPT模板/背景图/壁纸/头像、知识付费、抖音素材等等…

传统 IAM 已成为企业增长桎梏,下一代身份基础设施如何帮助企业破局?

近期&#xff0c;国际权威研究机构 Gartner 发布了《Hype Cycle for Data, Analytics and AI in China, 2023》&#xff08;2023 中国数据、分析与 AI 技术成熟度曲线报告&#xff09;。报告指出&#xff0c;数据、分析技术和人工智能对中国的数字经济和国家战略至关重要&#…

经典匹配算法: KMP、Sunday与ShiftAnd

本次介绍的三种算法的时间复杂度&#xff1a; 基础概念&#xff1a; 图3 图1 单模匹配问题&#xff1a;单个模式串&#xff0c;比如我们要在一个长串&#xff08;母串S&#xff09;中查找一个短串&#xff08;模式串T&#xff09;是否出现过。 暴力匹配算法&#xff1a; 算法…

IDEA下使用Spring MVC

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…

56资源网系统源码搭建知识付费-含源码

内置了上万条数据资源 大致功能&#xff1a; 支持免费与付费&#xff08;增加了插件付费插件&#xff09;支持侧边栏支持添加各类型广告&#xff08;你所能用到的基本都有&#xff09;.支持网盘下载模块支持所有页面自定义支持文章页三方跳转支持添加页面支持自定义采集&#…

nginx配置指南

nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件&#xff0c;该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织&#xff1a; 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…

Python Opencv实践 - 视频文件写入(格式和分辨率修改)

参考资料&#xff1a; python opencv写视频——cv2.VideoWriter()_cv2.cv.videowriter(_翟羽嚄的博客-CSDN博客 import cv2 as cv import numpy as np#1. 打开原始视频 video_in cv.VideoCapture("../SampleVideos/Unity2D.mp4") video_width int(video_in.get(c…

优化器的使用

代码示例&#xff1a; import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter# 加载数据集转化为Tensor…

腾讯mini项目-【指标监控服务重构】2023-08-22

今日已办 50字项目价值和重难点 项目价值 通过将指标监控组件接入项目&#xff0c;对比包括其配套工具在功能、性能上的差异、优劣&#xff0c;给出监控服务瘦身的建议 top3难点 减少监控服务资源成本&#xff0c;考虑性能优化如何证明我们在监控服务差异、优劣方面的断言…

ubuntu 22.04运行opencv4的c++程序遇到的问题

摘要&#xff1a;本文介绍一下在ubuntu系统中&#xff0c;运行一个最简单的opencv4程序都出问题的解决方法&#xff0c;并对其基本原理作简单阐述。解决问题的方法有很多&#xff0c;本文只提供其中一种。 opencv版本是4.2.0&#xff0c;ubuntu版本是20.04 查询opencv版本的指…

Aztec.nr:Aztec的隐私智能合约框架——用Noir扩展智能合约功能

1. 引言 前序博客有&#xff1a; Aztec的隐私抽象&#xff1a;在尊重EVM合约开发习惯的情况下实现智能合约隐私 Aztec.nr&#xff0c;为&#xff1a; 面向Aztec应用的&#xff0c;新的&#xff0c;强大的智能合约框架使得开发者可直观管理私有状态基于Noir构建&#xff0c;…