字符分割
[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;//循環(huán)變量 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;//第二字符的結(jié)束位置 ?
????????????????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]; ??//第一個字符的結(jié)束位置 ?
????????????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) ?//判斷 最后一個字符的結(jié)束位置 是否越界 超出界限,如果沒有,則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); ?
??????????????
評論
查看更多