我想通过简单的模板匹配来进行图像识别。

把预处理好的字符图片,分别与A到Z的样本图片进行模板匹配。

结果最大的表明相关性最大,就能够识别字符图片了。

在实际应用中。我用了openCV的matchTemplate()函数,可是未达到我想要点的效果。

matchTemplate()的功能是在图像中搜索出指定的模板,假设模板是从待搜索的图像中截取出来的,会有非常好的效果。可是假设模板不是待搜素图像的一部分,似乎达不到我想要的效果。

在尝试了matlab的corr2()后。发现corr2能非常好的解决我的问题。

double Card::corr2(Mat matA, Mat matB){
//计算两个同样大小矩阵的二维相关系数
double corr2 = 0; double Amean2 = 0;
double Bmean2 = 0;
for (int m = 0; m < matA.rows; m++) {
uchar* dataA = matA.ptr<uchar>(m);
uchar* dataB = matB.ptr<uchar>(m);
for (int n = 0; n < matA.cols;n++) {
Amean2 = Amean2 + dataA[n];
Bmean2 = Bmean2 + dataB[n];
}
}
Amean2 = Amean2 / (matA.rows * matA.cols);
Bmean2 = Bmean2 / (matB.rows * matB.cols); double Cov = 0;
double Astd = 0;
double Bstd = 0;
for (int m = 0; m < matA.rows; m++) {
uchar* dataA = matA.ptr<uchar>(m);
uchar* dataB = matB.ptr<uchar>(m);
for (int n = 0; n < matA.cols;n++) {
//协方差
Cov = Cov + (dataA[n] - Amean2) * (dataB[n] - Bmean2);
//A的方差
Astd = Astd + (dataA[n] - Amean2) * (dataA[n] - Amean2);
//B的方差
Bstd = Bstd + (dataB[n] - Bmean2) * (dataB[n] - Bmean2);
}
}
corr2 = Cov / (sqrt(Astd * Bstd)); return corr2;
}

//待搜索图像
Mat srcImage = imread("M:/图像处理实验/验证码/byx001.bmp",1);
Mat resizeMat = Mat::zeros(25, 25, CV_8UC3);
//缩放为25*25的矩阵。由于要相关匹配的模板大小为25*25
resize(srcImage,resizeMat,resizeMat.size()); //相关匹配
double ccorrVal[26] = {0}; double max = 0;
int count = 0;
for (int m = 0; m < 26; m++){
char recogPath[100] = {1};
strcpy(recogPath,"M://图像处理实验//验证码//大写字母//");
char num[2] = {1};
num[0] = 65 + m;
strcat(recogPath, num);
strcat(recogPath,".bmp"); Mat img_display;
resizeMat.copyTo( img_display );
Mat std = imread(recogPath,0); Mat resizeMatSTD = Mat::zeros(25, 25, CV_8UC3);
resize(std,resizeMatSTD,resizeMatSTD.size()); adaptiveThreshold(resizeMatSTD ,resizeMatSTD ,255 ,ADAPTIVE_THRESH_MEAN_C ,THRESH_BINARY,5,1); corr2Val[m] = corr2(resizeMatSTD,img_display); if (max <= corr2Val[m]){
max = corr2Val[m];
count = m;
}
}
char pathname[100]={1};
strcpy(pathname,"M://图像处理实验//验证码//test//字符_");
char num[10];
_itoa(i, num, 10);
strcat(pathname, num); char C[2] = {1};
C[0] = 65 + count;
strcat(pathname, C);
strcat(pathname,".bmp");
imwrite(pathname, resizeMat);

字符模板:

识别结果输出:

最新文章

  1. HBase单个RegionServer的region数目上限
  2. jquery validate.addMethod 正则表达式
  3. 删除对象中的key
  4. DevExpress 中根据数据库字典动态生成卡式菜单 z
  5. asp.net mvc将html编译
  6. 无需转化直接使用ESD映像文件安装系统简明教程
  7. delphi “Invalid floating point operation.”错误的解决方法
  8. js在web绘制在页上的圆
  9. tensorflow max_pool(最大池化)应用
  10. 2018 Multi-University Training Contest 2
  11. luogu2467/bzoj1925 地精部落 (dp)
  12. 转载一篇较为详细的caffe-ssd编译环境的搭建
  13. 修改MySQL的时区,涉及参数time_zone
  14. YAML描述与Python的对应关系
  15. 201621123008 《Java程序设计》第二周学习总结
  16. 简单的nginx模拟网站的负载均衡
  17. Java中响应结果工具类,可自定义响应码,内容,响应消息
  18. 精通linux设备驱动开发 笔记
  19. 给VS类文件添加默认头注释
  20. Django 和 html

热门文章

  1. 2CSS层叠规则(即引入CSS的三种不同方式的优先级)
  2. Lua相关回调总结【转】
  3. vue-cli的创建、基本配置和遇到的问题总结
  4. InputStream和Reader
  5. 用最简单的脚本完成supertab的基本功能并实现一个更加合理的功能
  6. JAVA和JVM运行原理揭秘
  7. Python 之__slots__的作用
  8. Spring处理自动装配的歧义性
  9. thinkphp里模版文件js无法使用if condition的问题
  10. 使用Scrapy爬取图书网站信息