当前位置: 首页 > news >正文

Matlab 车牌识别技术

1.1设计内容及要求:

课题研究的主要内容是对数码相机拍摄的车牌,进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。

图1-1系统总流程图

1.2方案

1、车牌图像的定位。分析了车牌定位的基本原理和现有的定位方法,利用图像处理的技术,提出了基于数学形态学与边缘检测以及颜色相结合的车牌定位方法。最后对车牌定位实验结果进行分析。

2、倾斜校正。分析了倾斜校正的基本原理和一些倾斜校正方法,并对实验结果进行分析。

3、车牌字符分割。分析了各种字符分割算法,然后对分割出的车牌图像进行灰度化、灰度拉伸、二值化、去边框处理等一系列预处理后,提出了一种

基于模板匹配与垂直投影相结合的字符分割方法。最后对字符分割实验结果进行了分析。

设计原理及设计方案

课题研究的主要内容是对数码相机拍摄的车牌,进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图2-1所示,其中车牌定位的流程图如图2-2所示,字符分割与归一化的流程图如图2-3所示。

图2-1系统总流程图

图2-2 车牌定位的流程图

图2-3 字符分割与归一化流程图

设计的步骤和结果

3.1 图像灰度变换

灰度图指的是包含光亮程度,但没有色彩信息的图片,比如亮度持续变化的黑白图像就是一张灰度图。灰度变换就是将有色彩的图像转化为只有光亮度的图像。色彩图片分为R、G、B 三个量,依次对应着红、绿、蓝等三种颜色,灰度变换就是将R、G、B 三个分量变为一个等值的过程。像素点越亮的灰度值越大(显白色时像素值最大的为255),相反则越暗(显黑色时像素值为0)。要把原来的彩图变化为用灰度表示时,其图像的灰度变换的值可以用下面两个公式计算:

第一个式子用的是权值加重的方法,第二个式子用的是均值法。Matlab中的R、G、B转灰度的函数rgb2gray① 使用的就是第一个式子权值加重[6]。

对应代码实现如下:

Scolor=imread([pn fn]);

figure,imshow(Scolor),title('原始图像');

Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图

figure;imshow(Sgray);title('灰度图')

3.2 图像边缘检测

图像边缘是指图片的灰度空间突变或梯度上突变的全部像素组合。接下来在车牌定位与字符的识别前我们需先对图片做边缘检测处理,提升图像像素,让图像更容易接下来的后续操作。在进行完边缘检测处理之后,能在相当程度上压低噪声影响、切割出车牌区域、留下完整车牌字符,使其方便接下来的定位与识别。

根据牌照字符识别所用的图像采集仪器基本装在固有的位置和车牌的特有属性,相对容易看出汽车车牌一般都在一个水平的长方形区域里,位置范围基本比较固定,而且牌照里的字符基本都在一水平方向上。因此,再进行一些转换,容易清晰的呈出车牌区域的边缘。本次系统设计采用了Roberts算子来对图像进行边缘检测。还有别的算法如Sobel算子和拉普拉斯算子等。

Roberts算子是通过对图像局部做差分处理来寻找图像边缘的,使用互为九十度角上的差分来估计梯度,Roberts算子则是采用对角方向相邻两像素之差,

其幅值为:

grd=edge(Egray,'canny',0.09,'both');

figure,imshow(grd);title('robert算子边缘检测');

3.3 车牌定位

基于Matlab车牌识别设计与实现的关键的是牌照位置标记与车牌分割,在整幅图像中先通过合适的算法去提取图像,得到牌照的位置然后再进行平滑、灰度与二值化等处理接着再对提取出来的图片进行分割得到字符。

