毕业设计 stm32车牌识别 - 单片机 嵌入式 物联网 机器视觉

news2024/9/22 13:36:27

文章目录

  • 0 前言
  • 1 简介
  • 2 主要器件
  • 3 实现效果
  • 4 设计原理
  • 5 部分核心代码
  • 5 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于stm32的车牌识别

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

1 简介

使用STM32F103RCT6作为主控,摄像头使用OV7670(带FIFO)。STM32进行了16倍频。识别过程分别为:图像采集,二值化,识别车牌区域,字符分割,字符匹配。

2 主要器件

  • STM32F103RCT6主控芯片
  • OV7670摄像头

3 实现效果

在这里插入图片描述

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

4 设计原理

识别过程如下

图像采集
通过OV7670摄像头进行图像采集,采集的图像大小为320*240像素,像素格式为RGB565。每个像素由两字节组成,第一字节的高五位是Red,第一字节的低三位和第二字节的高三位组成Green,第二字节的低五位是Blue。

二值化
二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色),让整个图片呈现出只有黑色和白色的效果。二值化后的图像中灰度值范围是0或者255。这时需要设定一个阈值来对像素点进行设置。

常用二值化方法:

  1. 取中值:设置阈值为127,灰度值小于127的为0,大于127的为255。这样设置计算量小,计算快。缺点也严重:在不同的图像中,颜色分布差别大,处理效果也不会很好。程序开始之前设置R,G,B的阈值,通过阈值判断将像素设置为全黑(0x0000)或者全白(0xFFFF).同时根据色彩的变化记录每一行的颜色跳变点,由此识别出车牌区域。
  2. 取平均值:像素点平均值 = (像素点1灰度值 + 像素点2灰度值 + …… + 像素点n灰度值) / n
  3. 双峰法:此方法适用于具有明显双峰直方图的图像,不适合直方图中双峰差别很大或双峰间的谷比较宽广而平坦的图像。该方法认为图像由前景和背景组成,在灰度直方图上,前景和背景会形成高峰,在双峰之间的最低谷处就是阈值。

识别车牌区域
根据上一步的二值化,由于车牌区域跳变点多,由此可以得出车牌区域。分别记录车牌区域的上下高度。然后通过RGB-HSV颜色转换,识别出车牌区域的左右边界。

字符分割
我国常见车牌以及排列顺序大部分都是按照如下设计的:汉字、英文字母、点、英文字母、阿拉伯数字、阿拉伯数字、阿拉伯数字、阿拉伯数字。基于这个规律,以及图像采集高度一致,设计了如下的分割方法:

  1. 在内存中开辟七个长为车牌长的七分之一和宽为车牌宽的区域
  2. 从车牌图像长边的巾问向下开始扫描车牌图像,并把扫描到的所有的点灰度值复制到0区域的第四个区域对应位置上。然后再从上向下扫描刚扫描过这一努的左边或右边,直到所扫描的这一峰上的所有点的灰度都是0时为止,并把这一竖认为是字符的分离处。
  3. 切割第五到第七个字符。方法就是,切割完了第四个字符之后,再依次扫描剩下的空间,直到所扫描的这一竖上的所有点的灰度值不全为0时,认为是字符的开始并依次扫描直到所扫描的这一竖上的所有点的灰度值全为0时认为是字符的结束。
  4. 切割第三到第四个字符。这两个字符的切割方式与第五到第七个字符一样。
  5. 切割第一到第二个字符。当第三个字符切割完之后,我们将遇到一个点,我们也把它看作一个字符,只不过这个点扫描之后就不要了。扫描完这个点之后,我们来切割第二个字符,它的切割方式与前面一样。切割完了第二个字符之后,再向左扫描,直到所扫描的这一竖上的所有点的灰度值不全为0时,认为是字符的开始,并依次扫描直到所扫描所有剩下的,并填到相应的位置,直到剩下的空间填满。经过粗分割后,可以得到一些单个字符区域和多余的空间。下一步我们将把这些多余的空间去掉。这将更有利于下一步字符的识别。
  6. 去除图像上多余空间:车牌上的字符经过了粗切割所得到的是一些单的字符,但在分配空间时是按照车牌的宽和长的七分之一来分配的;所以这个空间可能大于字符应该占的空问。所以,要将多余空间去除。对于第一个字符从第一行开始向下扫描,把那些一行中所有的点的灰度值全为0的点去掉,直到扫描到有一行不全为0时为止。然后再从第一列开始向右扫描把那些一列中所有的点的灰度值全为0的点去掉,直到扫描到有一列不全为0时为止。接下来从最后一行开始向上扫描,把那些一行中所有的点的灰度值全为0的点去掉,直到扫描到有一行不全为0时为止。最后从最后一列开始向左扫描把那些一列中所有的点的灰度值全为0的点去掉,直到扫描到有一列不全为0时为止。重复上面的步骤完成剩下字符的切割。
  7. 根据二值化的结果,以及记录的跳变点位置,对字符进行分割,同时记录字符的左右边界。

