數(shù)字圖像處理實(shí)習(xí)報(bào)告--ocr-車牌號碼識(shí)別_第1頁
已閱讀1頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  數(shù)字圖像處理實(shí)習(xí)報(bào)告</p><p>  實(shí)習(xí)項(xiàng)目名稱: OCR-車牌號碼識(shí)別 </p><p>  所屬課程名稱: 數(shù)字圖像處理 </p><p>  班 級: </p><p>  學(xué)

2、 號: </p><p>  姓 名: </p><p>  指導(dǎo)教師: </p><p><b>  目 錄</b></p><

3、p><b>  一、實(shí)習(xí)目的3</b></p><p><b>  二、實(shí)習(xí)原理3</b></p><p><b>  三、實(shí)習(xí)步驟4</b></p><p>  3.1完成車牌定位的整個(gè)過程4</p><p>  3.2水平差分提取圖象邊緣4</p>

4、;<p>  3.3 完成圖象車牌區(qū)域的初步定位。4</p><p>  3.4利用先驗(yàn)知識(shí)標(biāo)識(shí)車牌區(qū)域,進(jìn)行車牌區(qū)域的選擇4</p><p>  3.5水平查找后,縱向查找。完成圖象車牌區(qū)域的初步定位。5</p><p>  3.6利用先驗(yàn)知識(shí)標(biāo)識(shí)車牌區(qū)域,進(jìn)行車牌區(qū)域的選擇,(橫縱向)5</p><p>  3.7計(jì)

5、算偽車牌區(qū)的跳變平均數(shù)5</p><p>  3.8找出所有偽車牌區(qū)域中具有最大跳變平均數(shù)的區(qū)域號,精確定位車牌5</p><p>  3.91找出車牌的左右邊緣6</p><p>  3.92二值化圖象6</p><p>  3.93車牌字符分割6</p><p>  3.94水平方向投影,分割出字符6&

6、lt;/p><p><b>  四、實(shí)驗(yàn)程序6</b></p><p><b>  五、實(shí)習(xí)結(jié)果24</b></p><p><b>  六、實(shí)習(xí)心得28</b></p><p><b>  一、實(shí)習(xí)目的</b></p><p>

7、  (1) 掌握數(shù)字圖像處理的相關(guān)知識(shí)及算法。</p><p>  (2) 學(xué)習(xí)在VC 6.0環(huán)境下編寫車牌定位與識(shí)別程序。</p><p>  (3) 了解車牌定位方法,如邊緣檢測法,基于矢量量化的車牌定位法等。</p><p> ?。?) 了解車牌字符分割方法,如,投影法,基于車牌字符先驗(yàn)知識(shí)的字符分割方法等。</p><p> ?。?)

8、 了解車牌字符識(shí)別方法,如字符歸一化,投影法,基于數(shù)字和字母特征的模板匹配法。</p><p> ?。?) 運(yùn)用編寫的車牌定位與識(shí)別程序?qū)崿F(xiàn)在各種環(huán)境下車牌的識(shí)別。</p><p><b>  二、實(shí)習(xí)原理</b></p><p>  基于VC++圖像處理的汽車牌照識(shí)別系統(tǒng)主要包括車牌定位,字符車牌分割和車牌字符識(shí)別三個(gè)關(guān)鍵環(huán)節(jié)其識(shí)別流程圖如圖

9、 1所示。</p><p><b>  圖1 識(shí)別流程圖</b></p><p><b>  其中,</b></p><p>  原始圖像:原始的汽車圖像;</p><p>  圖像預(yù)處理:對采集到的圖像進(jìn)行濾波等處理以克服圖像干擾;</p><p>  車牌定位:計(jì)算邊緣

10、圖像的投影面積,尋找峰谷點(diǎn),大致確定車牌位置,再計(jì)算此連通域內(nèi)的寬高比,剔除不在域值范圍內(nèi)的連通域,最后得到的便為車牌區(qū)域;</p><p>  字符分割:利用投影檢測的字符定位分割方法得到車牌的字符;</p><p>  字符數(shù)據(jù)庫:為第6步的字符識(shí)別建立字符模板數(shù)據(jù)庫;</p><p>  字符識(shí)別:通過基于模板匹配的人工神經(jīng)網(wǎng)絡(luò)算法,通過特征對比或訓(xùn)練識(shí)別出相

