目录

一、摘要........................................................................................ 6

二、引言........................................................................................ 6

三、主要研究内容......................................................................... 6

1.1  图像的预处理................................................................... 6

1.2  边缘提取........................................................................... 7

1.3 车牌边界的确定................................................................. 8

2 字符分割............................................................................... 9

3  字符识别............................................................................. 10

3.1  归一化.............................................................................. 10

3.2  匹配识别字符................................................................. 10

四、总结...................................................................................... 11

五、摘要...................................................................................... 11

六、源代码.................................................................................. 12

摘要:

简要介绍了识别技术的研究背景及其发展历程;对识别技术的常用方法进行了总结:重点对近年来车牌识别方法的研究进展进行综述;总结了现阶段存在的研究困难并提出今后的发展方向;实现了简单的车牌识别程序。

关键词:车牌识别:车牌检测:车牌定位; 车牌字符分割

引言:

随着人们生活水平的不断提高 , 机动车辆数量大幅度增加,与之相配套的高速公路,城市路网及停车场越来越多,显著提高了人们对交通控制方面的要求。由于计算机技术的发展,信息处理水平的提高使智能交通系统成为世界交通领域研究的重要课题。其中车牌识别是智能交通系统的重要组成部分。

车牌识别是利用车牌特征来鉴别车主身份成为安全验证首选方式,具有普遍性、安全性、唯一性、稳定性等。无论何种形式的车牌识别系统,它们大多都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。

车牌识别系统一般包括以下流程,如图 1 。

图1 车牌识别系统

  • 主要研究内容:

总体内容:

(1) 车牌的定位研究。先进行图像的预处理,包括RGB彩色图像的灰度化、图像灰度拉伸、图像边缘检测、灰度图的二值化等;车牌定位采用基于水平和垂直投影分布特征的方法。

(2)字符分割的研究。先对定位后的车牌图像进行预处理,然后按照车牌的先验信息,用区域增长算法来确定候选车牌的字符区域。

(3)字符识别的研究。对于提取出的单个字符,先进行归一化操作,再与给定的模板做对比,识别出字符。

1.1  图像的预处理

一般情况下,由 CCD 采集到的图像会有不理想的情况,如光线过强,或者偏弱,这些都会对后续的图像处理产生一向。而且车牌位于车身下部,靠近散热片,对比度较差,此时若直接对灰度图像进行定位会有不小的困难,为了获得较好处理的灰度图像,在对 CCD 采集的原始图像进行灰度化后,要对其灰度转换。

首先对图像灰度拉伸,使灰度级占据0--255 整个区域,这样做的目的是为了减少光线过强,或者偏弱时造成的灰度级过少.本文直接采用直方图均衡化,这样处理简单,运算量小,效果也较理想。

1.2  边缘提取

两个具有不同灰度值的相邻区域之间总存在边缘,边缘就是灰度值不连续的结果,是图像分割、纹理特征提取和形状特征提取等图像分析的基础。为了对有意义的边缘点进行分类,与这个点相联系的灰度级必须比在这一点的背景上变换更有效,我们通过门限方法来决定一个值是否有效。所以,如果一个点的二维一阶导数比指定的门限大,我们就定义图像中的次点是一个边缘点,一组这样的依据事先定好的连接准则相连的边缘点就定义为一条边缘。经过一阶的导数的边缘检测,所求的一阶导数高于某个阈值,则确定该点为边缘点,这样会导致检测的边缘点太多。可以通过求梯度局部最大值对应的点,并认定为边缘点,去除非局部最大值,可以检测出精确的边缘。一阶导数的局部最大值对应二阶导数的零交叉点,这样通过找图像强度的二阶导数饿的零交叉点就能找到精确边缘点。

原图1

实验结果如图 2 所示

图2边缘提取后的图像

由图可见,图像经过差分二值后,车牌区域明显可见。

1.3 车牌边界的确定