字符匹配
对分割出来的字符进行归一化处理,这里用到图片的扩大算法,扩大之后逐一的去进行字符匹配。字符模板事前通过字模软件转换成二进制数据保存在数组中。最后根据匹配结果相似度最大的做为输出结果。
归一化图像就是要把原来各不相同的字符统一到同一尺寸。因为扫描进来的图像中字符大小存在较大的差异,而相对来说,统一尺寸的字符识别的标准性更强,准确率自然也更高。具体算法如下:先得到原来字符的高度和宽度,与系统已存字模的数据作比较,得出要变换的系数,然后根据得到的系数按照插值的方法映射到原图像中。

5 部分核心代码

摄像头部分

#include "stm32f10x.h"
#include "board.h"
#include "ov7670.h" 

#define OV7670_REG_NUM  184

#define DELAYTIME 2//9倍频时延时“1”,16倍频时延时“2”

void OV7670_GPIO_Init(void)
{
  GPIO_InitTypeDef gpio_init_struct;//结构体
		
	RCC_APB2PeriphClockCmd(FIFO_WR_RCC, ENABLE);//初始化时钟
	RCC_APB2PeriphClockCmd(FIFO_RRST_RCC, ENABLE);//初始化时钟
	RCC_APB2PeriphClockCmd(FIFO_OE_RCC, ENABLE);//初始化时钟
	RCC_APB2PeriphClockCmd(FIFO_RCLK_RCC, ENABLE);//初始化时钟
	RCC_APB2PeriphClockCmd(FIFO_WRST_RCC, ENABLE);//初始化时钟
	RCC_APB2PeriphClockCmd(SCCB_SIC_RCC, ENABLE);//初始化时钟
	RCC_APB2PeriphClockCmd(SCCB_SID_RCC, ENABLE);//初始化时钟
	RCC_APB2PeriphClockCmd(OV7670_RRST_RCC, ENABLE);//初始化时钟
	
	gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
	gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;

	gpio_init_struct.GPIO_Pin = FIFO_WR_PIN;
	GPIO_Init(FIFO_WR_PORT, &gpio_init_struct);

	gpio_init_struct.GPIO_Pin = FIFO_RRST_PIN;
	GPIO_Init(FIFO_RRST_PORT, &gpio_init_struct);

	gpio_init_struct.GPIO_Pin = FIFO_OE_PIN;
	GPIO_Init(FIFO_OE_PORT, &gpio_init_struct);

	gpio_init_struct.GPIO_Pin = FIFO_RCLK_PIN;
	GPIO_Init(FIFO_RCLK_PORT, &gpio_init_struct);

	gpio_init_struct.GPIO_Pin = FIFO_WRST_PIN;
	GPIO_Init(FIFO_WRST_PORT, &gpio_init_struct);

	gpio_init_struct.GPIO_Pin = SCCB_SIC_PIN;
	GPIO_Init(SCCB_SIC_PORT, &gpio_init_struct);

	gpio_init_struct.GPIO_Pin = SCCB_SID_PIN;
	GPIO_Init(SCCB_SID_PORT, &gpio_init_struct);

	gpio_init_struct.GPIO_Pin = OV7670_RRST_PIN;
	GPIO_Init(OV7670_RRST_PORT, &gpio_init_struct);
	
	RCC_APB2PeriphClockCmd(OV7670_DATA_RCC, ENABLE);//初始化时钟
	
	gpio_init_struct.GPIO_Mode = GPIO_Mode_IPU;//输入上拉
	
	gpio_init_struct.GPIO_Pin = OV7670_DATA_PIN;//OV7670数据口引脚初始化
	GPIO_Init(OV7670_DATA_PORT, &gpio_init_struct);
	
	GPIO_WriteBit(FIFO_OE_PORT, FIFO_OE_PIN, 0);
}
static void Sccb_Sid_Change_In(void)//引脚切换为输入
{
	GPIO_InitTypeDef gpio_init_struct;//结构体

	gpio_init_struct.GPIO_Mode = GPIO_Mode_IPU;//输入上拉
	gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;

	gpio_init_struct.GPIO_Pin = SCCB_SID_PIN;
	GPIO_Init(SCCB_SID_PORT, &gpio_init_struct);
}
static void Sccb_Sid_Change_Out(void)//引脚切换为输出
{
	GPIO_InitTypeDef gpio_init_struct;//结构体
	
	gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
	gpio_init_struct.GPIO_Pin = SCCB_SID_PIN;
	GPIO_Init(SCCB_SID_PORT, &gpio_init_struct);
}
void FIFO_Reset_Read_Addr(void)//FIFO 读数据复位,通过直接操作寄存器来提高速度
{				
	GPIOC->BRR =1<<2;	//	RRST=0
	GPIOC->BRR =1<<4;	//	RCLK= 0
	GPIOC->BSRR =1<<4;	//  RCLK=1
	GPIOC->BRR =1<<4;	//	RCLK=0
	GPIOC->BSRR =1<<2;	//  RRST=1
	GPIOC->BSRR =1<<4;	//	RCLK=1
}
static void Start_Sccb(void)//SCCB设置,类似I2C
{
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 1);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 1);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 0);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 0);
	delay(DELAYTIME);
}

