基于模板匹配的数字识别,将标准的8*16像素的数字0123456789读取,二值化,对每个数字进行等分区域分割,统计每个区域内的黑色像素点的个数,即为特征初值。采用欧式距离的模板匹配法。
z//基于模板匹配的数字识别
#include<stdio.h>
#include<cv.h>
#include<highgui.h>
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
IplImage *imadata0,*imadata1,*imadata2,*imadata3,*imadata4,*imadata5,*imadata6,*imadata7,*image;
image=cvLoadImage("G:\\test.bmp",0); //读取测试的数字
imadata0=cvLoadImage("G:\\0.bmp",0);
imadata1=cvLoadImage("G:\\1.bmp",0);
imadata2=cvLoadImage("G:\\2.bmp",0);
imadata3=cvLoadImage("G:\\3.bmp",0);
imadata4=cvLoadImage("G:\\4.bmp",0);
imadata5=cvLoadImage("G:\\5.bmp",0);
imadata6=cvLoadImage("G:\\6.bmp",0);
imadata7=cvLoadImage("G:\\7.bmp",0);
cvNamedWindow("image",2);
cvShowImage("image",image);
cvWaitKey(0);
//将8*16的图像直接分割为4*4
int row_1,col_1;
unsigned char *ptr,*ptr_1[8];
// scanf("%d,%d",row_1,col_1);
row_1=2,col_1=4;
int stepx=image->width/row_1;
int stepy=image->height/col_1;
// int count=row_1*col_1;
unsigned char counter[8]={'\n'};
unsigned char counter_1[8][8]={'\n'};
for(int row=0;row<row_1;row++)
{
for(int col=0;col<col_1;col++)
{
for(int i=0+stepx*row;i<stepx*(row+1);i++)
{
for(int j=0+stepy*col;j<stepy*(col+1);j++)
{
ptr=(unsigned char*)image->imageData+i*image->widthStep+j;
if(*ptr<100)
counter[row*col_1+col]+=1;
ptr_1[0]=(unsigned char*)imadata0->imageData+i*image->widthStep+j;
if(*ptr_1[0]<100)
counter_1[0][row*col_1+col]+=1;
ptr_1[1]=(unsigned char*)imadata1->imageData+i*image->widthStep+j;
if(*ptr_1[1]<100)
counter_1[1][row*col_1+col]+=1;
ptr_1[2]=(unsigned char*)imadata2->imageData+i*image->widthStep+j;
if(*ptr_1[2]<100)
counter_1[2][row*col_1+col]+=1;
ptr_1[3]=(unsigned char*)imadata3->imageData+i*image->widthStep+j;
if(*ptr_1[3]<100)
counter_1[3][row*col_1+col]+=1;
ptr_1[4]=(unsigned char*)imadata4->imageData+i*image->widthStep+j;
if(*ptr_1[4]<100)
counter_1[4][row*col_1+col]+=1;
ptr_1[5]=(unsigned char*)imadata5->imageData+i*image->widthStep+j;
if(*ptr_1[5]<100)
counter_1[5][row*col_1+col]+=1;
ptr_1[6]=(unsigned char*)imadata6->imageData+i*image->widthStep+j;
if(*ptr_1[6]<100)
counter_1[6][row*col_1+col]+=1;
ptr_1[7]=(unsigned char*)imadata7->imageData+i*image->widthStep+j;
if(*ptr_1[7]<100)
counter_1[7][row*col_1+col]+=1;
}
}
}
}
for(int ci=0;ci<8;ci++)
{
printf("\n");
for(int cj=0;cj<8;cj++){
printf("%d\n",counter_1[ci][cj]);}
}
//欧氏距离
int dis[8];
double erdis(unsigned char counter[],unsigned char counter_1[][8]);
dis[0]=erdis(counter,counter_1);
// for(ci=0;ci<8;ci++)
printf("%d\n",dis[0]);
cvWaitKey(0);
return 0;
}
//欧氏距离,注意不同数据类型间的强制转换~
double erdis(unsigned char counter[],unsigned char counter_1[][8]){
int i,j;
double sumdis[8],sum;
sum=0;
double sum_1[8]={0};
/*归一化再求
// for(i=0;i<8;i++){
// for(j=0;j<8;j++){
// sum_1[i]=sum_1[i]+(double)counter_1[i][j];
// }
// sum=sum+(double)counter[i];
// printf("%f %f\n",sum_1[i],sum);
// }
// for(i=0;i<8;i++){
// for(j=0;j<8;j++)
// {
// counter_1[i][j]=(1000*(double)counter_1[i][j])/sum_1[i];
// counter[i]=(1000*(double)counter[i])/sum;
// printf("%d ",counter_1[i][j]);
// }
// printf("%d\n",counter[i]);
// }
*/
for(i=0;i<8;i++){
for(j=0;j<8;j++){
sumdis[i]=(int)(sumdis[i]+(int)pow(((int)counter_1[i][j]-(int)counter[j]),2));}
printf("%f\n",sumdis[i]);
}
void show(double sumdis[]);
show(sumdis);
return 0;
}
void show(double sumdis[]){
double temp;
int c;
temp=sumdis[0];
for(int rank=1;rank<8;rank++)
{
if(sumdis[rank]<temp)
{
temp=sumdis[rank];
c=rank;
printf("局部最佳匹配数%d\n",rank);
}
}
printf("最佳匹配数%d\n",c);
}