11、關(guān)的字符,得到最后的汽車牌照,包括英文字母和數(shù)字。</p><p><b>  三、實(shí)習(xí)步驟</b></p><p>  請打開一個(gè)BMP格式的位圖文件:標(biāo)示圖象的坐標(biāo)標(biāo)示算子的坐標(biāo)標(biāo)識(shí)區(qū)域的地點(diǎn)</p><p>  3.1完成車牌定位的整個(gè)過程</p><p>  程序流程:1.產(chǎn)生副本</p><

12、p>  2.水平差分提取邊緣,尋找橫向的車牌帶狀區(qū)域</p><p>  3.垂直差分提取邊緣,尋找縱向的車牌帶狀區(qū)域</p><p>  4.利用先驗(yàn)知識(shí)標(biāo)識(shí)車牌區(qū)域,進(jìn)行車牌帶狀區(qū)域的選擇,(橫縱向)</p><p>  5 .構(gòu)造出車牌矩形域;</p><p>  6.再次利用利用跳變數(shù)選擇車牌矩形區(qū)域,進(jìn)行車牌區(qū)域的最終選擇;&

13、lt;/p><p>  7.精確定位車牌,即削弱車牌橫向?qū)挾龋?lt;/p><p><b>  8.更新圖象;</b></p><p>  3.2水平差分提取圖象邊緣</p><p>  程序流程:1.逐行掃描,sub=|f(x,y)-f(x,y+1)|;</p><p>  2.若差值小于20,則g(x

14、,y)=0;</p><p>  若差值大于30,則增強(qiáng)原圖象,令g(x,y)=g(x,y)+30;</p><p>  3.另最后一列全部為0,即黑色;</p><p>  3.3 完成圖象車牌區(qū)域的初步定位。</p><p>  程序流程: 1.利用間行掃描的方式找出跳變數(shù)最大的前10行;</p><p>  2

15、.對 Top 10 行進(jìn)行區(qū)域細(xì)粒度增長選擇;</p><p>  其相似度的選取為:0.7~1.3 倍的該行跳變總數(shù);</p><p>  3.二值化,threshold=255;</p><p>  4.任意選擇一列,最好不要邊緣列,可能有干擾(本程序選擇為第十列),搜 索出各個(gè)帶狀候選域,存入標(biāo)志;</p><p>  3.4利用先

16、驗(yàn)知識(shí)標(biāo)識(shí)車牌區(qū)域,進(jìn)行車牌區(qū)域的選擇</p><p>  函數(shù)說明:特定應(yīng)用條件,拍攝所得車牌的區(qū)域高度、寬度均有一定的范圍,其大小可以分析圖象后可得</p><p>  根據(jù)統(tǒng)計(jì)得到:車牌的頂部極少出現(xiàn)在高度小于100個(gè)像素的區(qū)域;</p><p>  車牌高度也一般大于20個(gè)像素。</p><p>  程序的最終結(jié)果為滿足條件的經(jīng)過擴(kuò)展

17、了的帶狀區(qū)域</p><p>  程序流程:1.舍棄區(qū)域頂部小于100的待選域</p><p>  2.選擇區(qū)域高度大于20的待選域</p><p>  3.區(qū)域擴(kuò)展,上下各增大5個(gè)像素。若頂部小于5,則頂部坐標(biāo)不變,高度加5;</p><p>  若底部大于圖象的底部,則底部坐標(biāo)不變,高度加5;</p><p>  

18、3.5水平查找后,縱向查找。完成圖象車牌區(qū)域的初步定位。</p><p>  程序流程: 1.利用間行掃描的方式找出跳變數(shù)最大的前30行;</p><p>  2.對 Top 30 行進(jìn)行區(qū)域增長;</p><p>  其相似度的選取為:0.8~1.2 倍的該行跳變總數(shù);</p><p>  3.二值化,threshold=255;</

19、p><p>  4.任意選擇一列,(本程序選擇為第十行),搜索出各個(gè)帶狀候選域,存入標(biāo)志;</p><p>  3.6利用先驗(yàn)知識(shí)標(biāo)識(shí)車牌區(qū)域,進(jìn)行車牌區(qū)域的選擇,(橫縱向)</p><p>  函數(shù)說明:國家標(biāo)準(zhǔn):車牌的寬高比近似為3:1;</p><p>  程序流程:1.初始化存儲(chǔ)數(shù)組</p><p>  2.選擇區(qū)