定位与分割牌照和二值化处理是本次毕业设计的几个重要技术,其主要是为了将已经过前期预处理后所得到的灰度图象中车牌的区域显示出来,接着把包括车牌符号的那块区域图象从处理过的原始图象中提取出来,再由程序的子系统进行识别,要是能准确的切割出车牌的位置就能更好的提升整个程序识别的效率。而且由于车牌图片是初始图片中一个相对突出的子区域图像,简单的概况就是一个水平度比较高近似矩形的横区域图。它在原图中所占的位置相对比较集中,且其灰度值与原图的其它区域也有很大的区别,因此在其边缘就形成了一个灰度有很大变化的区域边界,这样也就有利于我们直接通过边缘检测对图象进行分割。而汽车车牌的二值化处理是字符分割方法中一个非常重要的步骤。

实现代码如下:

[y,x,]=size(bg2);

I6=double(bg2);

%绘制行曲线图

Y1=zeros(y,1);%y行1列的零矩阵

for i=1:y

for j=1:x

if(I6(i,j,1)==1)

Y1(i,1)= Y1(i,1)+1;

end

end

end

[temp, MaxY]=max(Y1);

PY1=MaxY;

while ((Y1(PY1,1)>=50)&&(PY1>1))

PY1=PY1-7;

end

PY2=MaxY;

while ((Y1(PY2,1)>=50)&&(PY2<y))

PY2=PY2+7;

end

%绘制列曲线图

X1=zeros(1,x);

for j=1:x

for i=PY1:PY2

if(I6(i,j,1)==1)

X1(1,j)= X1(1,j)+1;

end

end

end

PX1=1;

while ((X1(1,PX1)<3)&&(PX1<x))

PX1=PX1+1;

end

PX2=x;

while ((X1(1,PX2)<3)&&(PX2>PX1))

PX2=PX2-1;

end

DW=Scolor(PY1:PY2,PX1:PX2,:);

%subplot(1,3,3);

figure,imshow(DW),title('车牌定

3.4 车牌的二值化

车牌二值化处理是决定字符分割好坏非常重要的一个步骤,所谓二值化实际上就是把原图中的每个像素点的分别设置为0或255两个值,简单来说就是把整副原图转换成黑白图像。这个二值化主要是在灰度的基础上实际也就是取一个比较合适的值,将字符准确地从车牌中分割出来。过程大致就是选取一个合适的值,若当图中的哪点的灰度值大于这个值时就将该点设为最大255,反之如果图像中的某点的灰度值小于这个值的时候就将该点值设为最小0。因此,只有选取好一个合适的阈值,才能使二值化之后的图像能较好地区分出字符和车牌背景。根据实验经验得知图像最大灰度值减去图像最大灰度值与最小灰度值之差的三分之一可获得令人满意的阈值,二值化的效果较好。选取合适的阈值就能使二值化图像准确的表达图像的车牌区域与其他区域,所以二值化阈值的选取就成为了图像二值化的关键所在。

实现的代码如下:

figure,imshow(DW),title('车牌定位后图像');

I1 = rgb2gray(DW); %将RGB图像转化为灰度图像

g_max=double(max(max(I1)));

g_min=double(min(min(I1)));

T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值

[m,n]=size(I1);% d:二值图像

imane_bw=im2bw(I1,T/256);

figure,imshow(imane_bw),title('二值化车牌图像');

位后图像');

fname=strcat('code module\Sam',liccode(k2),'.jpg');

%SamBw2 = imread(fname);

SamBw22 = imread(fname);

SamBw22 = rgb2gray(SamBw22);

SamBw2=imresize(SamBw22,[22 14],'nearest');

level=graythresh(SamBw2);

SamBw2=im2bw(SamBw2,level);

for i=1:22

for j=1:14

SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);

end

end

% 以上相当于两幅图相减得到第三幅图

Dmax=0;

for k1=1:22

for l1=1:14

if ( SubBw2(k1,l1) > 0 || SubBw2(k1,l1) <0 )

Dmax=Dmax+1;

end

end

end

Error(k2)=Dmax;

end

Error1=Error(kmin:kmax);

