字符分割
[cpp] view plain copy
int CMyDialog::SegmentPlate()
{
// 没有切割成功,直接弹出
if (pImgResize==NULL)
{
return 0;
}
int *num_h=new int[MAX(pImgResize->width,pImgResize->height)];
if ( num_h==NULL )
{
MessageBox("字符分割memory exhausted");
return 0;
}
int i=0,j=0,k=0;//循环变量 12
int letter[14]={0,20,23,43,55,75,78,98,101,121,124,127,147,167}; // 默认分割
bool flag1=0;
// 垂直投影
for(i=0;i<40*HIGH_WITH_CAR;i++)
{
num_h[i]=0; // 初始化指针
for(j=0;j<17;j++) // 0-16
{
num_h[i]+=CV_IMAGE_ELEM(pImgResize,uchar,j,i)/45;
}
for(j=24;j<40;j++) // 24-39
{
num_h[i]+=CV_IMAGE_ELEM(pImgResize,uchar,j,i)/45;
}
}
// 初定位,定位点 第二个字符末端,
int max_count=0;
int flag=0;
for(i=30;i<40*HIGH_WITH_CAR;i++)
{
if(num_h[i]
max_count++;
if(max_count==11)
{
letter[3]=i-11;//第二字符的结束位置
while( (num_h[i]
break;
}
}
else
{
max_count=0;
}
}
// 精定位
for(i=0;i<40*HIGH_WITH_CAR;i++)
{
for(j=17;j<=24;j++)
{
num_h[i]+=CV_IMAGE_ELEM(pImgResize,uchar,j,i)/45;
}
}
for(j=letter[3];j>0;j--)//找第一个和第二个字符起始位置
{
if((num_h[j]
letter[2]=j; //第二个字符的开始位置
letter[1]=(j>=23)?j-3:letter[1]; //第一个字符的结束位置
letter[0]=(j>=23)?j-23:letter[0]; //第一个字符的起始位置
break;
}
}
j=2; flag=0;flag1=0;//两个标记
for(i=letter[4];i<40*HIGH_WITH_CAR;i++) //从第三个字符的开始位置算起
{
if((num_h[i]>POINT_Y)&&(num_h[i-1]>POINT_Y) && !flag )
{
flag=1;
flag1=0;
letter[2*j]=i-1; //这里 只记录字符的开始位置
if(j==6) //判断 最后一个字符的结束位置 是否越界 超出界限,如果没有,则letter[13]=letter[12]+20
{
letter[2*j+1]=((letter[2*j]+20)>40*HIGH_WITH_CAR-1)?40*HIGH_WITH_CAR-1:letter[2*j]+20;
break;
}
}
else if((num_h[i]
flag=0;
flag1=1;
letter[2*j+1]=i-1;
j++;
}
}
// 删除角点
for(i=0;i<40*HIGH_WITH_CAR-1;i++)
{
for(j=0;j<39;j++)
{
if(CV_IMAGE_ELEM(pImgResize,uchar,j,i)&&CV_IMAGE_ELEM(pImgResize,uchar,j,i+1)&&CV_IMAGE_ELEM(pImgResize,uchar,j+1,i)) // 01
CV_IMAGE_ELEM(pImgResize,uchar,j,i)=0; // 1
if(CV_IMAGE_ELEM(pImgResize,uchar,j,i)&& CV_IMAGE_ELEM(pImgResize,uchar,j,i-1) &&CV_IMAGE_ELEM(pImgResize,uchar,j+1,i)) // 10
CV_IMAGE_ELEM(pImgResize,uchar,j,i)=0; // 1
if(CV_IMAGE_ELEM(pImgResize,uchar,j,i)&&CV_IMAGE_ELEM(pImgResize,uchar,j,i-1) &&CV_IMAGE_ELEM(pImgResize,uchar,j-1,i)) // 1
CV_IMAGE_ELEM(pImgResize,uchar,j,i)=0; // 10
if(CV_IMAGE_ELEM(pImgResize,uchar,j,i)&&CV_IMAGE_ELEM(pImgResize,uchar,j,i+1) &&CV_IMAGE_ELEM(pImgResize,uchar,j-1,i)) // 1
CV_IMAGE_ELEM(pImgResize,uchar,j,i)=0; // 01
}
}
// 分割出字符图片
pImgCharOne=cvCreateImage(cvSize(20,40),IPL_DEPTH_8U,1);
pImgCharTwo=cvCreateImage(cvSize(20,40),IPL_DEPTH_8U,1);
pImgCharThree=cvCreateImage(cvSize(20,40),IPL_DEPTH_8U,1);
pImgCharFour=cvCreateImage(cvSize(20,40),IPL_DEPTH_8U,1);
pImgCharFive=cvCreateImage(cvSize(20,40),IPL_DEPTH_8U,1);
pImgCharSix=cvCreateImage(cvSize(20,40),IPL_DEPTH_8U,1);
pImgCharSeven=cvCreateImage(cvSize(20,40),IPL_DEPTH_8U,1);
CvRect ROI_rect1;
ROI_rect1.x=0.5*(letter[1]+letter[0])-10;
ROI_rect1.y=0;
ROI_rect1.width=20;
ROI_rect1.height=40;
cvSetImageROI(pImgResize,ROI_rect1);
cvCopy(pImgResize,pImgCharOne,NULL); //获取第1个字符
cvResetImageROI(pImgResize);
ROI_rect1.x=0.5*(letter[3]+letter[2])-10;
ROI_rect1.y=0;
ROI_rect1.width=20;
ROI_rect1.height=40;
cvSetImageROI(pImgResize,ROI_rect1);
cvCopy(pImgResize,pImgCharTwo,NULL); //获取第2个字符
cvResetImageROI(pImgResize);
评论
查看更多