20、域高寬比大于3的待選域</p><p>  函數(shù)功能:再次利用利用跳變數(shù)選擇車牌區(qū)域,進(jìn)行車牌區(qū)域的最終選擇,(橫縱向)</p><p>  程序流程:1.初始化存儲(chǔ)數(shù)組</p><p>  2.計(jì)算每個(gè)偽車牌區(qū)域的跳變數(shù)</p><p>  3.選擇具有最大跳變數(shù)的區(qū)域?yàn)檐嚺茀^(qū)</p><p>  3.7計(jì)算偽車牌區(qū)

21、的跳變平均數(shù)</p><p>  程序流程:1.初始化;</p><p>  2.水平差分,邊緣提??;</p><p>  3.選擇車牌的中間1/3行來計(jì)算每個(gè)偽車牌區(qū)域的跳變平均數(shù);</p><p>  3.8找出所有偽車牌區(qū)域中具有最大跳變平均數(shù)的區(qū)域號,精確定位車牌</p><p>  程序說明:選擇排序,由于水

22、平分割出的偽車牌區(qū)域已經(jīng)比較準(zhǔn)確,故僅作垂直方向的進(jìn)一步定位(縮小寬度)</p><p>  3.91找出車牌的左右邊緣</p><p>  程序流程:1.水平差分,二值化;</p><p>  2.垂直方向投影,統(tǒng)計(jì)各列的投影值;</p><p><b>  3.去除噪聲點(diǎn);</b></p><p&

23、gt;<b>  4.找出左右邊緣</b></p><p><b>  5.計(jì)算車牌寬度</b></p><p>  6.車牌精確定位賦值</p><p><b>  3.92二值化圖象</b></p><p>  程序說明:threshold=average+delt;<

24、;/p><p>  程序流程:1.計(jì)算圖象均值;</p><p><b>  2.計(jì)算圖象方差;</b></p><p><b>  3.二值化</b></p><p>  3.93車牌字符分割</p><p>  程序流程:1.區(qū)域擴(kuò)展;</p><p>

25、;<b>  2.投影分割;</b></p><p>  3.字符區(qū)域的獲??;</p><p>  3.94水平方向投影,分割出字符</p><p>  程序流程; 1.統(tǒng)計(jì)各列白象素個(gè)數(shù);</p><p><b>  2.平滑投影曲線;</b></p><p>  3.尋

26、找波谷(trough)進(jìn)行分割;</p><p><b>  四、實(shí)驗(yàn)程序</b></p><p><b>  3.1車牌識(shí)別</b></p><p>  /// <summary></p><p>  /// 函數(shù)功能:水平方向投影,分割出字符</p><p>

27、  /// 程序流程:1.統(tǒng)計(jì)各列白象素個(gè)數(shù);</p><p>  /// 2.平滑投影曲線;</p><p>  /// 3.尋找波谷(trough)進(jìn)行分割;</p><p>  // 二值化算法,二值化為0和1兩種值</p><p>  void CDipView::BinaryImg(BYTE*

