前面的文章详细的介绍了如何批量的读取图片并保存为csv文件,批量处理机器学习中尤为关键,掌握批量处理数据可以节省大量的人力,也能避免犯错。本文是上文的延续,下面将详细介绍怎么用BP算法实现对车牌的识别
实现工具
QT + Opencv实现思路
主要用下面六个函数进行实现<按顺调用>
.h类容(后面将详细讲解各个函数的作用和实现)
void normalizationPicture(string imagTxtRoute);
void writeImageToCSV(string);
void readCSV();
void practiceXML
int predictTest(string picRoute);//预测图片数字
Mat MatToMatrix(Mat srcImage);
他们的作用以此为:
1-归一化图片同大小,训练矩阵的要求
2-将图片批量转换为csv文件 (实现详见上篇博文)
http://blog.csdn.net/qq_33789319/article/details/78965196
3-将得到矩阵ANN训练的
4-训练样本矩阵,和目标矩阵并保存为xml文件,便于下次加载数据,避免重复训练样本
5-将图片转换为1*n矩阵(预测矩阵要求格式)
3-函数的具体实现代码如下,解释都已经详细注解,相信已经没有阅读难度了
- 具体代码实现
.cpp代码如下
void ImagePreprocessing::practiceXML()
{
CvANN_MLP bp;
CvANN_MLP_TrainParams params;
params.train_method = CvANN_MLP_TrainParams::BACKPROP;
params.bp_dw_scale = 0.1;
params.bp_moment_scale = 0.1;
Mat layerSizes = (Mat_<int>(1,3) << 64,64,10);
bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);
bp.train(input_,target_t,Mat(),Mat(),params);//全局变量的input_,target_t,在readCSV()之后得到;
bp.save("0_9.xml");//保存在构建目录下
return;
}
int ImagePreprocessing::predictTest(string picRoute)
{
int flagNumber = -1;
CvANN_MLP bpPre;
bpPre.load("0_9.xml");//读入训练好的xml文件
Mat preImage = imread(picRoute,0);//单通道读入
resize(preImage,preImage,Size(8,8),0,0,INTER_LINEAR);//对读入的图片进行尺寸规整,要求是输入1*64的矩阵
// imshow("preImage",preImage);
Mat Matrix = MatToMatrix(preImage);//MatToMatrix(Mat)把图片n*m矩阵展开为一行,1*64;
Mat outMat;//outMat 是存对输入图片预测后的值,那个值大,就代表这是几
bpPre.predict(Matrix,outMat);
float tempNum = -100;
for(int i = 0;i < outMat.cols; i++)
{
if(outMat.at<float>(i) >