MinError=min(Error1);

findc=find(Error1==MinError);

if tt==1

findc=findc+36;

end

if tt==2

findc=findc+10;

end

tt=tt+1;

res=liccode(findc);

shibiejieguo(1,l)=res;

l=l+1;

end

图3-5字符识别流程图

在此我取用字符与模板相减的方式计算两者中那些字符相似度最高,其值为0越多证明两者越相似。接着依次输出相似度最高的字符,基本所有牌照上都只有7个字符,而且第一位基本都为汉字,是车辆所属省份的缩写,接着是大写字母与阿拉伯数字。所有的基本只有50多个汉字,26个大写字母与10个数字。此次我只设定4个汉字26个字母与10个数字的模板。设待识别字符为X,标准模板为Ti,相似度为Si,则有:

参考文献

[1] 冈萨雷斯.数字图像处理(第二版).电子工业出版社,2007.8.

[2] 王永利,苏金明. MATLAB7.0实用指南. 北京: 电子工业出版社, 2004

[3] 宋建才.汽车牌照识别技术研究[J].工业控制计算机,2004,44~45.

[4] 郁梅等,基于视觉的车辆牌照检测,计算机应用研究,1999(5),P65~67

[5] 王枚、王国宏.基于伴生与互补颜色特征的车牌字符分割技术[J].山东大学学报,2007。第37卷

[6] 田蕾,董秀芳 MATLAB图形图像处理应用教程. 北京: 中国水利水电出版社, 2003

[7] 朱学芳等,一种自适应细化方法,模式识别与人工智能,Vol.10,No.2,1997(6),P140~145

[8] 叶晨洲,杨杰,宣国荣.车辆牌照字符识别[J].上海交通大学学报,2000,5(34): 672~675.

[9]刘阳,伊铁源等.数字图象处理应用于车辆牌照的识别.辽宁大学学报.2004,65~68.

[10] 刘佐濂 , 邓荣标 , 孔嘉圆.中国科技信息 [J].2005(23期)9~12.

[11] 袁志伟,潘晓露.车辆牌照定位的算法研究[J].昆明理工大学学报,2001,26(2): 56~60

[12] 廖金周,宣国荣. 车辆牌照的自动分割[J].微型电脑应用, 1999年07期

[13] 刘卫国. MATLAB程序设计与应用. 北京:高等教育出版社,2002

[14] 叶晨洲等,车辆牌照字符识别系统,计算机系统应用,1999(5),P10~13

[15] 李宏升等,利用牌照识别技术的停车场安全防盗系统,计算机系统应用,1999(5),P14~16

[16] 许志影、李晋平.MATLAB极其在图像处理中的应用.计算机与现代化,2004(4)

程序附录

%获取图像 装入待处理彩色图像并显示原始图像

[fn,pn,fi]=uigetfile('*.bmp','选择图片');

Scolor=imread([pn fn]);

figure,imshow(Scolor),title('原始图像');

%将彩色图像转换为黑白并显示

Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图

%figure,imshow(Sgray),title('原始黑白图像');

%c=histeq(Sgray);

%figure,imshow(c);title('直方图均衡化图像');

s=strel('disk',13);%strei函数13

Bgray=imopen(Sgray,s);%打开sgray s图像

%figure,imshow(Bgray);title('背景图像');%输出背景图像

I3=imerode(Bgray,se); %腐蚀图像

figure,imshow(I3),title('腐蚀后边缘图像');

bg1=imclose(I3,strel('rectangle',[8,18]));%取矩形框的闭运算即平滑8,18

figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像

bg3=imopen(bg1,strel('rectangle',[8,14]));%取矩形框的开运算8,18

figure,imshow(bg3);title('图像开运算[5,19]');%输出开运算的图像

bg2=bwareaopen(bg3,700);%去除聚团灰度值小于1000的部分800

figure,imshow(bg2);title('从对象中移除小对象');

