<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于FPGA的車牌識(shí)別系統(tǒng)

          基于FPGA的車牌識(shí)別系統(tǒng)

          作者: 時(shí)間:2017-06-04 來源:網(wǎng)絡(luò) 收藏

          (Intelligent Transportation System,ITS)是一種將計(jì)算機(jī)、信息、通訊及自動(dòng)化控制技術(shù)相結(jié)合的運(yùn)用于交通方面的現(xiàn)代化管理體系。它的主要功能是解決城市交通擁擠和堵塞問題,在不增加現(xiàn)有交通道路建設(shè)的情況下,運(yùn)用現(xiàn)代化的信息和通信方面的技術(shù),提高交通道路的通行能力,改善交通擁擠問題。

          本文引用地址:http://www.ex-cimer.com/article/201706/348703.htm

          (LicensePlateReeognition,LPR)是一種專用的計(jì)算機(jī)視覺系統(tǒng),在中占有極其重要的地位。該系統(tǒng)的主要功能是,從一副含有車牌的汽車圖片中,自動(dòng)定位出車牌圖像,并對(duì)車牌上的字符進(jìn)行分割,最后識(shí)別出分割后的單個(gè)字符。

          1、系統(tǒng)框圖

          整個(gè)系統(tǒng)可以大致分為下面幾個(gè)模塊:

          圖1-1 系統(tǒng)模塊圖

          系統(tǒng)的處理過程如下圖所示:

          圖1-2 系統(tǒng)處理流程

          2、算法介紹

          下面就對(duì)每個(gè)步驟的具體算法進(jìn)行介紹:

          預(yù)處理部分主要作用是為了增強(qiáng)圖像和去除噪聲,一邊在后續(xù)處理時(shí)減少誤差。使用的具體方法是先對(duì)圖像進(jìn)行和梯度變換來增強(qiáng)圖像的邊緣和細(xì)節(jié)。由于采集到的圖像所包含的噪聲屬于高斯噪聲,所以進(jìn)行來去噪[2]。

          拉式變換:

          拉式算子:

          上式中x值對(duì)應(yīng)像素點(diǎn)所在位置的行數(shù),y為所在位置的列數(shù),f(x,y)為在第x行y列的像素點(diǎn)的像素值。所以拉式變換就轉(zhuǎn)化為對(duì)待處理像素的鄰域像素的帶參運(yùn)算。

          梯度變換:

          梯度算子


          圖2-1 待處理像素鄰域像素

          同樣梯度算子轉(zhuǎn)換成相應(yīng)像素點(diǎn)的帶參運(yùn)算。的原理與和梯度變換相同,只是的參數(shù)是取自高斯函數(shù)。

          這樣就可以完成圖像的預(yù)處理過程

          車牌定位

          (1)運(yùn)用行掃描的方法定位牌照的上下邊界: 若某一行的0→1(白到黑)和1→0(黑到白) 變化次數(shù)大于設(shè)定的閾值(如13,車牌有7個(gè)字符,所以跳變至少14次), 則設(shè)其為待處理像素鄰域像素。

          待測(cè)車牌的最低點(diǎn),繼續(xù)掃描直 至0→1 和1→0 變化次數(shù)小于閾值,將該閾值設(shè)為待測(cè)車牌的最高點(diǎn)。若最高點(diǎn)與最低點(diǎn)之差大于15(即車牌圖像的高度),則認(rèn)為目標(biāo)已檢測(cè)到,否則繼續(xù)進(jìn)行掃描;如果未檢測(cè)到符合上述條件的目標(biāo),則自動(dòng)門限值重復(fù)以上的操作,直到找到目標(biāo)為止。

          (2)垂直投影法定位牌照的左右邊界:在找到車牌的上下限后,利用二值圖像在豎直方向上的投影作為特征, 從左到右尋找目標(biāo)的中心點(diǎn)坐標(biāo)。

          字符分割

          字符分割可采用垂直投影法。由于字符塊在豎直方向上的投影必然在字符間或字符內(nèi)的間隙處取得局部最小值, 因此字符的正確分割位置應(yīng)該在上述局部最小值的附近, 并且這個(gè)位置應(yīng)滿足車牌的字符書寫格式、字符尺寸限制和一些其他條件。

          利用垂直投影法, 對(duì)復(fù)雜環(huán)境下的汽車圖像中的字符分割有較好的效果。

          字符識(shí)別

          字符識(shí)別使用模板匹配法。

          首先將標(biāo)準(zhǔn)模板入庫(kù),把每一張“ 標(biāo)準(zhǔn)車牌”分割出來的字符歸一化, 接著將歸一化后的模板矩陣存入 中作為標(biāo)準(zhǔn)模板庫(kù)。采用20×15 bit 大小的數(shù)組作為標(biāo)準(zhǔn)模板。

          當(dāng)車牌上的待識(shí)別字符歸一化以后, 依次與標(biāo)準(zhǔn)庫(kù)中的模板進(jìn)行匹配,即矩陣對(duì)應(yīng)位依次做差,分別計(jì)算總的相同像素個(gè)數(shù),則有最大相同數(shù)目的那一組數(shù)認(rèn)為是相似度最大,則用此時(shí)的標(biāo)準(zhǔn)模板所對(duì)應(yīng)的數(shù)字或字母作為最終識(shí)別的結(jié)果。

          3、Matlab仿真結(jié)果


          用matlab對(duì)上述算法進(jìn)行了仿真,仿真結(jié)果如下(仿真程序見附錄):

          圖3-1 原彩色圖像


          圖3-2 灰度圖像

          圖3-3 二值化后的圖像

          圖3-4 定位出的車牌圖像

          圖3-5 字符分割的結(jié)果


          將字符歸一化為20*15的模板形式以后再與模板庫(kù)里的字符相比較即可得到識(shí)別結(jié)果。

          圖3-6 歸一化后的模板

          模板庫(kù)里的模板是與上面的具有相同大小的圖像,將歸一化后的圖像與模板庫(kù)里存儲(chǔ)的圖像進(jìn)行比較運(yùn)算,距離最小的即認(rèn)為是判斷字符。

          從仿真結(jié)果來看,使用這種算法完全可以實(shí)現(xiàn)車牌識(shí)別,由于這種算法對(duì)每一個(gè)元素的處理過程非常清楚,可以由實(shí)現(xiàn),從而可以保證整個(gè)系統(tǒng)的實(shí)時(shí)性,提高它的實(shí)用價(jià)值。

          5、附錄

          Matlab仿真程序:

          主函數(shù):

          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 k50

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

          求偏轉(zhuǎn)角的子程序(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



          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();