ROI_rect1.x=0.5*(letter[5]+letter[4])-10;
ROI_rect1.y=0;
ROI_rect1.width=20;
ROI_rect1.height=40;
cvSetImageROI(pImgResize,ROI_rect1);
cvCopy(pImgResize,pImgCharThree,NULL); //获取第3个字符
cvResetImageROI(pImgResize);
ROI_rect1.x=0.5*(letter[7]+letter[6])-10;
ROI_rect1.y=0;
ROI_rect1.width=20;
ROI_rect1.height=40;
cvSetImageROI(pImgResize,ROI_rect1);
cvCopy(pImgResize,pImgCharFour,NULL); //获取第4个字符
cvResetImageROI(pImgResize);
ROI_rect1.x=0.5*(letter[9]+letter[8])-10;
ROI_rect1.y=0;
ROI_rect1.width=20;
ROI_rect1.height=40;
cvSetImageROI(pImgResize,ROI_rect1);
cvCopy(pImgResize,pImgCharFive,NULL); //获取第5个字符
cvResetImageROI(pImgResize);
ROI_rect1.x=0.5*(letter[11]+letter[10])-10;
ROI_rect1.y=0;
ROI_rect1.width=20;
ROI_rect1.height=40;
cvSetImageROI(pImgResize,ROI_rect1);
cvCopy(pImgResize,pImgCharSix,NULL); //获取第6个字符
cvResetImageROI(pImgResize);
ROI_rect1.x=0.5*(letter[13]+letter[12])-10;
ROI_rect1.y=0;
ROI_rect1.width=20;
ROI_rect1.height=40;
cvSetImageROI(pImgResize,ROI_rect1);
cvCopy(pImgResize,pImgCharSeven,NULL); //获取第7个字符
cvResetImageROI(pImgResize);
// 释放内存
delete []num_h;
num_h=NULL;
}
字符识别
[cpp] view plain copy
int CMyDialog::CodeRecognize(IplImage *imgTest, int num, int char_num)
{
if (imgTest==NULL)
{
return 0;
}
int i=0,j=0,k=0,t=0;
int char_start=0,char_end=0;
int num_t[CHARACTER ]={0};
switch(num)//这里这样分 可以提高效率,并且提高了识别率
{
case 0: char_start =0; // 数字
char_end = 9;
break;
case 1: char_start =10; // 英文
char_end = 35;
break;
case 2: char_start =0; // 英文和数字
char_end = 35;
break;
case 3: char_start =36; // 中文
char_end = TEMPLETENUM-1;
break;
default: break;
}
// 提取前8个特征
for(k=0; k<8; k++)
{
for(j=int(k/2)*10; j
for(i=(k%2)*10;i<(k%2+1)*10;i++)
{
num_t[k]+=CV_IMAGE_ELEM(imgTest,uchar,j,i)/255 ;
}
}
// 第9个特征 前8个特征的和作为第9个特征值
num_t[8]+= num_t[k];
}
for(i=0;i<20;i++)
num_t[9]+=CV_IMAGE_ELEM(imgTest,uchar,10,i)/255 ;
for(i=0;i<20;i++)
num_t[10]+=CV_IMAGE_ELEM(imgTest,uchar,20,i)/255 ;
for(i=0;i<20;i++)
num_t[11]+=CV_IMAGE_ELEM(imgTest,uchar,30,i)/255 ;
for(j=0;j<40;j++)
num_t[12]+=CV_IMAGE_ELEM(imgTest,uchar,j,7)/255;
for(j=0;j<40;j++)
num_t[13]+=CV_IMAGE_ELEM(imgTest,uchar,j,10)/255 ;
for(j=0;j<40;j++)
num_t[14]+=CV_IMAGE_ELEM(imgTest,uchar,j,13)/255 ;
int num_tt[CHARACTER]={0};
int matchnum=0; //可以说是 匹配度或 相似度
int matchnum_max=0;
int matchcode = 0; // 匹配号
j=0;
for(k=char_start;k<=char_end;k++)
{
matchnum=0;
for(i=0;i<8;i++) //区域的匹配
{
if (abs(num_t[i]-Num_Templete[k][i])<=2)//与模板里的相应值进行匹配
matchnum++;
}
if(Num_Templete[k][i]-abs(num_t[i])<=8)//对第9个特征进行匹配
matchnum+=2;
for(i=9;i
if (Num_Templete[k][i]>=5) //特征值 大于5
{
if(abs(num_t[i]-Num_Templete[k][i])<=1)
matchnum+=2;
}
else if( num_t[i]==Num_Templete[k][i])
{
matchnum+=2;
}
}
if(matchnum>matchnum_max)
{
matchnum_max=matchnum; //保留最大的 匹配
matchcode= k; //记录 识别的字符的 索引
}
}
//识别输出 存放输出结果
G_PlateChar[char_num]=PlateCode[matchcode]; //保存下该字符
}
评论
查看更多