[y,x,]=size(bg2);

I6=double(bg2);

%绘制行曲线图

Y1=zeros(y,1);%y行1列的零矩阵

for i=1:y

for j=1:x

if(I6(i,j,1)==1)

Y1(i,1)= Y1(i,1)+1;

end

end

end

% figure();

% subplot(1,3,1);

% plot(0:y-1,Y1),title('行像素灰度值累计'),xlabel('行值'),ylabel('像素和');

[temp, MaxY]=max(Y1);

PY1=MaxY;

while ((Y1(PY1,1)>=50)&&(PY2>1))

PY1=PY1-7;

end

PY2=MaxY;

while ((Y1(PY2,1)>=50)&&(PY1<y))

PY2=PY2+7;

end

%绘制列曲线图

X1=zeros(1,x);

for j=1:x

for i=PY1:PY2

if(I6(i,j,1)==1)

X1(1,j)= X1(1,j)+1;

end

end

end

% subplot(1,3,2);

% plot(0:x-1,X1),title('列像素灰度值累计'),xlabel('列值'),ylabel('像数和');

PX1=1;

while ((X1(1,PX1)<3)&&(PX1<x))

PX1=PX1+1;

end

PX2=x;

while ((X1(1,PX2)<3)&&(PX2>PX1))

PX2=PX2-1;

end

DW=Scolor(PY1:PY2,PX1:PX2,:);

%subplot(1,3,3);

figure,imshow(DW),title('车牌定位后图像');

%if isrgb(DW)

I1 = rgb2gray(DW); %将RGB图像转化为灰度图像

%else I1=DW;

%end

%figure,imshow(I1),title('车牌灰度图像');

g_max=double(max(max(I1)));

g_min=double(min(min(I1)));

T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值

[m,n]=size(I1);% d:二值图像

%h=graythresh(I1);

imane_bw=im2bw(I1,T/256);

figure,imshow(imane_bw),title('二值化车牌图像');

% imane_bw=bwareaopen(I1,3);

% figure,imshow(imane_bw),title('形态学滤波后的二值化图像');

[y1,x1,z1]=size(imane_bw);

I3=double(imane_bw);

TT=1;

%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%%

Y1=zeros(y1,1);

for i=1:y1

for j=1:x1

if(I3(i,j,1)==1)

Y1(i,1)= Y1(i,1)+1 ;

end

end

end

Py1=1;

Py0=1;

while ((Y1(Py0,1)<9)&&(Py0<y1))

Py0=Py0+1;

end

Py1=Py0;

while((Y1(Py1,1)>=9)&&(Py1<y1))

Py1=Py1+1;

end

I2=imane_bw(Py0:Py1,:,:);

figure,imshow(I2),title('目标车牌区域');

% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割

d=qiege(I2);

[m,n]=size(d);

%figure,subplot(2,1,1),imshow(d),title(n)

k1=1;k2=1;s=sum(d);j=1;

while j~=n

while s(j)==0

j=j+1;

end

k1=j;

while s(j)~=0 && j<=n-1

j=j+1;

end

k2=j-1;

if k2-k1>=round(n/6.5)

[val,num]=min(sum(d(:,[k1+5:k2-5])));

d(:,k1+num+5)=0; % 分割

end

end

% 再切割

d=qiege(d);

% 切割出 7 个字符

y1=10;y2=0.25;flag=0;word1=[];

while flag==0

[m,n]=size(d);

left=1;wide=0;

while sum(d(:,wide+1))~=0

wide=wide+1;

end

if wide<y1 % 认为是左侧干扰

d(:,[1:wide])=0;

d=qiege(d);

else

temp=qiege(imcrop(d,[1 1 wide m]));

[m,n]=size(temp);

all=sum(sum(temp));

two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));

if two_thirds/all>y2

flag=1;word1=temp; % WORD 1

end

