一、效果展示
①GUI界面:
②图像处理过程展示
( 注:系统可利用matlab界面识别显示和图像处理,并将数据发给Arduinio用于显示显示屏的内容+蜂鸣器+舵机打造全套的门禁系统)
二、系统流程图
图像处理流程图
建立模板库流程图:
三、Matlab部分代码
主程序:
case {3,4}
I = handles.I;%读取传输文件
% figure;
% imshow(I);
imwrite(I,'输入原图.jpg');
I = imresize(I, [480 NaN]);%改变图像尺寸宽为480
% figure;
% imshow(I);
imgray = rgb2gray(I);%RGB转为灰度值
imbin = imbinarize(imgray);%通过对I进行二值化,计算全局阈值输出二值图像
I = edge(imgray, 'sobel');%边缘化
% figure;
% imshow(I);
imwrite(I,'边缘化图.jpg');
I = imdilate(I, strel('diamond', 2));%扩张膨胀,系数为2
% figure;
% imshow(I);
imwrite(I,'膨胀后图.jpg');
I = imfill(I, 'holes');%把扩张的洞填满
% figure;
% imshow(I);
imwrite(I,'把holes填满图.jpg');
I = imerode(I, strel('diamond', 10));%腐蚀图像边缘腐蚀把小于10的去掉
% figure;
% imshow(I);
imwrite(I,'边缘腐蚀图.jpg');
Iprops=regionprops(I,'BoundingBox','Area', 'Image');%图像区域属性,非常有用
area = Iprops.Area;%计算像素的总数
count = numel(Iprops);%返回数组元素个数为2个,找到两个对象会有腐蚀不全的
maxa= area;
boundingBox = Iprops.BoundingBox;%用最小面积的框框中物体
%%比较出像素最大的,即找到车牌的正确位置
I=Iprops(1).Image;%调取找到的第一个对象
% figure;
% imshow(I);
imwrite(I,'找到有效对象1图.jpg');
I=Iprops(2).Image;%调取找到的第一个对象
imwrite(I,'找到有效对象2图.jpg');
for i=1:count
if maxa<Iprops(i).Area
maxa=Iprops(i).Area;
boundingBox=Iprops(i).BoundingBox;
end
end
%%以上步骤都是为了找到车牌的位置
I = imcrop(imbin,boundingBox);%自定义裁剪出boundingBox区域图像
% figure;
% imshow(I);
imwrite(I,'裁剪有效对象图.jpg');
%调整尺寸
I = imresize(I, [240 NaN]);%变化尺寸,长变为240
% figure;
% imshow(I);
%clear dust
I = imopen(I, strel('rectangle', [4 4]));
% figure;
% imshow(I);
imwrite(I,'图片剪切成高240.jpg');
%remove some object if it width is too long or too small than 500
%删除一些对象,如果它的宽度太长或太小小于500
I = bwareaopen(~I, 500);%~I逆二值化,删除面积小于500的对象
axes(handles.axes4);%确定显示位置
imshow(I);
imwrite(I,'最后图片.jpg');
%%%get width
[h, w] = size(I);%计算图片尺寸
%read letter读取,下面提取的是找到车牌后的
Iprops=regionprops(I,'BoundingBox','Area', 'Image');
count = numel(Iprops);%找到所有数字个对象
Code=[]; % Initializing the variable of number plate string.
% 正在初始化车牌串变量
I=Iprops(1).Image;%调取找到的第一个对象
I2=Iprops(2).Image;
I3=Iprops(10).Image;
imwrite(I,'框取第一个对象.jpg');
imwrite(I2,'框取第二个对象.jpg');
imwrite(I3,'框取第十个对象.jpg');
% figure;
% imshow(I);
for i=1:count
ow = length(Iprops(i).Image(1,:));%分别提取图片列、行信息,宽
oh = length(Iprops(i).Image(:,1));%高
if ow<(h/2) & oh>(h/3)%h为图片尺寸文字占据车牌大概的大小不同地区的不同,满足条件输入数据库比对
%disp(Iprops(1).Image);
letter=readLetter(Iprops(i).Image); % 读取二值图像'N'对应的字母
% figure; imshow(Iprops(i).Image);
Code=[Code letter]; % Appending every subsequent character in noPlate variable.
% 在noPlate变量中附加每个后续字符。
end
end
% handles.edit1.String = str(noPlate);
set(handles.edit1,'String',Code);%回传
end
% Code = get(handles.edit1);%回溯
% disp('获得舵机');
% disp(Code);
String1 = Code(1);
%串口通信前的数据处理
if(String1=='陕')
%disp('成功');
Rt=strrep(Code,Code(1),'s');%置换字符串的字符
disp(Rt);
elseif(String1=='豫');
Rt=strrep(Code,Code(1),'y');
disp(Rt);
elseif(String1=='辽')
Rt=strrep(Code,Code(1),'l');%替换掉字符串第一位的字符
disp(Rt);
else
Rt=Code;
disp(Rt);
end
pause(0.1);
Bit = '*'
Rt = [Rt Bit];
% disp(Rt);
%串口通信传输
delete(instrfind({'Port'},{'COM6'}));
global u;
u = serial('COM6','BaudRate',9600,'DataBits',8);%设定相关的串口参数
fopen(u);
set(u,'BytesAvailableFcnMode','Terminator');
set(u,'Terminator','*'); %设立中断
u.BytesAvailableFcn =@ReceiveCallback;
for k=1:1:3
fprintf(u,Rt);
pause(0.3);%时间间隔不宜过小
end
函数有:模板建立库+字符匹配函数(程序太多在2中)
(记录自用!)