资源描述:
《基于opencv的手写数字字符识别.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、基于OpenCV的手写数字字符识别2013级计算机软件与理论摘要本程序主要参照论文,《基于OpenCV的脱机手写字符识别技术》实现了,对于手写阿拉伯数字的识别工作。识别工作分为三大步骤:预处理,特征提取,分类识别。预处理过程主要找到图像的ROI部分子图像并进行大小的归一化处理,特征提取将图像转化为特征向量,分类识别采用k-近邻分类方法进行分类处理,最后根据分类结果完成识别工作。程序采用MicrosoftVisualStudio2010与OpenCV2.4.4在Windows7-64位旗舰版系统下
2、开发完成。并在Windowsxp-32位系统下测试可用。主流程图:细化流程图:1.预处理预处理的过程就是找到图像的ROI区域的过程,如下图所示:首先找到数字的边界框,然后大小归一化数字图片,主要流程如下图所示:主要代码:IplImagepreprocessing(IplImage*imgSrc,intnew_width,intnew_height){IplImage*result;IplImage*scaledResult;CvMatdata;CvMatdataA;CvRectbb;//boun
3、dingboxCvRectbba;//boundinbboxmaintainaspectratio//Findboundingbox找到边界框bb=findBB(imgSrc);cvGetSubRect(imgSrc,&data,cvRect(bb.x,bb.y,bb.width,bb.height));intsize=(bb.width>bb.height)?bb.width:bb.height;result=cvCreateImage(cvSize(size,size),8,1);cvSet
4、(result,CV_RGB(255,255,255),NULL);//将图像放中间,大小归一化intx=(int)floor((float)(size-bb.width)/2.0f);inty=(int)floor((float)(size-bb.height)/2.0f);cvGetSubRect(result,&dataA,cvRect(x,y,bb.width,bb.height));cvCopy(&data,&dataA,NULL);//ScaleresultscaledResult=
5、cvCreateImage(cvSize(new_width,new_height),8,1);cvResize(result,scaledResult,CV_INTER_NN);//Returnprocesseddatareturn*scaledResult;//直接返回处理后的图片}1.特征提取在拿到ROI图像减少了信息量之后,就可以直接用图片作为向量矩阵作为输入:voidbasicOCR::getData(){IplImage*src_image;IplImageprs_image;CvM
6、atrow,data;charfile[255];inti,j;for(i=0;i7、(file,0);if(!src_image){printf("Error:Cantloadimage%s",file);//exit(-1);}//processfileprs_image=preprocessing(src_image,size,size);//生成训练矩阵,每个图像作为一个向量cvGetRow(trainClasses,&row,i*train_samples+j);cvSet(&row,cvRealScalar(i));//SetdatacvGetRow(trainD
8、ata,&row,i*train_samples+j);IplImage*img=cvCreateImage(cvSize(size,size),IPL_DEPTH_32F,1);//转换换8bitsimageto32位浮点数图片取值区间为[0,1]//scale = 0. = 1/255; cvConvertScale(&prs_image,img,0.,0);cvGetSubRect(img,&data,cvRect(0,0,size,size));CvMatrow_header,*row1