d(:,[1:wide])=0;d=qiege(d);

end

end

% 分割出第二个字符

[word2,d]=getword(d);

% 分割出第三个字符

[word3,d]=getword(d);

% 分割出第四个字符

[word4,d]=getword(d);

% 分割出第五个字符

[word5,d]=getword(d);

% 分割出第六个字符

[word6,d]=getword(d);

% 分割出第七个字符

[word7,d]=getword(d);

% figure(9),imshow(word1),title('1');

% figure(10),imshow(word2),title('2');

% figure(11),imshow(word3),title('3');

% figure(12),imshow(word4),title('4');

% figure(13),imshow(word5),title('5');

% figure(14),imshow(word6),title('6');

% figure(15),imshow(word7),title('7');

[m,n]=size(word1);

% 商用系统程序中归一化大小为 40*20,此处演示%%%%%22,14

word1=imresize(word1,[22 14]);

word2=imresize(word2,[22 14]);

word3=imresize(word3,[22 14]);

word4=imresize(word4,[22 14]);

word5=imresize(word5,[22 14]);

word6=imresize(word6,[22 14]);

word7=imresize(word7,[22 14]);

figure,

subplot(3,7,8),imshow(word1),title('1');

subplot(3,7,9),imshow(word2),title('2');

subplot(3,7,10),imshow(word3),title('3');

subplot(3,7,11),imshow(word4),title('4');

subplot(3,7,12),imshow(word5),title('5');

subplot(3,7,13),imshow(word6),title('6');

subplot(3,7,14),imshow(word7),title('7');

imwrite(word1,'1.jpg');

imwrite(word2,'2.jpg');

imwrite(word3,'3.jpg');

imwrite(word4,'4.jpg');

imwrite(word5,'5.jpg');

imwrite(word6,'6.jpg');

imwrite(word7,'7.jpg');

liccode=char(['0':'9' 'A':'Z' '藏川甘赣贵桂黑沪吉济冀津晋京警兰辽领鲁蒙闽宁青琼陕使苏皖湘新学渝豫粤云浙']); %建立自动识别字符代码表

tt=1;

l=1;

for I=1:7

ii=int2str(I);

t=imread([ii,'.jpg']);

t=255-t;

level=graythresh(t);

t=im2bw(t,level);

SegBw2=imresize(t,[22 14],'nearest');

if tt==1 %第一位汉字识别

kmin=37;

kmax=72;

t=~t;

SegBw2=imresize(t,[22 14],'nearest');

elseif tt==2 %第二位 A~Z 字母识别

kmin=11;

kmax=36;

else %第三位以后是字母或数字识别

kmin=1;

kmax=36;

end

for k2=kmin:kmax

fname=strcat('code module\Sam',liccode(k2),'.jpg');

%SamBw2 = imread(fname);

SamBw22 = imread(fname);

SamBw22 = rgb2gray(SamBw22);

SamBw2=imresize(SamBw22,[22 14],'nearest');

level=graythresh(SamBw2);

SamBw2=im2bw(SamBw2,level);

for i=1:22

for j=1:14

SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);

end

end

% 以上相当于两幅图相减得到第三幅图

Dmax=0;

for k1=1:22

for l1=1:14

if ( SubBw2(k1,l1) > 0 || SubBw2(k1,l1) <0 )

Dmax=Dmax+1;

end

end

end

Error(k2)=Dmax;

end

Error1=Error(kmin:kmax);

end

if tt==2

findc=findc+10;

end

tt=tt+1;

res=liccode(findc);

shibiejieguo(1,l)=res;

l=l+1;

end

%=====对话框显示显示======================

shibiejieguo

相关文章:

Matlab 车牌识别技术

1.1设计内容及要求&#xff1a; 课题研究的主要内容是对数码相机拍摄的车牌&#xff0c;进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发&#xff0c;涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…...