28、 DisposeImg, int width , int height)</p><p><b>  {</b></p><p>  BYTE *temp=new BYTE[height*width];</p><p><b>  int x,y;</b></p><p>  CopyImg(Di

29、sposeImg,temp,width,height);</p><p>  long double total=0;</p><p>  float aver=0;</p><p>  for(x=0;x<height;x++)</p><p><b>  {</b></p><p>  

30、for(y=0;y<width;y++)</p><p><b>  {</b></p><p>  total+=DisposeImg[x*width+y];</p><p><b>  }</b></p><p><b>  }</b></p>

31、<p>  aver=(BYTE)(total/(float)(height*width));</p><p>  float delt; </p><p>  float sub=0; </p><p>  for(x=0;x<height;x++)</p><p><b>  {</b></p&

32、gt;<p>  for(y=0;y<width;y++)</p><p><b>  {</b></p><p>  sub+=(DisposeImg[x*width+y]-aver)*(DisposeImg[x*width+y]-aver); </p><p><b>  }</b>&l

33、t;/p><p><b>  }</b></p><p>  delt=(float)(sqrt(sub/(float)(height*width)));</p><p>  BYTE judge;</p><p>  judge=(BYTE)(delt+aver);</p><p>  for(x=

34、0;x<height;x++)</p><p><b>  {</b></p><p>  for(y=0;y<width;y++)</p><p><b>  {</b></p><p>  if(DisposeImg[(x*width)+y]>=judge)</p>

35、<p><b>  {</b></p><p>  DisposeImg[(x*width)+y]=(BYTE)1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b>

36、</p><p>  DisposeImg[(x*width)+y]=(BYTE)0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  free(temp);&

37、lt;/p><p><b>  }</b></p><p>  // Hilditch細(xì)化算法</p><p>  void CDipView::ThinnerHilditch(void* image, unsigned long lx, unsigned long ly)</p><p><b>  {</

38、b></p><p>  char *f, *g;</p><p>  char n[10];</p><p>  unsigned int counter;</p><p>  short k, shori, xx, nrn;</p><p>  unsigned long i, j;</p>&

39、lt;p>  long kk, kk11, kk12, kk13, kk21, kk22, kk23, kk31, kk32, kk33, size;</p><p>  size = (long)lx * (long)ly;</p><p>  g = (char *)malloc(size);</p><p>  if(g == NULL)</p&g

40、t;<p><b>  {</b></p><p>  printf("error in allocating memory!\n");</p><p><b>  return;</b></p><p><b>  }</b></p><p>

41、;  f = (char *)image;</p><p>  for(i=0; i<lx; i++)</p><p><b>  {</b></p><p>  for(j=0; j<ly; j++)</p><p><b>  {</b></p><p>  

42、kk=i*ly+j;</p><p>  if(f[kk]!=0)</p><p><b>  {</b></p><p><b>  f[kk]=1;</b></p><p>  g[kk]=f[kk];</p><p><b>  }</b><

43、/p><p><b>  }</b></p><p><b>  }</b></p><p>  counter = 1;</p><p><b>  do</b></p><p><b>  {</b></p><

44、p>  printf("%4d*",counter);</p><p>  counter++;</p><p>  shori = 0;</p><p>  for(i=0; i<lx; i++)</p><p><b>  {</b></p><p>  for

45、(j=0; j<ly; j++)</p><p><b>  {</b></p><p>  kk = i*ly+j;</p><p>  if(f[kk]<0)</p><p>  f[kk] = 0;</p><p>  g[kk]= f[kk];</p><p

46、><b>  }</b></p><p><b>  }</b></p><p>  for(i=1; i<lx-1; i++)</p><p><b>  {</b></p><p>  for(j=1; j<ly-1; j++)</p>&l

47、t;p><b>  {</b></p><p>  kk=i*ly+j;</p><p>  if(f[kk]!=1)</p><p><b>  continue;</b></p><p>  kk11 = (i-1)*ly+j-1;</p><p>  kk12 =

48、 kk11 + 1;</p><p>  kk13 = kk12 + 1;</p><p>  kk21 = i*ly+j-1;</p><p>  kk22 = kk21 + 1;</p><p>  kk23 = kk22 + 1;</p><p>  kk31 = (i+1)*ly+j-1;</p>

49、<p>  kk32 = kk31 + 1;</p><p>  kk33 = kk32 + 1;</p><p>  if((g[kk12]&&g[kk21]&&g[kk23]&&g[kk32])!=0)</p><p><b>  continue;</b></p>

50、<p>  nrn = g[kk11] + g[kk12] + g[kk13] + g[kk21] + g[kk23] + </p><p>  g[kk31] + g[kk32] + g[kk33];</p><p>  if(nrn <= 1)</p><p><b>  {</b></p><p>

51、  f[kk22] = 2;</p><p><b>  continue;</b></p><p><b>  }</b></p><p>  n[4] = f[kk11];</p><p>  n[3] = f[kk12];</p><p>  n[2] = f[kk13

52、];</p><p>  n[5] = f[kk21];</p><p>  n[1] = f[kk23];</p><p>  n[6] = f[kk31];</p><p>  n[7] = f[kk32];</p><p>  n[8] = f[kk33];</p><p>  n[9]

53、= n[1];</p><p><b>  xx = 0;</b></p><p>  for(k=1; k<8; k=k+2)</p><p><b>  {</b></p><p>  if((!n[k])&&(n[k+1]||n[k+2]))</p><

54、;p><b>  xx++;</b></p><p><b>  }</b></p><p><b>  if(xx!=1)</b></p><p><b>  {</b></p><p>  f[kk22] = 2;</p><

55、p><b>  continue;</b></p><p><b>  }</b></p><p>  if(f[kk12] == -1)</p><p><b>  {</b></p><p>  f[kk12] = 0;</p><p><

56、;b>  n[3] = 0;</b></p><p><b>  xx = 0;</b></p><p>  for(k=1; k<8; k=k+2)</p><p><b>  {</b></p><p>  if((!n[k])&&(n[k+1]||n[k

57、+2]))</p><p><b>  xx++;</b></p><p><b>  }</b></p><p>  if(xx != 1)</p><p><b>  {</b></p><p>  f[kk12] = -1;</p>

58、<p><b>  continue;</b></p><p><b>  }</b></p><p>  f[kk12] = -1;</p><p>  n[3] = -1;</p><p><b>  }</b></p><p>  if(

59、f[kk21]!=-1)</p><p><b>  {</b></p><p>  f[kk22] = -1;</p><p>  shori = 1;</p><p><b>  continue;</b></p><p><b>  }</b>&l

60、t;/p><p>  f[kk21] = 0;</p><p><b>  n[5] = 0;</b></p><p><b>  xx = 0;</b></p><p>  for(k=1; k<8; k=k+2)</p><p><b>  {</b&g

61、t;</p><p>  if((!n[k])&&(n[k+1]||n[k+2]))</p><p><b>  {</b></p><p><b>  xx++;</b></p><p><b>  }</b></p><p><

62、b>  }</b></p><p>  if(xx == 1)</p><p><b>  {</b></p><p>  f[kk21] = -1;</p><p>  f[kk22] = -1;</p><p><b>  shori =1;</b>&l

63、t;/p><p><b>  }</b></p><p><b>  else</b></p><p>  f[kk21] = -1;</p><p><b>  }</b></p><p><b>  }</b></p>

64、<p>  }while(shori);</p><p><b>  free(g);</b></p><p><b>  }</b></p><p><b>  // 細(xì)化算法</b></p><p>  void CDipView::ThinImage(BYTE

65、* image, int width, int height)</p><p><b>  {</b></p><p>  LONG x,y,k;</p><p>  BYTE image1[10000];</p><p><b>  k=0;</b></p><p>  L

66、ONG digitWidth = width;</p><p>  LONG digitHeight = height;</p><p>  for(x=0; x<digitWidth; x++)</p><p><b>  {</b></p><p>  image[x*width+0] = (BYTE)0;&l

67、t;/p><p>  image[x*width+digitHeight-1] = (BYTE)0;</p><p><b>  }</b></p><p>  for(y=0; y<digitHeight; y++)</p><p><b>  {</b></p><p>

68、;  image[0*width+y] = (BYTE)0;</p><p>  image[(digitWidth-1)*width+y] = (BYTE)0;</p><p><b>  }</b></p><p>  for(x=0; x<digitWidth; x++)</p><p><b> 

69、 {</b></p><p>  for(y=0; y<digitHeight; y++)</p><p><b>  {</b></p><p>  image1[k] = image[x*width+y];</p><p>  if(image1[k] != 0)</p><p&

70、gt;  image1[k] = (BYTE)1;</p><p><b>  k++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ThinnerHilditch((void *)image1, digitWid

71、th, digitHeight);</p><p><b>  k=0;</b></p><p>  for(x=0; x<digitWidth; x++)</p><p><b>  {</b></p><p>  for(y=0; y<digitHeight; y++)</p&

72、gt;<p><b>  {</b></p><p>  image[x*width+y] = image1[k];</p><p>  if(image[x*width+y]!=0)</p><p>  image[x*width+y] = (BYTE)1;</p><p><b>  k++;

73、</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  // 獲取特征值的函數(shù)</p><p>  void CDipView::GetFeatur

74、e(BYTE* image, long width, long height, double* feature, int size)</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>  for(i=0; i<13; i++)</p><

75、p>  feature[i] = 0;</p><p>  //圖象是20×36大小的,分成9塊</p><p><b>  //第一塊</b></p><p>  for(i=0; i<7; i++)</p><p><b>  {</b></p><p&

76、gt;  for(j=0; j<12; j++)</p><p><b>  {</b></p><p>  if(image[i*width+j]==1)</p><p>  feature[0]+=1.0;</p><p><b>  }</b></p><p>&

77、lt;b>  }</b></p><p><b>  //第二塊</b></p><p>  for(i=0; i<7; i++)</p><p><b>  {</b></p><p>  for(j=12; j<24; j++)</p><p&g

78、t;<b>  {</b></p><p>  if(image[i*width+j]==1)</p><p>  feature[1]+=1.0;</p><p><b>  }</b></p><p><b>  }</b></p><p><

79、b>  //第三塊</b></p><p>  for(i=0; i<7; i++)</p><p><b>  {</b></p><p>  for(j=24; j<36; j++)</p><p><b>  {</b></p><p> 

80、 if(image[i*width+j]==1)</p><p>  feature[2]+=1.0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //第四塊</b></p><p>  f

81、or(i=7; i<13; i++)</p><p><b>  {</b></p><p>  for(j=0; j<12; j++)</p><p><b>  {</b></p><p>  if(image[i*width+j]==1)</p><p> 

82、 feature[3]+=1.0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //第五塊</b></p><p>  for(i=7; i<13; i++)</p><p><

83、b>  {</b></p><p>  for(j=12; j<24; j++)</p><p><b>  {</b></p><p>  if(image[i*width+j]==1)</p><p>  feature[4]+=1.0;</p><p><b&g

84、t;  }</b></p><p><b>  }</b></p><p><b>  //第六塊</b></p><p>  for(i=7; i<13; i++)</p><p><b>  {</b></p><p>  for(

85、j=24; j<36; j++)</p><p><b>  {</b></p><p>  if(image[i*width+j]==1)</p><p>  feature[5]+=1.0;</p><p><b>  }</b></p><p><b>

86、  }</b></p><p><b>  //第七塊</b></p><p>  for(i=13; i<20; i++)</p><p><b>  {</b></p><p>  for(j=0; j<12; j++)</p><p><b

87、>  {</b></p><p>  if(image[i*width+j]==1)</p><p>  feature[6]+=1.0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  

88、//第八塊</b></p><p>  for(i=13; i<20; i++)</p><p><b>  {</b></p><p>  for(j=12; j<24; j++)</p><p><b>  {</b></p><p>  if(i

89、mage[i*width+j]==1)</p><p>  feature[7]+=1.0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //第九塊</b></p><p>  for(i=

90、13; i<20; i++)</p><p><b>  {</b></p><p>  for(j=24; j<36; j++)</p><p><b>  {</b></p><p>  if(image[i*width+j]==1)</p><p>  fe

91、ature[8]+=1.0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  //下面統(tǒng)計(jì)方向交點(diǎn)特征</p><p>  for(j=0; j<36; j++)</p><p><b>  {</b&

92、gt;</p><p>  if(image[7*width+j]==1)</p><p>  feature[9]+=1.0;</p><p><b>  }</b></p><p>  for(j=0; j<36; j++)</p><p><b>  {</b>&

93、lt;/p><p>  if(image[13*width+j]==1)</p><p>  feature[10]+=1.0;</p><p><b>  }</b></p><p>  for(i=0; i<20; i++)</p><p><b>  {</b><

94、;/p><p>  if(image[i*width+12]==1)</p><p>  feature[11]+=1.0;</p><p><b>  }</b></p><p>  for(i=0; i<20; i++)</p><p><b>  {</b></

95、p><p>  if(image[i*width+24]==1)</p><p>  feature[12]+=1.0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  // 識(shí)別函數(shù),第一個(gè)參數(shù)為LoadCharLib讀出的數(shù)

96、組,</p><p>  //第二個(gè)參數(shù)為LoadCharLib的返回值(即樣本個(gè)數(shù)),</p><p>  //將上面獲得的特征值傳入第三個(gè)參數(shù),返回為識(shí)別結(jié)果</p><p>  CString CDipView::Recognize(sample* sa, int num, double* feature)</p><p><b&

97、gt;  {</b></p><p><b>  int j;</b></p><p>  double min=100000.0;</p><p>  CString Result;</p><p>  for(int i=0;i<num;i++)</p><p><b&

98、gt;  {</b></p><p>  double diff = 0.0;</p><p>  for(j=0; j<9; j++)</p><p><b>  {</b></p><p>  diff += fabs(feature[j] - sa[num].feature[j]);</p&

99、gt;<p><b>  }</b></p><p>  for(j=9; j<13; j++)</p><p><b>  {</b></p><p>  diff += fabs(feature[j] - sa[num].feature[j])*9;</p><p><

100、b>  }</b></p><p>  if(diff < min)</p><p><b>  {</b></p><p>  min = diff;</p><p>  Result.Format("%s",sa[num].trueClass);</p>&l

101、t;p><b>  }</b></p><p><b>  }</b></p><p>  return Result;</p><p><b>  }*/</b></p><p><b>  // 字符識(shí)別</b></p><

102、p>  /*void CDipView::GetCharacter()</p><p><b>  {</b></p><p>  //CDipDoc *pDoc=GetDocument();</p><p>  //int width,height;</p><p>  //width=pDoc->ImgW

103、idth;</p><p>  //height=pDoc->ImgHeight;</p><p>  //sample mysa[500];</p><p>  // double myfeature[13];</p><p>  // int num;</p><p>  // CString r

104、esult[10];</p><p>  //BYTE*Img;</p><p>  //int row=0;</p><p>  //int col=0;</p><p>  //int x=-1;</p><p>  //int y=-1;</p><p>  //int w=0;</

105、p><p>  //int h=0;</p><p>  //int area=0;</p><p>  //for(area=0;area<10;area++);</p><p><b>  //{</b></p><p>  //if(cRects[area].w>0)</p

106、><p><b>  //{</b></p><p>  //x=cRects[area].x;</p><p>  //y=cRects[area].y;</p><p>  //w=cRects[area].w;</p><p>  //h=cRects[area].h;<

107、/p><p>  // Img=new BYTE[w*h];</p><p>  //for(row=0;row<h;row++)</p><p><b>  //{</b></p><p>  //for(col=0;col<w;col++)</p><p&

108、gt;<b>  //{</b></p><p>  // // Img[row*w+col]=pDoc->ImgData[y*width+x];</p><p><b>  //}</b></p><p><b>  //}</b>&l

109、t;/p><p>  //////num=LoadCharLib(mysa); //獲取樣本庫保存到mysa[500]中</p><p>  //////Zoom(Img,w,h); //對切割出的圖象進(jìn)行大小歸一化</p><p>  /////

110、/ThinImage(Img,w,h); //對大小歸一化后的圖象進(jìn)行細(xì)化</p><p>  //////GetFeature(Img,w,h,myfeature,13); //圖象細(xì)化以后就可以提取特征了</p><p>  //////result[area]=Recognize(mysa,num,myfea

111、ture);</p><p><b>  //}</b></p><p><b>  //}</b></p><p>  //delete []mysa;</p><p>  //delete []myfeature;</p><p>  //delete []resul

112、t;</p><p><b>  }*/</b></p><p>  void CDipView::OnCharacterRecg()</p><p><b>  {</b></p><p>  CMainFrame* MainFrame=(CMainFrame*)this->GetParen

113、t()->GetParent(); </p><p>  CCharView* pchview=(CCharView*)MainFrame->m_wndSplitter.GetPane(0,1); </p><p>  CDigitClass digitTest;</p><p>  CString classResult;</p><

114、;p>  CString tempstr;</p><p>  CString strInfo, strTemp;</p><p>  int recgpos=1;</p><p>  double temp[13];</p><p>  for(int k=0;k<CharacterNum;k++)</p><

115、;p><b>  {</b></p><p>  if ((float) cDatas[k].h/cDatas[k].w>4)</p><p><b>  {</b></p><p>  if (recgpos!=1&&recgpos<8)</p><p><

116、b>  {</b></p><p>  classResult=classResult+"1";</p><p>  recgpos++;</p><p><b>  }</b></p><p><b>  continue;</b></p>&

117、lt;p><b>  }</b></p><p>  for(int x=0;x<cDatas[k].h;x++)</p><p><b>  {</b></p><p>  for(int y=0;y<cDatas[k].w;y++)</p><p><b>  {&l

118、t;/b></p><p>  digitTest.digitarray[y][x]=cDatas[k].Img[x*cDatas[k].w+y];</p><p><b>  }</b></p><p><b>  }</b></p><p>  digitTest.digitHeight=

119、cDatas[k].h;</p><p>  digitTest.digitWidth=cDatas[k].w;</p><p>  digitTest.FixSize();</p><p>  digitTest.BinaryDigit();</p><p>  //digitTest.MarrBinary();</p>&l

120、t;p>  digitTest.ThinDigit_1();</p><p>  pchview->m_result.SetSel(0,-1);</p><p>  pchview->m_result.ReplaceSel("");</p><p>  CString strInfo, strTemp;</p>&

121、lt;p>  strInfo.Format("");</p><p><b>  int i,j;</b></p><p>  for(i=0; i<digitTest.digitHeight; i++)</p><p><b>  {</b></p><p>  f

122、or(j=0; j<digitTest.digitWidth; j++)</p><p><b>  {</b></p><p>  if(digitTest.digitarray[j][i] == 1)</p><p>  strInfo += "■";</p><p><b>  

123、else</b></p><p>  strInfo += " ";</p><p><b>  }</b></p><p>  strInfo += "\r\n";</p><p><b>  }</b></p><p>

124、;  pchview->m_result.SetSel(0,-1);</p><p>  pchview->m_result.ReplaceSel(strInfo);</p><p>  //AfxMessageBox("hello");</p><p>  digitTest.GetFeature();</p>&l

125、t;p>  if (recgpos==1)</p><p><b>  {</b></p><p>  double min=100000.0;</p><p>  POSITION pos=hanList.GetHeadPosition();</p><p>  while(pos!=NULL)</p>

126、;<p><b>  {</b></p><p>  Sample sa;</p><p>  sa=hanList.GetNext(pos);</p><p>  double diff = 0.0;</p><p>  for(j=0; j<9; j++)</p><p>

127、<b>  {</b></p><p>  diff += fabs(digitTest.feature[j] - sa.feature[j]);</p><p><b>  }</b></p><p>  for(j=9; j<13; j++)</p><p><b>  {<

128、;/b></p><p>  diff += fabs(digitTest.feature[j] - sa.feature[j])*9;</p><p><b>  }</b></p><p>  if(diff < min)</p><p><b>  {</b></p>

129、<p>  min = diff;</p><p>  tempstr.Format("%s",sa.trueClass);</p><p><b>  }</b></p><p><b>  }</b></p><p>  classResult=classResu

130、lt+tempstr;</p><p><b>  }</b></p><p>  if (recgpos==2)</p><p><b>  {</b></p><p>  double temp[13];</p><p>  double result1[26];<

131、/p><p><b>  bool t=0;</b></p><p>  for (i=0;i<13;i++)</p><p><b>  {</b></p><p>  temp[i]=digitTest.feature[i]/15;</p><p><b> 

132、 }</b></p><p>  char_bp.Identify(temp,13,result1,26);</p><p>  for(i=0;i<26;i++)</p><p><b>  {</b></p><p>  if (ABS(result1[i]-1)<0.1)</p>

133、<p><b>  {</b></p><p>  tempstr.Format("%c",i+'A');</p><p>  classResult=classResult+tempstr;</p><p><b>  t=1;</b></p><p&

134、gt;<b>  }</b></p><p><b>  }</b></p><p><b>  if(t!=1)</b></p><p>  classResult=classResult+'?';</p><p><b>  }</b>

135、</p><p>  //strTemp.Format("%d", classResult);</p><p>  if (recgpos==3)</p><p><b>  {</b></p><p>  double temp[13];</p><p>  double

136、result1[36];</p><p><b>  bool t=0;</b></p><p>  for (i=0;i<13;i++)</p><p><b>  {</b></p><p>  temp[i]=digitTest.feature[i]/15;</p><

137、;p><b>  }</b></p><p>  char_num_bp.Identify(temp,13,result1,36);</p><p>  for(i=0;i<36;i++)</p><p><b>  {</b></p><p>  if (ABS(result1[i]-

138、1)<0.2)</p><p><b>  {</b></p><p><b>  if(i<=9)</b></p><p><b>  {</b></p><p>  tempstr.Format("%c",i+'0');<

139、;/p><p>  classResult=classResult+tempstr;</p><p><b>  t=1;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {

140、</b></p><p>  tempstr.Format("%c",i+'A'-10);</p><p>  classResult=classResult+tempstr;</p><p><b>  t=1;</b></p><p><b>  }</

141、b></p><p>  //tempstr.Format("%c",i);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(t!=1)</b></p><p>

142、;  classResult=classResult+'?';</p><p><b>  }</b></p><p>  if (recgpos>3&&recgpos<8)</p><p><b>  {</b></p><p>  double tem

143、p[13];</p><p>  double result1[10];</p><p><b>  bool t=0;</b></p><p>  for (i=0;i<13;i++)</p><p><b>  {</b></p><p>  temp[i]=dig

144、itTest.feature[i]/15;</p><p><b>  }</b></p><p>  char_num_bp.Identify(temp,13,result1,10);</p><p>  for(i=0;i<10;i++)</p><p><b>  {</b></p

145、><p>  if (ABS(result1[i]-1)<0.1)</p><p><b>  {</b></p><p>  tempstr.Format("%c",i+'0');</p><p>  classResult=classResult+tempstr;</p&g

146、t;<p><b>  t=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(t!=1)</b></p><p>  classResult=classResult

147、+'?';</p><p><b>  }</b></p><p>  //strInfo += "\n\r識(shí)別結(jié)果為: ";</p><p>  //strInfo += classResult;</p><p>  recgpos++;</p><p>

148、;  //pchview->m_result.SetSel(0,-1);</p><p>  // pchview->m_result.ReplaceSel(strInfo);</p><p><b>  }</b></p><p>  //Sample temp;</p><p><b>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論