static void Stop_Sccb(void)//stop命令,SCCB的停止信号
{
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 0);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 1);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 1);
	delay(DELAYTIME);  
}
static void No_Ack(void)//noAck,用于连续读取中的最后一个结束周期
{
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 1);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 1);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 0);
	delay(DELAYTIME);
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 0);
	delay(DELAYTIME);
}
static u8 Get_Ack(void) 
{
	u8 Error;

	Sccb_Sid_Change_In();																			
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 1);
	delay(DELAYTIME);

	GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 1);
	delay(DELAYTIME);

	Error= GPIO_ReadInputDataBit(SCCB_SID_PORT, SCCB_SID_PIN);
	delay(DELAYTIME);

	GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 0);
	delay(DELAYTIME);

	Sccb_Sid_Change_Out();//输出
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 0);

	return !Error;
}

static u8 Sccb_Write_Byte(u8 dat)//写入一个字节的数据到SCCB
{
	u8 i;
	for(i=0;i<8;i++)
	{
		GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, (((dat<<i)&0x80))>>7);
		delay(DELAYTIME);

		GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 1);
		delay(DELAYTIME);

		GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 0);	 
		delay(DELAYTIME);
	}
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 0);

	return Get_Ack();
}
static u8 Sccb_Read_Byte(void)//一个字节数据读取并且返回
{
	u8 i,rbyte=0;

	Sccb_Sid_Change_In();
	for(i=0;i<8;i++)
	{
		GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 1);
		delay(DELAYTIME);

		if(GPIO_ReadInputDataBit(SCCB_SID_PORT, SCCB_SID_PIN)) rbyte|=(0x80>>i);
		delay(DELAYTIME);

		GPIO_WriteBit(SCCB_SIC_PORT, SCCB_SIC_PIN, 0);	 
		delay(DELAYTIME);
	} 

	Sccb_Sid_Change_Out();//输出
	GPIO_WriteBit(SCCB_SID_PORT, SCCB_SID_PIN, 0);
	return rbyte;
}

主函数部分

#include "stm32f10x.h"
#include "stm32f10x_it.h" 

#include "key.h"
#include "usart.h"
#include "delay.h"
#include "lcd.h"
#include "ov7670.h"
#include "rcc.h"
#include "ShowChar.h"
#include "discern.h"

extern vu8 Red_Vlaue, Green_Value ,Blue_Value;//��ֵ