CUDA-求最大值最小值atomicMaxatomicMin

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 实现原理 atomicMax和 atomicMin是 CUDA 中的原子操作&#xff0c;用于在并行计算中安全地更新共享变量的最大值和最小值。它们确…...

新的Midjourney就是一个增强版的Photoshop,你现在可以轻松的用它换衣服、换发型了

好久没有聊 Midjourney 了&#xff0c;昨晚他们发布了一项引人注目的新功能&#xff1a;AI 图像编辑&#xff0c;一个基于网页的加强版的 Photoshop 呼之欲出&#xff0c;让我大为震撼&#xff0c;也让用户们赞叹不已。 基于现有图像进行参考&#xff0c;进而生成新的图片&…...

Linux系统安装软件的4种方式【源码配置编译安装、yum安装、rpm包安装、二进制软件包安装(.rpm/.tar.gz/.tgz/.bz2)】

一.源码安装 linux安装软件采用源码安装灵活自由&#xff0c;适用于不同的平台&#xff0c;维护也十分方便。 &#xff08;一&#xff09;源码安装流程  源码的安装一般由3个步骤组成&#xff1a; 1.配置&#xff08;configure&#xff09; Configure是一个可执行脚本…...

基于Spring Boot的洪涝灾害应急信息管理系统设计与实现

摘要 近年来&#xff0c;全球气候变化加剧&#xff0c;洪涝灾害频发&#xff0c;给各国的经济发展和人民生活带来了巨大的威胁。为了提高洪涝灾害的应急响应能力&#xff0c;开发高效的应急信息管理系统变得至关重要。本文基于Spring Boot框架&#xff0c;设计并实现了一个洪涝…...

912.排序数组(桶排序)

