基于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

猜你喜欢

转载自blog.csdn.net/weixin_41303441/article/details/84381942