int main(void)
{  
	unsigned int scan_time = 0;
 
	STM32_Clock_Init(16);                                    //��ʼ��ʱ��

	LCD_Init();	
	Key_Init();	                                             //��ʼ�� KEY1 PA8
	OV7670_GPIO_Init();                                      //OV7670���ų�ʼ�������ڴ��ڳ�ʼ��ǰ��
	//USART1_init();                                         //��ʼ������	

	TIM3_Configuration();                                    //10Khz�ļ���Ƶ�ʣ�������5000Ϊ500ms  
	LCD_Fill(0x6666);		
	while(!Sensor_Init());
	
	LCD_Fill(0xF800);
	delayms(100);

	scan_time = 2;
	
  //��ֵ����ֵ	
	Red_Vlaue = 24;
	Green_Value = 53;
	Blue_Value = 24;

	while(1)
	{
		if(scan_time <= 1) {
			CameraDiscern();                                    //����ʶ��
		}
		if(scan_time > 1) {
			CameraScan();                                       //����ͷɨ�����
			LCD_ShowNum(30,220,21 - scan_time, 2); 
			while(GPIO_ReadInputDataBit(KEY1_PORT,KEY1_PIN)==0) //��������
			{
				LCD_Fill(0x00);                                   //����
				Show_Title();                                     //��ʾ����
				Show_Card(0);                                     //��ʾ�ڼ��鳵��
				Show_Card(1);
				Show_Card(2);
				Show_Card(3);
				Show_Card(4);
				delay_ms(5000);
			}
		}
		if(scan_time == 20) {
			 scan_time = 0;
		}
		scan_time++;
	} 
}



5 最后

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

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

相关文章

juc-3-volatile

目录 1 多线程下变量的不可见性及解决方案 2 不可见性解决方案 2.1 加锁方式解决 2.2 使用volatile关键字 2.3 while(true)速度快调用本地线程内存&#xff0c;加延时即可访问主内存的共享变量 3 volatile不保证原子性以及解决方案 3.1 案例 volatile 验证不是原子性 3.…

详细解析预处理

预处理一.总体概述1.注释去除2.宏替换二.宏定义1.数值宏常量2.字符串宏常量3.用宏定义注释符号4.用宏定义表达式&#xff08;难点&#xff09;1.第一种情况2.第二种情况5.#undef&#xff08;宏的有效范围&#xff09;1.两个问题2.#undef的使用3.一段代码的理解三.条件编译1.#if…

基于nodejs商城系统开发与设计(项目源码+论文设计+ppt答辩+视频录制)

网上购物商城系统以弥补传统购物方式的弊端。在目前的商城里&#xff0c;如果采用网上商城方式&#xff0c;用户购物时就不需要到店里面排队&#xff0c;这样不仅能实时地了解商品的特色&#xff0c;而且方便了顾客&#xff0c;同时也减轻了商城的服务压力。随着WLAN技术的普及…

计算机毕设Python+Vue新文道考研机构在线教学辅导系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

python的panda库读写文件

目录 1.读取excel文件 &#xff08;1&#xff09;语法 &#xff08;2&#xff09;实例 2.读取cvs文件 &#xff08;1&#xff09;语法 &#xff08;2&#xff09;实例 3.读取txt文件 &#xff08;1&#xff09;语法 &#xff08;2&#xff09;实例 4.写入文件 &…

【driver.js】基础使用

介绍 driver.js: 轻量级、无依赖性、普通的 JavaScript 引擎&#xff0c;可在整个页面上推动用户的注意力; &#x1f506;突出显示页面上的任何&#xff08;字面上的任何&#xff09;项目✋阻止用户交互&#x1f4e3; 创建功能介绍&#x1f453;为用户添加焦点转移器&#x1f6…

【Flask框架】——21 Flask上下文

上下文&#xff1a;即语境&#xff0c;语意&#xff0c;在程序中可以理解为在代码执行到某一时刻时&#xff0c;根据之前代码所做的操作以及下文即将要执行的逻辑&#xff0c;可以决定在当前时刻下可以使用到的变量&#xff0c;或者可以完成的事情。 Flask中有两种上下文&…

UDP的报文结构和注意事项

