1. 程式人生 > >基於OpenCV 人工神經網路的噴碼字元識別(C++)

基於OpenCV 人工神經網路的噴碼字元識別(C++)

新手上路記本人做的第一個影象處理實驗
噴碼字元識別流程:讀圖——濾波——二值化——腐蝕——分割——ANN訓練——識別
本例程訓練類別14類(0-9,C、L、冒號、空格),每類樣本數量50張
搭配環境:VS2017+opencv3.4.1
語言:C++
由於工程有點大,下面進行簡單介紹,詳情見附件(附有完整的程式,實驗報告及論文)
程式執行效果:
在這裡插入圖片描述
在這裡插入圖片描述
影象預處理:
1.讀取影象

Mat pSrcImg = imread("D:\\1-檔案資料\\5-字元檢測\\識別圖片\\source3.bmp", 0);//從本地讀取灰度圖
imshow("原圖", pSrcImg);

2.濾波

Mat dst;
 blur(pSrcImg,dst,Size(7,7));
 imwrite(FilePath+"remove1.bmp", dst);
 imshow("remove1", dst);

3.二值化

Mat pDecImg;
pDecImg.create(pSrcImg.size(), pSrcImg.type()); //1通道
pDecImg = pSrcImg.clone();
threshold(pSrcImg, pDecImg,0,255,cv::THRESH_OTSU);
imshow("binary1", pDecImg);
imwrite(FilePath+"binary1.bmp", pDecImg);

4.腐蝕去噪

Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
 Mat out1;
 dilate(pDecImg, out1, element);
 imshow("腐蝕", out1);

5.影象分割

fenge(out1, 60, FilePath, ".bmp", 110);//分割函式原型及引數解釋見附件

分割在本專案中是重點和難點,一旦分割錯誤,整張圖片的識別也會出現錯誤。本程式的分割存在一些BUG,可根據個人需要自行修改或重新編寫。

6.將分割後的影象統一大小後儲存(後續進行分類)

Mat imagErode[24], readfile[24];
 string Pathfile, PathfileResize;
 int Namefile = 1, str1=1;
 for (int i = 0; i < 24; i++)
 {
  Pathfile = FilePath + to_string(Namefile) + ".bmp";
  PathfileResize = ResizeFilePath + to_string(Namefile) + ".bmp";
  Namefile++;
  readfile[i] = imread(Pathfile, 0);
  resize(readfile[i], imagErode[i],Size(14,28));
  imwrite(PathfileResize, imagErode[i]);
  }

將圖片統一大小為寬14長28(大小可更改),然後就可以分類收集樣本,此例收集樣本類別14,每類圖片數量50張。收集完樣本就要先進行ANN訓練,再識別。訓練是另外單獨的工程,每次識別時呼叫訓練好的.xml檔案,就不需要每次都重新訓練。訓練程式在附件給出。

在這裡插入圖片描述
7.識別(對整張圖片分割後的字元)

Mat Fengeimg[40], Resizeimage[40];
 string Pathfile1,PathfileResize;
 cout<<"識別結果為:"<<endl;
 for(int i = 0; i< CharactersNumber1+ CharactersNumber2; i++)
 {
  Pathfile1 = FilePath + to_string(i+1) + ".bmp";
  PathfileResize = FilePath +"resize\\" + to_string(i + 1) + ".bmp";
  Fengeimg[i] = imread(Pathfile1, 0);
  resize(Fengeimg[i], Resizeimage[i], Size(14, 28));
  imshow("字元"+to_string(i+1), Resizeimage[i]);
  imwrite(PathfileResize, Resizeimage[i]);
  predictann1(Resizeimage[i]);//識別函式,傳入引數為要識別的影象
  if (i == CharactersNumber1-1) cout<<endl;
 }

ANN訓練
訓練程式碼見附件https://download.csdn.net/download/weixin_41303441/10806458