目录 题目解法 题目 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 解法 class Solution { public:vector<int> sortArray(vect…...

IPC 进程间通信 消息队列

操作系统内核中采用一个链式队列管理消息,每个节点就对应一个消息&#xff1a; 操作系统规定了单个消息的数据长度不能超过8k(8192个字节)&#xff0c;一个消息队列的表长(节点数)最多不超过256个 利用消息队列进行通信的特点&#xff1a; 1. 全双工&#xff1a;任何参与通信的…...

opencv 图像翻转- python 实现

在做图像数据增强时会经常用到图像翻转操作 flip。 具体代码实现如下&#xff1a; #-*-coding:utf-8-*- # date:2021-03 # Author: DataBall - XIAN # Function: 图像翻转import cv2 # 导入OpenCV库path test.jpgimg cv2.imread(path)# 读取图片 cv2.namedWindow(image,1) …...

使用DolphinScheduler接口实现批量导入工作流并上线

使用DS接口实现批量导入工作量并上线脚本 前面实现了批量生成DS的任务&#xff0c;当导入时发现只能逐个导入&#xff0c;因此通过接口实现会更方便。 DS接口文档 DS是有接口文档的地址是 http://IP:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&lang…...

pycharm导出环境安装包列表

pycharm导出环境安装包列表 一、导出安装包列表二、安装requirements.txt三、列表显示已安装的包四、显示特定包的信息 一、导出安装包列表 pip freeze > requirements.txt二、安装requirements.txt pip install -r requirements.txt三、列表显示已安装的包 pip list四、…...

分体式智能网关在现代电力物联网中的优势有哪些?

随着电力系统的不断数字化和智能化&#xff0c;电力物联网已经成为现代电力行业发展的重要方向。电力物联网通过各种智能设备和传感器实现电力系统的监测、数据采集和分析&#xff0c;从而优化电力资源配置&#xff0c;提高电网的安全性和稳定性。在这个背景下&#xff0c;&quo…...

第14篇:下一代网络与新兴技术

目录 引言 14.1 下一代网络&#xff08;NGN&#xff09;的定义与特点 14.2 IPv6协议的改进与未来应用 14.3 软件定义网络&#xff08;SDN&#xff09; 14.4 网络功能虚拟化&#xff08;NFV&#xff09; 14.5 量子通信网络 14.6 软件定义广域网&#xff08;SD-WAN&#x…...

物联网数据采集网关详细介绍-天拓四方

一、物联网数据采集网关的概述 物联网数据采集网关&#xff0c;简称数据采集网关&#xff0c;是物联网系统中的重要组成部分&#xff0c;位于物联网设备和云端平台之间。其主要职责是实现数据的采集、汇聚、转换、传输等功能&#xff0c;确保来自不同物联网设备的数据能够统一…...

2024软考网络工程师笔记 - 第10章.组网技术

文章目录 交换机基础1️⃣交换机分类2️⃣其他分类方式3️⃣级联和堆叠4️⃣堆叠优劣势5️⃣交换机性能参数 &#x1f551;路由器基础1️⃣路由器接口2️⃣交换机路由器管理方式2️⃣交换机路由器管理方式 交换机基础 1️⃣交换机分类 1.根据交换方式分 存储转发式交换(Store…...

C语言——字符串指针和字符串数组

目录 前言 一、定义区别 1、数组表示 2、指针表示 二、内存管理区别 1.字符数组 2.字符指针 三、操作区别 1、访问与修改 2、遍历 3...... 总结 前言 在C语言中&#xff0c;字符串随处可见&#xff0c;字符串是由字符组成的一串数据&#xff0c;字符串以null字符(\0)结尾&#…...

7-1回文判断(栈和队列PTA)

回文是指正读反读均相同的字符序列&#xff0c;如“abba”和“abdba”均是回文&#xff0c;但“good”不是回文。编写一个程序&#xff0c;使用栈判定给定的字符序列是否为回文。 若用C&#xff0c;可借助STL的容器实现。 输入格式: 输入待判断的字符序列&#xff0c;按回车…...

使用 NCC 和 PKG 打包 Node.js 项目为可执行文件(Linux ,macOS,Windows)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 文章引言 步骤 1&#xff1a;…...

LeetCode:2747. 统计没有收到请求的服务器数目(滑动窗口 Java)

目录 2747. 统计没有收到请求的服务器数目 题目描述&#xff1a; 实现代码与解析&#xff1a; 滑动窗口 原理思路&#xff1a; 2747. 统计没有收到请求的服务器数目 题目描述&#xff1a; 给你一个整数 n &#xff0c;表示服务器的总数目&#xff0c;再给你一个下标从 0 开…...

项目管理工具--【项目策划任务书】模板

项目策划任务书是项目管理中的重要文件&#xff0c;它详细描述了项目的各个方面&#xff0c;以确保项目能够顺利进行。撰写项目策划任务书时需要考虑以下几个关键要素&#xff1a; 基本信息&#xff1a;包括项目名称、负责人、所在单位、联系方式以及日期等基本信息&#xff0c…...

雷池社区版那么火,为什么站长都使用雷池社区版??

雷池社区版是长亭科技开发的一款免费开源的 Web 应用防火墙&#xff08;WAF&#xff09;&#xff0c;具有诸多优势&#xff0c;因此值得使用。 防护效果强大。能够检测并防御各种网络攻击&#xff0c;包括 SQL 注入、跨站脚本&#xff08;XSS&#xff09;、跨站请求伪造&#x…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

虚幻基础:角色旋转

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 移动组件使用控制器所需旋转&#xff1a;组件 使用 控制器旋转将旋转朝向运动&#xff1a;组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转&#xff1a;必须移动才能旋转&#xff0c;不移动不旋转控制器…...

使用python进行图像处理—图像滤波(5)

图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值&#xff0c;以达到平滑&#xff08;去噪&#xff09;、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算&#xff0c;…...

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 链接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…...

OCC笔记:TDF_Label中有多个相同类型属性

注&#xff1a;OCCT版本&#xff1a;7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...