当前位置:   article > 正文

利用Matlab与Arduino制作车牌识别的完整控制系统(1)_arduino uno开发板 车牌识别

arduino uno开发板 车牌识别

一、效果展示

①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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142

函数有:模板建立库+字符匹配函数(程序太多在2中)
(记录自用!)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/952900
推荐阅读
相关标签
  

闽ICP备14008679号