基于模板匹配的数字识别


基于模板匹配的数字识别,将标准的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);
}


  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值