由于车牌一般是由字符、背景和边框组成,提取图像的边缘图像后,在字符与背景处就形成了较强的边缘。再考虑汽车本身的特点,通常车牌位于汽车缓冲器上或附近,靠近整幅图像的下部,在往下便是路面,路面一般是比较光滑,因此可以在边缘提取时就很有效的将这部分杂质滤除掉,而使干扰图像的噪声处于车牌之上,如车灯,或散热片。由此,我们采用由下而上的扫描的方法。首先,对边缘图像的象素沿水平方向累加产生一个投影图,如图 3所示。

图 3

由投影图可以看出有车牌字符的地方,灰度值较高,而且处于图像的下部。

故此,先进行粗略定位,考虑到噪声等因素的影响,粗略将上下边界分别定义为最大值-120,最大值+50。在上下界粗定位的基础上进行精细定位,即对图像再进行水平投影,找寻大于3分之2最大值的点,记录改点所对应的横坐标的最大值和最小值,那么此两点为车牌的上下边界点

在定位出上下边界后,再对特征图像进行垂直投影,得到投影图后,对投影图进行处理,重复水平定位的理念,找寻大于3分之2最大值的点所对应的横坐标的最大值和最小值,即为车牌的左右边界点,完成定位。为了之后字符识别的更好处理,根据找寻的边界点,对该灰度增强后图进行定位。

2.字符分割

区域增长的基本思想是将具有相似性质的象素集合起来构成区域。首先在待分割的每个区域中选择一个种子点作为增长的起始点,然后在种子点的领域中搜索那些与种子点的相似特征度满足指定增长准则的象素,并与种子点所在区域合并。此时将新合并的象素作为新的种子点,继续以上搜索和合并过程,直到没有可以合并的象素为止。本文的算法中采用区域增长算法来确定候选车牌的字符区域。首先要确定起始的种子点。字符的像素值最大为 255 ,基于这个信息,选定像素值为 255 的点为起始点。然后选择下面的增长标准:假定一个像素属于一个区域,则这个像素和这个区域里至少有八个像素点是相连的。如果一个像素同时又和其他区域相连了,则这些区域合并在一起。由于光照或者背景噪声等的影响,区域增长算法可能生错误的字符区域,就需要根据前文所述的车牌先验信息来删除错误的区域   ,从而准确定位字符区域。如图 4 所示

如图 4

3.字符识别

3.1  归一化

因为扫描得到的图像的字符大小存在较大的差异,统一尺寸有助于字符识别的准确性,提高识别率,从而与模板进行匹配。归一化主要包括位置归一化、大小归一化及笔划粗细归一化。在这里本人对大小归一化。对不同大小的字符进行变换,使之成为同一尺寸大小的字符,这个过程称为字符大小归一化。通过字符大小归一化,许多特征就可以用于识别不同字号混排的字符。具体实现方法,首先对图像二值化处理,这里的阈值根据大津法得到,然后将字符的外边框按比例线性放大或缩小成为规定尺寸的字符。如图 5 所示

                      

图 5  图像归一化

3.2  匹配识别字符

对分割出来的字符进行识别的方法很多,主要有以下几种方法:

(1)利用字符的结构特征和变换进行特征提取。该方法对字符的倾斜、变形都有很高的适应性,但运算量大,对计算机性能的要求较高。

(2)利用字符统计特征进行特征提取。如提取字符的投影特征、网格特征和轮廓特征组成字符特征矢量进行匹配的方法,识别率较高。

(3)基于字符结构分析的识别方法。该方法可以识别有较大旋转、变形、缩放的字符图像,但需要进行复杂的字符笔划分析和抽取,对字符图像质量要求较高。

(4)模板匹配法。由于车辆牌照字符中只有26个大写英文字母、10个阿拉伯数字和约50个汉字,所以字符集合较小,该方法对于有一定变形、污损或笔画缺损的字符图像有较好的识别效果,总体识别率较高,同时也能满足实时性的要求。

经过实验,本文采用的是第四种模板匹配算法。将分割出来的字符图像与模板图像相减,差值最小的便是与之匹配的模板,从而识别出字符。

二、总结:

车牌识别系统是智能交通领域研究中的重要组成部分,随着经济的不断发展,车辆在人们工作生活中占据着越来越重要的地位,车辆数目的增多给车辆管理提出了更高的要求,因此车牌识别系统有着广泛的应用前景,是个优秀的研究课题。