UDP的报文结构和注意事项一、传输层协议二、UDP报文结构一、传输层协议 传输层实现了端到端之间的传输&#xff0c;重点关注的是起点和终点。 核心的协议有两个&#xff1a; 二、UDP报文结构 大部分教科书给出的报文结构都是这样的&#xff1a; 其实只是为了排版方便~~ 实…

关于进程的几个问题

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 今天给大家分享几个关于进程的小问题 1.什么是进程&#xff1f; 2.进程是怎么管理的&#xff1f; 3.进程里面的PCB里都有啥&#xff1f; 4.进程的调度是怎…

解释器模式

文章目录解释器模式1.解释器模式的本质2.何时选用解释器模式3.优缺点4.解释器模式的结构5.实现计算器加减操作解释器模式 当想解析一个文件或者其他内容时&#xff0c;可以根据规律自己定义一种文法&#xff0c;并定义一个解释器&#xff0c;然后解析这种文法&#xff0c;以达到…

MATLAB-自定义函数拟合(fittype-高斯拟合)

在回归拟合分析时,一般情况下,MATLAB会直接提供常用的类型,用fittype创建拟合模型,至于MATLAB具体提供了哪些模型,参见帮助“List of library models for curve and surface fitting”,如果库中没有自己想要的拟合表达式形式,可以自己进行定义,具体介绍如下: 1. fitty…

嵌入式:ARM间接寻址、变址寻址与多寄存器寻址

文章目录寄存器间接寻址基址加偏址寻址&#xff08;变址寻址&#xff09;偏移地址传送数据类型块拷贝寻址&#xff08;多寄存器寻址&#xff09;块拷贝寻址示例寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址&#xff0c;而操作数本身存放在存储器中。例如…

尚医通 (三十七) --------- 定时任务与统计

目录一、就医提醒1. 搭建定时任务模块 service-task2. 添加就医提醒处理二、预约统计1. ECharts2. 获取医院每天平台预约数据接口3. 添加 feign 方法4. 搭建 service-statistics5. 前端展示一、就医提醒 我们通过定时任务&#xff0c;每天 8 点执行&#xff0c;提醒就诊。 1.…

[附源码]Python计算机毕业设计Django校园招聘系统设计

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Android Accessibility知识分享

工具 工欲善其事&#xff0c;必先利其器。下面我们介绍一下工具来发现我们的accessibility问题。感谢这篇文章的分享&#xff1a;https://www.kodeco.com/240-android-accessibility-tutorial-getting-started Lint&#xff1a;这个工具是google提供的&#xff0c;在android …

python--面向对象以及其三大特性(封装、继承、多态)

文章目录前言一、面向过程二、 面向对象三、面向对象的三大特性一、封装二、继承私有属性和私有方法三、多态四、高级特性单例模式前言 这一节主要学习面向对象以及面向对象的三大特性&#xff1a;封装、继承、多态&#xff1b;还有高级特性&#xff1a;类方法、静态方法、pro…

【OpenFeign】【源码+图解】【二】注册OpenFeign接口的实例

【OpenFeign】【源码图解】【一】HelloWorld及其工作原理 目录3. 注册OpenFeign接口的实例3. 注册OpenFeign接口的实例 从HelloWorld中我们看到需要显示加入**EnableFeignClients注解才能开启openFeign的功能&#xff0c;因此它就成为我们分析openFeign**的入口&#xff0c;先…

Chrony时间同步服务

目录 一、时间同步 1.概念 2.时间同步在运维工作中的作用 3.时间同步完成方法 &#xff08;1&#xff09;NTP时间服务&#xff08;centos 6 &#xff09; &#xff08;2&#xff09;Chrony时间服务 二、Chrony时间服务 1.Chrony介绍 2.Chrony的优点 三、Chrony安装 …

逻辑回归(Logistic Regression)原理及过程

目录 一&#xff1a;逻辑回归简介 二&#xff1a;逻辑回归原理 三&#xff1a;逻辑回归 损失函数 四&#xff1a;逻辑回归 梯度下降算法 五&#xff1a;逻辑回归 过程 一&#xff1a;逻辑回归简介 Logistic模型是1938年Verhulst-Pearl在修正非密度方程时提出来的&#xf…

算法刷题打卡第49天:排序数组---计数排序

排序数组 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5]计数排…