1、在这个模块我们转换我们处理后的图像为一个特征向量以便于分类,它可能是像素矩阵转换成向量或者获取轮廓编码链的数据表示。分类模块获取特征向量,并训练我们的系统或者说使用一个分类方法(比如knn)把输入的特征向量分类。这个基础光学字符识别的流程图如下:现在我们有由图片组成的一个训练集和一个测试集来训练和测试我们的分类器(knn)。我们有1000张手写数字的图片,每个数字100张。我们使用每个数字的50张图片来训练,另外50张来测试我们的系统。接下来我们要做的第一个工作就是对所有训练集的图片预处理,为了完成它我们创建一个预处理函数。在这个函数中,我们输入一张图片和我们想要它在处理后得到的新的长和宽,这
2、个函数讲返回一个标准大小的带有边框的图片。你可以看到更多清楚的处理流程:预处理代码:void findX(IplImage* imgSrc,int* min, int* max)inti;intminFound=0;CvMat data;CvScalarmaxVal=cvRealScalar(imgSrc-width * 255);CvScalarval=cvRealScalar(0);/For each col sum, if sum width*255 then we find the min/then continue to end to search the max, if sum w
3、idth*255 then is new maxfor (i=0; iwidth; i+)cvGetCol(imgSrc, &data, i);val= cvSum(&data);if(val.val0 bb.height)?bb.width:bb.height;result=cvCreateImage( cvSize( size, size ), 8, 1 );cvSet(result,CV_RGB(255,255,255),NULL);/Copy de data in center of imageint x=(int)floor(float)(size-bb.width)/2.0f);i
4、nt y=(int)floor(float)(size-bb.height)/2.0f);cvGetSubRect(result, &dataA, cvRect(x,y,bb.width, bb.height);cvCopy(&data, &dataA, NULL);/Scale resultscaledResult=cvCreateImage( cvSize( new_width, new_height ), 8, 1 );cvResize(result, scaledResult, CV_INTER_NN);/Return processed datareturn *scaledResul
5、t;我们使用basicOCR类的getData函数来创建训练数据和训练类,这个函数获取所有在OCR文件夹下的图片来创建训练数据,OCR文件夹中的每个类是一个文件夹,其中每个文件都是名为cnn.pbm的pbm文件,c是类(0,1,.,9)中的一个,nn是图片的编号(00,01,.,99)。我们得到的每张图片都是预处理过的了,然后他们将转换成特征向量里的数据以便我们使用。basicOCR.cpp 获取数据代码:void basicOCR:getData()IplImage* src_image;IplImageprs_image;CvMatrow,data;char file255;inti,j;
6、for(i =0;classes;for( j = 0; jtrain_samples; j+)/Load fileif(j10)sprintf(file,%s%d/%d0%d.pbm,file_path, i, i , j);else%s%d/%d%d.pbmsrc_image = cvLoadImage(file,0);src_image)printf(Error: Cant load image %sn, file);/exit(-1);/process fileprs_image = preprocessing(src_image, size, size);/Set class lab
7、elcvGetRow(trainClasses, &row, i*train_samples + j);cvSet(&row, cvRealScalar(i);/Set datacvGetRow(trainData, &IplImage* img = cvCreateImage( cvSize( size, size ), IPL_DEPTH_32F, 1 );/convert 8 bits image to 32 float imagecvConvertScale(&prs_image, img, 0.0039215, 0);cvGetSubRect(img, &data, cvRect(0
8、,0, size,size);CvMatrow_header, *row1;/convert data matrix sizexsize to vecorrow1 = cvReshape( &row_header, 0, 1 );cvCopy(row1, &row, NULL);在处理并且得到训练数据和类以后我们用我们的模型训练这些数据,在这个例子中我们用knn方法:knn=new CvKNearest( trainData, trainClasses, 0, false, K );现在我们可以测试我们的模型了,并且我们可以使用测试的结果来和其它我们使用的方法比较,又或者我们减小图片大小等等。这里是在我们的basicOCR类里创建的一个函数,测试函数。这个函数获取其它500个样本并且用我们选择的方法分类,再检验得到的结果。test()int error=0;inttestCount=0;for( j = 50; 50+train_samples;Err
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1