通过本次设计性实验,我发现了自己能力的不足,而且由于时间的限制无法更完美的实现,该系统,不足主要有以下几点:

(1)车牌定位中垂直定位容易受到噪声的影响,进而无法精确定位。

(2)字符分割直接采用的先验知识分割虽然运算量小,但对定位要求高,这样通用性较弱。

(3)模板匹配法虽然识别率高,但运算量较大。

(4)由于没有用较好的训练库,最后结果出来识别也不太准确。

参考文献:

[1]黄建,刘昊,一种快速车牌图像定位方法 [J].山西电子技术,2007(6): 45-47

[2] 齐林,张向东,一种汽车牌照字符分割的新方法[J].EIC.Vo1.1 5 2008:92-94

[3] 董长虹,MATLAB 图像处理与应用 [M].北京: 国防工业出版社 ,2004.

[4] 文乔农,王海瑞,危春波,车牌字符识别研究[J].科技广场,2007(5): 135-136

[5]潘中杰,车牌自动识别技术的研究与实现,广东:中山大学,2007

[6]周润景,模式识别与人工智能(基于MATLAB),北京:清华大学出版社,2018

源代码:

main.m

I=imread(' C:\Users\LLKX\Desktop\timg.jpg');

figure(1),imshow(I);title('原图')

I1=rgb2gray(I);%功能是将真彩色图像转换为灰度图像,即灰度化处理

figure(2),subplot(1,2,1),imshow(I1);title('灰度图');

figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');

I2=edge(I1,'Prewitt',0.15,'both');

%功能是采用I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0

figure(3),imshow(I2);title(' Prewitt算子边缘检测')

se=[1;1;1];

I3=imerode(I2,se);%腐蚀

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

se=strel('rectangle',[25,25]);

I4=imclose(I3,se);

figure(5),imshow(I4);title('平滑图像的轮廓');

I5=bwareaopen(I4,2000);%作用是删除二值图像BW中面积小于2000的对象

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

[y,x,z]=size(I5);

myI=double(I5);%double类型

tic  %tic用来保存当前时间,而后使用toc来记录程序完成时间

 Blue_y=zeros(y,1);%zeros功能是返回一个m×n×p×...double类零矩阵

 for i=1:y

    for j=1:x

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

 

                Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计

            end 

     end      

 end

 [temp MaxY]=max(Blue_y);%Y方向车牌区域确定

 PY1=MaxY;

 while ((Blue_y(PY1,1)>=5)&&(PY1>1))

        PY1=PY1-1;

 end   

 PY2=MaxY;

 while ((Blue_y(PY2,1)>=5)&&(PY2<y))

        PY2=PY2+1;

 end

 IY=I(PY1:PY2,:,:);

 %%%%%% X方向 %%%%%%%%%

 Blue_x=zeros(1,x);%进一步确定x方向的车牌区域

 for j=1:x

     for i=PY1:PY2

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

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

            end 

     end      

 end

 

 PX1=1;

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

       PX1=PX1+1;

 end   

 PX2=x;

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

        PX2=PX2-1;

 end

 PX1=PX1-1;%对车牌区域的校正

 PX2=PX2+1;

  dw=I(PY1:PY2-8,PX1:PX2,:);

 t=toc;

figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');

figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')

imwrite(dw,'dw.jpg');

a=imread('dw.jpg');

b=rgb2gray(a);%功能是将真彩色图像转换为灰度图像,即灰度化处理

imwrite(b,'1.车牌灰度图像.jpg');

figure(8);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')

g_max=double(max(max(b)));

g_min=double(min(min(b)));

T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值   向最近的方向取整

[m,n]=size(b);

d=(double(b)>=T);  % d:二值图像

imwrite(d,'2.车牌二值图像.jpg');

figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像')

figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前')

% 均值滤波处理

h=fspecial('average',3);

d=im2bw(round(filter2(h,d)));%filter2(B,X),B为滤波器.X为要滤波的数据,这里将B放在X,一个一个移动进行模板滤波.

imwrite(d,'4.均值滤波后.jpg');

figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后')

se=eye(2);%产生m×n的单位矩阵

