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

该博客介绍了使用MATLAB进行图像处理,实现车牌识别的完整流程。包括GUI界面展示、图像预处理(如二值化、边缘检测、膨胀、腐蚀等)、区域属性分析以定位车牌,以及进一步的字符分割和识别。系统最终将处理结果通过串口通信发送给Arduino,用于驱动门禁系统。博客还涉及了模板库建立和字符匹配的函数应用。
摘要由CSDN通过智能技术生成

一、效果展示

①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中)
(记录自用!)

### 回答1: 基于Arduino的人脸识别门禁系统是一种通过使用Arduino控制硬件设备和图像处理算法来实现的高技术门禁系统。其主要功能是利用摄像头捕捉人脸图像,通过图像处理算法提取人脸特征,并与预先录入的人脸数据进行比对,从而实现门禁控制。 该系统的工作原理是:首先,使用Arduino控制摄像头进行图像捕捉,并将捕获到的人脸图像发送给计算机进行图像处理。在计算机上,利用人脸识别算法提取人脸图像中的关键特征点,并将这些特征点与事先录入的人脸数据进行比对。如果匹配成功,则向Arduino发送信号,控制门禁系统解锁,允许进入;否则门禁系统保持锁定状态。 基于Arduino的人脸识别门禁系统具有以下优点:首先,它可以高效准确地进行人脸识别,提高门禁的安全性和便利性。其次,基于Arduino的系统具有开放性,可以方便地进行二次开发和定制,满足不同场景的需求。此外,Arduino作为一种开源硬件平台,具有丰富的库和资源,可以快速搭建和调试门禁系统。 总之,基于Arduino的人脸识别门禁系统利用图像处理和人脸识别算法,以及Arduino控制硬件设备,实现了高效准确的门禁控制功能,使得门禁系统更加安全可靠。 ### 回答2: 基于Arduino的人脸识别门禁系统可以通过以下步骤实现: 1. 首先,需要使用一个Arduino板和一个摄像头模块。摄像头模块可以用来捕捉门口的人脸图像。 2. 接下来,我们需要一个人脸识别算法。可以使用OpenCV等库进行人脸检测和识别。该算法可以通过训练模型来识别已知的人脸。 3. 将Arduino与摄像头和计算机连接起来。Arduino将负责控制门禁系统,发送信号开关门锁。 4. 在Arduino中编写代码,实现以下功能: a. 初始化摄像头模块和人脸识别算法。 b. 定义门禁系统的状态,如等待刷脸,正在验证等等。 c. 当有人靠近门口时,Arduino启动摄像头模块并捕捉人脸图像。 d. 将人脸图像传输到计算机进行人脸识别。 e. 如果识别成功,则发送一个指令给门锁,开启门禁系统,否则,提示认证失败。 f. 根据门禁系统的状态,更新相应的显示屏或指示灯,以向用户提供反馈。 5. 对于安全性的考虑,可以添加额外的功能: a. 添加一个红外传感器来监测是否有人还在门口等待入内。 b. 在识别成功后,可以将相关信息存储在数据库中,并记录该用户的出入时间。 c. 可以将门禁系统与网络连接起来,以便远程管理门禁系统和权限控制。 基于Arduino的人脸识别门禁系统通过使用Arduino的硬件和编写相应代码来实现两个关键功能:摄像头捕捉人脸图像和计算机进行人脸识别。同时,添加了额外的安全措施,使门禁系统更加可靠和安全。该系统可以应用于各种场合,例如公司、学校、住宅等。 ### 回答3: 基于Arduino的人脸识别门禁是一种利用Arduino开发板和人脸识别算法相结合的安全系统。它通过摄像头捕捉人脸图像,并对图像中的人脸进行识别和验证,从而实现对门禁系统的控制与管理。 首先,该系统需要使用Arduino开发板作为控制中心,通过连接摄像头、显示屏、蜂鸣器等组件实现各种功能。Arduino开发板负责接收来自摄像头传感器的图像数据,并将其传输给人脸识别算法进行分析和处理。 其次,人脸识别算法是该系统的核心。该算法使用深度学习、图像处理等技术,对输入的人脸图像进行特征提取和对比,以达到识别和验证的目的。算法能够将人脸图像与已存储的人脸特征库进行比对,判断是否匹配。 当有人接近门禁时,系统会自动捕捉到人脸图像,并提取特征进行识别。如果识别结果与数据库中的人脸特征相匹配,则门禁系统控制开门;否则,系统会发出警报,并记录相关信息。 该系统具有高效、准确的特点。基于Arduino的人脸识别门禁不仅可以提高门禁系统的安全性和智能化水平,同时也能方便快捷地管理员工、访客的出入,并且记录相关信息,以便后续查询和处理。这种门禁系统在现实生活中得到广泛应用,提升了安全性和便捷性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值