基于BP神經網絡的字符識別
車牌字符識別是字符識別的重要組成部分。車牌字符識別的最終目的就是將圖像中的車牌字符轉化成文本字符,車牌字符的識別屬于印刷體識別范疇。
字符識別的基本思想是匹配判別。抽取待識別字符特征按照字符識別的原理和預先存儲在計算機中的標準字符模式表達形式的集合逐一進行匹配,找出最接近輸入字符模式的表達形式,該表達形式對應的字就是識別結果。字符識別的原理如下:
?
根據我國的車牌牌照標準,車牌第一位字符一般為漢字,車牌第二位英文大寫字母,第三位至第七位為英文大寫字母或數字。考慮到神經網絡對小類別字符集有較高的識別率,因此在車牌字符識別系統中,分別設計三個神經網絡:漢字網絡、字母網絡、字母數字網絡 實現對字符的分類識別。

?
以字母0為例,提取字符特征的步驟為:將分割好的圖片再分割成8*4的特征向量,形成一個32維的向量。最終字符特征提取的結果如下:

?
最終效果:

?
?
主要函數代碼:
圖像的預處理,加載圖像、并灰度化、高斯濾波[cpp] view plain copy
void CMyDialog::OnLoadimage() ??
{ ?
????// TODO: Add your control notification handler code here ?
????src = NULL ; ?
????CString filePath; ?
????CFileDialog dlg(TRUE, _T("*.bmp"),"",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,"image files (*.bmp; *.jpg) |*.bmp;*.jpg|All Files (*.*)|*.*||",NULL); ?
????char title[]= {"Open Image"}; ?
????dlg.m_ofn.lpstrTitle= title; ?
????if (dlg.DoModal() == IDOK) { ?
????????filePath= dlg.GetPathName(); ?
????????src=cvLoadImage(filePath); ?
????????DrawPicToHDC(src,IDC_IMAGESRC); ?
????} ????
????pImgCanny=cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1); ?
??????
????cvCvtColor(src,pImgCanny,CV_RGB2GRAY); ?
????cvSmooth(pImgCanny,pImgCanny,CV_GAUSSIAN,3,0,0); ??//平滑高斯濾波 ?濾波后的圖片保存在 pImgCanny ?????????????
} ?
?
自適應閾值法定義閾值
[cpp] view plain copy
int CMyDialog::AdaptiveThreshold(int t, IplImage *Image) ?
{ ?
????int t1=0,t2=0,tnew=0,i=0,j=0; ?
????int Allt1=0,Allt2=0,accountt1=0,accountt2=0; ?
????for(j=0;j
????{ ????
????????for(i=0;i
????????{ ?
????????????if(CV_IMAGE_ELEM(Image,uchar,j,i)
????????????????Allt1+=CV_IMAGE_ELEM(Image,uchar,j,i); ?
????????????????accountt1++; ?
????????????} ?
????????????else ??
????????????{ ?
????????????????Allt2+=CV_IMAGE_ELEM(Image,uchar,j,i); ?
????????????????accountt2++; ?
????????????} ?
????????} ?
????} ?
????t1=Allt1/accountt1; ?
????t2=Allt2/accountt2; ?
????tnew=0.5*(t1+t2); ?
????//若t1、t2的平均值和t相等,則閾值確定 ?
????if(tnew==t) ??
????????return tnew; ?
????//若不等,則以t1、t2的平均值為新閾值迭代 ?
????else ??
????????AdaptiveThreshold(tnew,Image); ??
} ?
??
評論