[m,n]=size(d);

if bwarea(d)/m/n>=0.365 %bwarea是计算二值图像中对象的总面积的函数

    d=imerode(d,se);%腐蚀

elseif bwarea(d)/m/n<=0.235

    d=imdilate(d,se);%膨胀

end

imwrite(d,'5.膨胀或腐蚀处理后.jpg');

figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

d=qiege(d);

[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);

subplot(5,7,1),imshow(word1),title('1');

subplot(5,7,2),imshow(word2),title('2');

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

subplot(5,7,4),imshow(word4),title('4');

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

subplot(5,7,6),imshow(word6),title('6');

subplot(5,7,7),imshow(word7),title('7');

[m,n]=size(word1);

% 归一化大小为 40*20

word1=imresize(word1,[40 20]);

word2=imresize(word2,[40 20]);

word3=imresize(word3,[40 20]);

word4=imresize(word4,[40 20]);

word5=imresize(word5,[40 20]);

word6=imresize(word6,[40 20]);

word7=imresize(word7,[40 20]);

subplot(5,7,15),imshow(word1),title('1');

subplot(5,7,16),imshow(word2),title('2');

subplot(5,7,17),imshow(word3),title('3');

subplot(5,7,18),imshow(word4),title('4');

subplot(5,7,19),imshow(word5),title('5');

subplot(5,7,20),imshow(word6),title('6');

subplot(5,7,21),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' '京宁沪苏陕']);

%建立自动识别字符代码表  1~10 数字  11~36  字母   37~41汉字

SubBw2=zeros(40,20);%生成一个40*20大小的零矩阵

l=1;

for I=1:7

      ii=int2str(I);%整形数据转字符串类型

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

      SegBw2=imresize(t,[40 20],'nearest');%缩放处理

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

            kmin=37;

            kmax=41;

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

            kmin=11;

            kmax=36;

        else l>=3               %第三位以后是字母或数字识别

            kmin=1;

            kmax=36;

       

        end

       

        for k2=kmin:kmax

            fname=strcat('样本库\',liccode(k2),'.bmp');

            SamBw2 = imread(fname);

            for  i=1:40

                for j=1:20

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

                end

            end

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

            Dmax=0;

            for k1=1:40

                for l1=1:20

                    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);

        Code(l*2-1)=liccode(findc(1)+kmin-1);

        Code(l*2)=' ';

        l=l+1;

end

figure(10),imshow(dw),title (['车牌号码:', Code],'Color','b');

 

 

qiege.m

 

 

function e=qiege(d)

[m,n]=size(d);

top=1;bottom=m;left=1;right=n;   % init

while sum(d(top,:))==0 && top<=m

    top=top+1;

end

while sum(d(bottom,:))==0 && bottom>=1

    bottom=bottom-1;

end

while sum(d(:,left))==0 && left<=n

    left=left+1;

end

while sum(d(:,right))==0 && right>=1

    right=right-1;

end

dd=right-left;

hh=bottom-top;

e=imcrop(d,[left top dd hh]);%该函数用于返回图像的一个裁剪区域

 

getword.m

 

 

function [word,result]=getword(d)

word=[];flag=0;y1=8;y2=0.5;

    while flag==0

        [m,n]=size(d);

        wide=0;

        while sum(d(:,wide+1))~=0 && wide<=n-2

            wide=wide+1;

        end

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

        [m1,n1]=size(temp);

        if wide<y1 && n1/m1>y2

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

            if sum(sum(d))~=0

                d=qiege(d);  % 切割出最小范围

            else word=[];flag=1;

            end

        else

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

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

            if sum(sum(d))~=0;

                d=qiege(d);flag=1;

            else d=[];

            end

        end

    end

%end

          result=d;

