当前位置:首页 > 天道酬勤 > 正文内容

卷积神经网络识别数字(基于神经网络的数字分类)

张世龙2021年12月20日 19:56天道酬勤1070

附件从原文下载即可。

//opencv2.4.9 vs2012 64位#包含windows.h #包含iostream #包含流#包含开放2 /开放v.hppusingname char * wchartochar (常数wchar _ t * WP ) { char *m_char; 英特尔=Widechartomultibyte (CP _ ACP,0,wp,wcslen(WP ),空值,0,空值,空值); m _ char=新字符; widechartomultibyte(CP_ACP,0,wp,wcslen(WP ),m _字符,len,空值,空值); m _ char='\0 '; 返回字符; wchar _ t *字符(常数字符* c ) { wchar _ t * m _字符; 英特尔至强=多字节解码器(CP _ ACP,0,c,条纹(c ),空值,0 ); m _ wchar=新wchar _ t [ len1]; 多通道(CP _ ACP,0,c,条纹(c ),m_wchar,len ); m _ wchar='\0 '; 返回米_字符; } wchar _ t *字串工具(常数) {常数符号* p=s.c _ str }; returnchartowchar(p } int main () {一致字符串文件格式=' *.png '; conststringperfilereadpath='字符样本'; 恒定采样数每类=20; //每种培训字符类型的数量const int class_mun=10 26; //训练文字等级数0-9 A-Z、O const int image_cols=8除外; 一致图像_行=16; 字符串文件读名称,文件读路径; 角色模板[ 256 ]; 浮动训练资料[类别_ mun *样本_ mun _ per类别] [影像_ rows *影像_课]={0}; //每行培训样本浮点标签[类_ mun *样本_每类] [类_ mun ]={0}; //训练样本标签for (英寸=0; I=第一类; I//不同的类(//导入各个类文件夹下的所有图像int j=0; //每种类型的读取图像张数计数if(I=9)/0-9 ) sprintf ) temp,' %d ',I ); //printf('%d\n ',I ); else//a-z { sprintf (临时,' %c ',i 55 ); //printf('%c\n ',i 55 ); 文件读取路径=文件读取路径'/' temp '/'文件格式; cout文件夹临时结束; 处理文件; lpctstr lpfilename=字符串路径; //指定搜索目录和文件类型。 例如,要搜索d驱动器的音频文件是' d :\*.MP3 ' win32 _ find _ datapnextinfo; //检索得到的文件信息保存在pNextInfo中; hfile=查找文件(文件名,下一信息); 请注意//pNextInfo,而不是pnextinfo; if (hfile==无效_处理_值) {连续; //搜索失败} //do-while循环导入do{if(pnextinfo.cfilename[0]=='.' )//过滤器和.continue; j; //读图//wcoutpNextInfo.cFileNameendl; //printf('%s\n ',wchartochar (下一个信息.文件名); //处理导入的图像的matsrcimage=im read (perfilereadpath )/' temp ]/' wchartochar ) pnextinfo.cfilename ),cv _ load _ iname 最终三线影像; 最大结果; size (src图像,resize图像,大小)图像行,图像行,(0,0 ) ) )。

,(0,0),CV_INTER_AREA);//使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现 threshold(resizeImage,trainImage,0,255,CV_THRESH_BINARY|CV_THRESH_OTSU); for(int k = 0; k<image_rows*image_cols; ++k) { trainingData[i*sample_mun_perclass+(j-1)][k] = (float)trainImage.data[k]; //trainingData[i*sample_mun_perclass+(j-1)][k] = (float)trainImage.at<unsigned char>((int)k/8,(int)k%8);//(float)train_image.data[k]; //cout<<trainingData[i*sample_mun_perclass+(j-1)][k] <<" "<< (float)trainImage.at<unsigned char>(k/8,k%8)<<endl; } }while (FindNextFile(hFile,&pNextInfo) && j<sample_mun_perclass);//如果设置读入的图片数量,则以设置的为准,如果图片不够,则读取文件夹下所有图片 } // Set up training data MatMat trainingDataMat(class_mun*sample_mun_perclass, image_rows*image_cols, CV_32FC1, trainingData);cout<<"trainingDataMat——OK!"<<endl; // Set up label data for(int i = 0;i <= class_mun-1; ++i) { for(int j = 0;j <= sample_mun_perclass - 1; ++j) { for(int k = 0;k < class_mun; ++k) { if(k == i) if (k == 18) { labels[i*sample_mun_perclass + j][1] = 1; } else if(k == 24) { labels[i*sample_mun_perclass + j][0] = 1; } else { labels[i*sample_mun_perclass + j][k] = 1; } else labels[i*sample_mun_perclass + j][k] = 0; } } } Mat labelsMat(class_mun*sample_mun_perclass, class_mun, CV_32FC1,labels);cout<<"labelsMat:"<<endl; ofstream outfile("out.txt"); outfile<<labelsMat;//cout<<labelsMat<<endl;cout<<"labelsMat——OK!"<<endl; //训练代码 cout<<"training start...."<<endl; CvANN_MLP bp; // Set up BPNetwork's parameters CvANN_MLP_TrainParams params; params.train_method=CvANN_MLP_TrainParams::BACKPROP; params.bp_dw_scale=0.001; params.bp_moment_scale=0.1; params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,10000,0.0001); //设置结束条件 //params.train_method=CvANN_MLP_TrainParams::RPROP; //params.rp_dw0 = 0.1; //params.rp_dw_plus = 1.2; //params.rp_dw_minus = 0.5; //params.rp_dw_min = FLT_EPSILON; //params.rp_dw_max = 50.; //Setup the BPNetwork Mat layerSizes=(Mat_<int>(1,5) << image_rows*image_cols,128,128,128,class_mun); bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM,1.0,1.0);//CvANN_MLP::SIGMOID_SYM //CvANN_MLP::GAUSSIAN //CvANN_MLP::IDENTITY cout<<"training...."<<endl; bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params); bp.save("../bpcharModel.xml"); //save classifier cout<<"training finish...bpModel1.xml saved "<<endl; //测试神经网络cout<<"测试:"<<endl;Mat test_image = imread("test4.png",CV_LOAD_IMAGE_GRAYSCALE);Mat test_temp;resize(test_image,test_temp,Size(image_cols,image_rows),(0,0),(0,0),CV_INTER_AREA);//使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现threshold(test_temp,test_temp,0,255,CV_THRESH_BINARY|CV_THRESH_OTSU);Mat_<float>sampleMat(1,image_rows*image_cols); for(int i = 0; i<image_rows*image_cols; ++i) { sampleMat.at<float>(0,i) = (float)test_temp.at<uchar>(i/8,i%8); } Mat responseMat; bp.predict(sampleMat,responseMat); Point maxLoc;double maxVal = 0;minMaxLoc(responseMat,NULL,&maxVal,NULL,&maxLoc); if (maxLoc.x <= 9)//0-9 { sprintf(temp, "%d", maxLoc.x); //printf("%d\n", i); } else//A-Z { sprintf(temp, "%c", maxLoc.x + 55); //printf("%c\n", i+55); } cout<<"识别结果:"<<temp<<"相似度:"<<maxVal*100<<"%"<<endl;imshow("test_image",test_image); waitKey(0);return 0;}

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/25841.html

标签: charmunconst
分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。