DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1428|回复: 0
打印 上一主题 下一主题

[待整理] 基于FPGA的车牌识别系统

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-12 16:22:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
智能交通系统(Intelligent Transportation System,ITS)是一种将计算机、信息、通讯及自动化控制技术相结合的运用于交通方面的现代化管理体系。它的主要功能是解决城市交通拥挤和堵塞问题,在不增加现有交通道路建设的情况下,运用现代化的信息和通信方面的技术,提高交通道路的通行能力,改善交通拥挤问题。
         
        汽车牌照识别技术(LicensePlateReeognition,LPR)是一种专用的计算机视觉系统,在智能交通系统中占有极其重要的地位。该系统的主要功能是,从一副含有车牌的汽车图片中,自动定位出车牌图像,并对车牌上的字符进行分割,最后识别出分割后的单个字符。
         
        1、系统框图
        整个系统可以大致分为下面几个模块:
       

        图1-1 系统模块图

         

        系统的处理过程如下图所示:
       

        图1-2  系统处理流程

         

        2、算法介绍
        下面就对每个步骤的具体算法进行介绍:
         
        预处理部分主要作用是为了增强图像和去除噪声,一边在后续处理时减少误差。使用的具体方法是先对图像进行拉氏变换和梯度变换来增强图像的边缘和细节。由于采集到的图像所包含的噪声属于高斯噪声,所以进行高斯滤波来去噪[2]。
         
        拉式变换:
        拉式算子:
         
       
                                                 
        上式中x值对应像素点所在位置的行数,y为所在位置的列数,f(x,y)为在第x行y列的像素点的像素值。所以拉式变换就转化为对待处理像素的邻域像素的带参运算。
         
        梯度变换:
        梯度算子
       
       
         

       

        图2-1 待处理像素邻域像素

         

        同样梯度算子转换成相应像素点的带参运算。高斯滤波的原理与拉氏变换和梯度变换相同,只是高斯滤波的参数是取自高斯函数。
         
        这样就可以完成图像的预处理过程
         
        车牌定位
        (1)运用行扫描的方法定位牌照的上下边界: 若某一行的0→1(白到黑)和1→0(黑到白) 变化次数大于设定的阈值(如13,车牌有7个字符,所以跳变至少14次), 则设其为待处理像素邻域像素。
         
        待测车牌的最低点,继续扫描直   至0→1 和1→0 变化次数小于阈值,将该阈值设为待测车牌的最高点。若最高点与最低点之差大于15(即车牌图像的高度),则认为目标已检测到,否则继续进行扫描;如果未检测到符合上述条件的目标,则自动门限值重复以上的操作,直到找到目标为止。
         
        (2)垂直投影法定位牌照的左右边界:在找到车牌的上下限后,利用二值图像在竖直方向上的投影作为特征, 从左到右寻找目标的中心点坐标。
         
        字符分割
        字符分割可采用垂直投影法。由于字符块在竖直方向上的投影必然在字符间或字符内的间隙处取得局部最小值, 因此字符的正确分割位置应该在上述局部最小值的附近, 并且这个位置应满足车牌的字符书写格式、字符尺寸限制和一些其他条件。
         
        利用垂直投影法, 对复杂环境下的汽车图像中的字符分割有较好的效果。
         
        字符识别
        字符识别使用模板匹配法。
         
        首先将标准模板入库,把每一张“ 标准车牌”分割出来的字符归一化, 接着将归一化后的模板矩阵存入FPGA 中作为标准模板库。采用20×15 bit 大小的数组作为标准模板。
         
        当车牌上的待识别字符归一化以后, 依次与标准库中的模板进行匹配,即矩阵对应位依次做差,分别计算总的相同像素个数,则有最大相同数目的那一组数认为是相似度最大,则用此时的标准模板所对应的数字或字母作为最终识别的结果。
         
        3Matlab仿真结果
       
        用matlab对上述算法进行了仿真,仿真结果如下(仿真程序见附录):
       

        图3-1 原彩色图像

         

       
        图3-2  灰度图像

         

       

        图3-3  二值化后的图像

         

       

                                 
                                                                  
        图3-4  定位出的车牌图像

         

       

        图3-5  字符分割的结果

         
       
        将字符归一化为20*15的模板形式以后再与模板库里的字符相比较即可得到识别结果。
         

       

        图3-6  归一化后的模板

         

        模板库里的模板是与上面的具有相同大小的图像,将归一化后的图像与模板库里存储的图像进行比较运算,距离最小的即认为是判断字符。
         
        从仿真结果来看,使用这种算法完全可以实现车牌识别,由于这种算法对每一个元素的处理过程非常清楚,可以由FPGA实现,从而可以保证整个系统的实时性,提高它的实用价值。
         
        5、附录
        Matlab仿真程序:
        主函数:
         
        RGB=imread('chepai.jpg');

        figure,imshow(RGB),title('??????');

        GRAY=rgb2gray(RGB);

        figure,imshow(GRAY),title('????????');

        %?¤???í??°ü?¨????±?????????±????????ó???????¨

        %????±???

        l=[0,1,0;1,-4,1;0,1,0];

        LAP=imfilter(GRAY,l);

        %????±????¨sobel??×???

        s=fspecial('sobel');

        DIV=imfilter(LAP,s);

        GRAY2=imsubtract(GRAY,DIV);

        %???????¨

        g=fspecial('gaussian',3,3);

        GRAY3=imfilter(GRAY2,g);

        %????±???

        %==================================================

        theta=0:180;

        RD=radon(GRAY3,theta);

        thetaiw=maxtheta(RD);

        GRAY4=imrotate(GRAY3,358);

        %

        %??????????

        BW=im2bw(GRAY4);

        %?????¨??

        [m,n]=size(BW);

        for x=1:m

            ch(x)=0;

        end

        %??????±?????

        for x=1:m

            for y=2:n

                if BW(x,y)~=BW(x,y-1)

                    ch(x)=ch(x)+1;

                end

            end

        end

        plot(ch),title('??±?????');

        %?·?¨??????????????±???

        k=1;

        for x=1:m

            if ch(x)>13

            p(k)=x;

            k=k+1;

            else

                if k<50

                    k=1;

                else break;

                end

            end

        end

        p(1)

        p(k-1)

        % p??°ü??????????±?????????13??????

        LINE=GRAY4(p(1):p(k-1),:);

        figure,imshow(LINE),title('??????????');

        LINE1=BW(p(1):p(k-1),:);

        figure,imshow(LINE1);

        %?·?¨??????×ó??±???

         

        for y=1:n

           col(y)=0;

        end

        for y=1:n

            for x=1:(k-1)

                col(y)=col(y)+LINE1(x,y);

            end

        end

        i=0;

        j=0;

        for y=2:n

            if col(y)>0

                if col(y-1)==0

                    i=i+1;

                    raise(i)=y;

                            end

            else

                if col(y-1)>0

                    j=j+1;

                    down(j)=y;

                  end

            end

        end

        CP=LINE1(:,raise(1):down(j));

        %??????????×?·?·???

        t=0;

        for a=1:(i-1)

            if raise(a+1)-down(a)>5

                t=t+1;

                raise1(t+1)=raise(a+1);

                down1(t)=down(a);

            end

        end

        raise1(1)=raise(1);

        down1(t+1)=down(j);

        w=raise(1);

        for u=1:(t+1)

            raise1(u)=raise1(u)-w+1;

            down1(u)=down1(u)-w+1;

        end

        ZF1=CP(:,raise1(1):down1(1));

        ZF2=CP(:,raise1(2):down1(2));

        ZF3=CP(:,raise1(3):down1(3));

        ZF4=CP(:,raise1(4):down1(4));

        ZF5=CP(:,raise1(5):down1(5));

        ZF6=CP(:,raise1(6):down1(6));

        ZF7=CP(:,raise1(7):down1(7));

        ZF8=CP(:,raise1(8):down1(8));

        figure,imshow(ZF1),title('×?·?1');

        figure,imshow(ZF2),title('×?·?2');

        figure,imshow(ZF3),title('×?·?3');

        figure,imshow(ZF4),title('×?·?4');

        figure,imshow(ZF5),title('×?·?5');

        figure,imshow(ZF6),title('×?·?6');

        figure,imshow(ZF7),title('×?·?7');

        figure,imshow(ZF8),title('×?·?8');

        MB1=temp(ZF1);

        MB2=temp(ZF2);

        MB3=temp(ZF3);

        MB4=temp(ZF4);

        MB5=temp(ZF5);

        MB6=temp(ZF6);

        MB7=temp(ZF7);

        MB8=temp(ZF8);

        figure,imshow(MB1);

        figure,imshow(MB2);

        figure,imshow(MB3);

        figure,imshow(MB4);

        figure,imshow(MB5);

        figure,imshow(MB6);

        figure,imshow(MB7);

        figure,imshow(MB8);

        subplot(2,4,1),imshow(MB1);

        subplot(2,4,2),imshow(MB2);

        subplot(2,4,3),imshow(MB3);

        subplot(2,4,4),imshow(MB4);

        subplot(2,4,5),imshow(MB5);

        subplot(2,4,6),imshow(MB6);

        subplot(2,4,7),imshow(MB7);

        subplot(2,4,8),imshow(MB8);

        求偏转角的子程序(maxtheta):

        function y =maxtheta(A)

        %UNTITLED Summary of this function goes here

        %   Detailed explanation goes here

        [m,n]=size(A);

        k=0;

        for i=1:m

            for j=1:n

                if A(i,j)>k

                    k=A(i,j);

                    x=i;

                    y=j;

                end

            end

        end

        制作模板的子程序(temp):

        function B=temp(A)

        %UNTITLED Summary of this function goes here

        %   Detailed explanation goes here

        [m,n]=size(A);

        B=zeros(20,15);

        C=zeros(20,n);

        a=m/19;

        a1=m/20;

        b=n/14,

        b1=n/15;

        %??????×?????20????????

        if m>=40

            for y=1:n

            for x=1:m

                c=uint8(x/a)+1;

                C(c,y)=C(c,y)+A(x,y);

            end

            end

        elseif m>=20

             for y=1:n

            for x=1:m

                c=uint8(x/a1);

                C(c,y)=C(c,y)+A(x,y);

            end

             end

        else

            for y=1:n

                for x=1:20

                    c=uint8(x*a1)

                    C(x,y)=A(c,y);

                end

            end

        end

         

        if n>=30

            for x=1:20

            for y=1:n

                d=uint8(y/b)+1;

                B(x,d)=B(x,d)+C(x,y);

            end

            end

        elseif n>=15

            for x=1:20

            for y=1:n

                d=uint8(y/b1);

                B(x,d)=B(x,d)+C(x,y);

            end

            end

        else

           for x=1:20

            for y=1:15

                d=uint8(y*b1);

                B(x,y)=C(x,d);

            end

            end

        end

        for x=1:20

            for y=1:15

                if B(x,y)~=0

                    B(x,y)=1;

                else

                    B(x,y)=0;

                end

            end

        end

         

        end

         

         
[table]                        [tr]                        [td]                                [table=98%]                                                                                        [tr]                                                        [td]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-8-3 05:29 , 耗时 0.227046 秒, 22 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表