基于SVM的车牌识别相关推荐

  1. 基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)

    基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类) 一.数据集说明 训练样本来自于github上的EasyPR的c++版本,包含一万三千多张数字及大写字母的图片以及三千多张中 ...

  2. 基于机器学习的车牌识别系统

    基于机器学习的车牌识别系统 本文设计的车牌处理系统主要用于通过手机.路口监视器拍到的车牌照片进行识别.由图像处理.车牌定位.字符分割和字符识别四个模块组成,该四部分需要依次执行,其中的每一模块需要利用 ...

  3. 基于神经网络的车牌识别,卷积神经网络车牌识别

    现在很多工程项目都用车牌识别系统,我想问一下车牌识别系统的原理是什么? 核心算法:从六个步骤来提取我们抓拍的车牌信息,第一:图像捕捉采集.第二:车牌定位.第三:预处理.第四:字符分割.第五:字符识别. ...

  4. 基于Python_opencv的车牌识别系统

    基于python_opencv的车牌识别系统 一.说明 根据现有的车牌识别系统,本人对代码进行了优化,原有功能: 1.对图片中的车牌号进行识别,并对车牌所属地可视化 2.将识别出的车牌号.车牌所属地等 ...

  5. 基于Python-opencv的车牌识别系统

    1.基于python-opencv的车牌识别,代码主要参考CSDN上几篇博主的代码,对预处理部分的代码进行了一定的优化,提高了识别的准确率. 2.重写了一个GUI界面,添加数据导出功能. 使用的模块版 ...

  6. 开源!基于SpringBoot的车牌识别系统(附项目地址)

    公众号关注 "阿拉奇学Java" 设为 "星标",带你学习更多知识! 今天推荐一个基于SpringBoot的车牌识别系统. 介绍 spring boot + m ...

  7. 数字图像处理:基于MATLAB的车牌识别项目

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  8. 基于matlab的车牌识别系统程序,基于matlab的车牌识别系统的设计(附程序).doc

    基于matlab的车牌识别系统的设计(附程序).doc 1车牌识别系统的设计1.摘要:汽车牌照自动识别系统是制约道路交通智能化的重要因素,包括车牌定位.字符分割和字符识别三个主要部分.本文首先确定车辆 ...

  9. 车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt

    基于MATLAB的车牌识别程序详解 自定义一个字符函数,用来从车牌区域中提取出7个字符,其中利用切割函数来进行切割. 程序:function [word,result]=getword(d) word ...

最新文章

  1. 【c语言】蓝桥杯算法提高 数的运算
  2. 使用VS2005调试ASP程序
  3. Python之 sklearn:sklearn.preprocessing中的StandardScaler函数的简介及使用方法之详细攻略
  4. QT的QDesignerFormWindowInterface类的使用
  5. 李彦宏妻子马东敏向中国科大捐赠1亿 成立蔷薇基金
  6. 把Hybris安装时输出的日志重定向到一个本地文件中
  7. mysql hibernate id generator_Hibernate映射文件id的generator配置方法
  8. Linux文件查看/编辑方法介绍
  9. tiantianguandan官方网站
  10. MySQL 5.7 自带的四个数据库 介绍
  11. 在企业ceph运维中问题处理解决方案---持续更新
  12. 国庆福利!384种故宫美色!Matlab中国风配色工具ColorPM
  13. 大数据分析师 VS. 大数据工程师
  14. tsv文件导oracle窜列,TSV文件扩展名 - 什么是.tsv以及如何打开? - ReviverSoft
  15. matlab tic和toc单位,Matlab中tic和toc用法
  16. 计算机网络的期刊,科学网—晒个自己整理的计算机网络和通信方向可能相关的期刊列表 - 张国强的博文...
  17. 科利转债上市价格预测
  18. 点击复制以及长按识别图中二维码功能
  19. 两端固定弦的自由振动 | 分离变量法(一)| 偏微分方程(十三)
  20. java wgs84转西安80_java 地心坐标系(ECEF)和WGS-84坐标系(WGS84)互转的实现

热门文章

  1. python机器学习思维导图脑图(完整版)
  2. YOLOv5/v7 引入 RepVGG 重参数化模块
  3. iOS开发-类似微信录音上滑取消功能
  4. cv2.imshow无法显示图像
  5. 团队建设的一些思考和实践
  6. 面试突击51:为什么单例一定要加 volatile?
  7. C# 景深融合软件(opencvsharp开源库)
  8. 《C语言程序设计》笔记
  9. java编译器:必须对其进行捕获或声明以便抛出
  10. 一键录屏神器——Captura