/*四角变换后,显示一个复数图*/ void show_fft(Mat &m, SKImageDisplayer &idis) { Mat mixoutput = mixmatrix(m); normalize(mixoutput, mixoutput, 0, 255, CV_MINMAX); reswap4p(mixoutput); show_and_wait(&mixoutput, &idis); }
/*--------------------------------------------------------------------- r2l процесс последовательного отрезания букв справа на интервале (ib2,ie2) (или (ib1,ie2), если справа буква из списка); заканчивается, если весь интервал хорошо разрезался или очередная граница совпала с вершиной оптимального пути слева; вычисляет новые значения ie1, ie2, ir; ---------------------------------------------------------------------*/ static char r2l(int16_t *ir, int16_t *ie2, int16_t *ie1, int16_t mode) { int16_t i,x0; uchar let; seg_vers *cur_vers; struct cut_elm *cut; char cc; int16_t ie2p; //предыдущая ie2 struct cut_elm *cutb; //граница при движении по связным компонентам int16_t pmax; //наилучший результат int16_t set; //индекс множества точек разрезания int16_t ie0; int16_t wmin,wmax; //допустимая ширина буквы: мин. и макс. ie2p=*ie1; *ir=ibc=*ie2; cutb=cut_list+ibc; while (ibc > 0) { if (connect_) { //выбираем компоненту, добавляя узкие куски, лежащие недалеко x0=cut_list[*ie2].x; for (i=ibc-1,cut=cutb-1; i>=0; i--,cut--) { if (cut->dh != 0) continue; if (cut->rv.v3 > minp) break; //широкий просвет if (cutb->x-cut->x > sym_width && x0-cutb->x > sym_width) break; ibc=i; cutb=cut; //кандидат на конец } if (i<0) { i++; cut++; } if (cutb->x-cut->x <= sym_width || x0-cutb->x <= sym_width) { ibc=i; cutb=cut; } } else ibc=0; //режем *ir=*ie2; while (*ir > ibc) { version *vers0; char *ilet; int16_t ie1p=*ie1; if (ib2<*ie2 && ibc<=ib2 && cut_list[*ie2].x-cut_list[ib2].x <= w2) { ie0=*ie2; if ((addij(LC,r,cut_list,vers_list,ncut,ib2,ie0,0) & (2+4+8)) == 0) if (cut_list[*ie2].versm.vers[0].prob>trs2) { *ie1=*ir=ib2; goto accept; } } pmax=-1; wmin=w1; wmax=w2; for (set=1; set<=3; set++) { ie0=*ie2; //пробуем следующую cc=rcut_out(ibc,ie0,ie0,wmin,wmax,set,trs2,ir,&pmax,mode); if (cc) { *ie1=*ir; goto accept; } } wmin=minw; wmax=h2; for (set=1; set<=4; set++) { ie0=*ie2; cc=rcut_out(ibc,ie0,ie0,wmin,wmax,set,trs2,ir,&pmax,mode); //пробуем следующую if (cc) { *ie1=*ir; goto accept; } if (*ie1 != *ie2) { //справа буква может быть частью более широкой ie0=*ie1; cc=rcut_out(ibc,*ie2,ie0,minw,h2,set,trs2,ir,&pmax,mode); //расширяем предыдущую if (cc) { *ie1=*ie2; goto accept; } } } if (*ie2<ie2p) { ie0=*ie2; cc=radjust_cut(ibc,ir,&ie0,ie2p,minw,&pmax,mode); if (cc) { *ie1=*ir; goto accept; } } return 0; accept: *ie2=*ir; ie2p=ie0; let=0; if (cur_vers=find_vers(*ir,ie0,vers_list)) { vers0=&cur_vers->vers.vers[0]; let=vers0->let; if (let=='-') *ie1=ie1p; else if ( (let==(uchar)'т' || strchr(sticks_right_to_bad,let) ) && !is_russian_baltic_conflict(let) && // 17.07.2001 E.P. !is_russian_turkish_conflict(let) // 21.05.2002 E.P. ) *ie1=ie0; else if ( (ilet=strchr(letters_right_to_bad,let))!=0 && !is_russian_baltic_conflict(let) // 17.07.2001 E.P. ) if (vers0->prob < prob_right_to_bad[(uchar*)ilet-letters_right_to_bad]) *ie1=ie0; //может быть частью буквы } if (debug_on) #ifndef MY_DEBUG if (det_trace) #endif { sprintf(snap_text,"keep: (%d,%d) %c",*ir,ie0,let); show_and_wait(snap_text); } if (ib2>=*ie2) if (ib2==*ie2 || on_path(*ie2,ib2,cut_list)) return 1; } } return 1; }
/*--------------------------------------------------------------------- l2r процесс последовательного отрезания букв слева на интервале (*b2,ie2) (или (*b1,ie2), если слева буква из списка); заканчивается, если весь интервал хорошо разрезался или очередная граница совпала с вершиной оптимального пути справа; вычисляет новые значения ib1, ib2, il; ---------------------------------------------------------------------*/ static char l2r(int16_t *ib1, int16_t *ib2, int16_t *il) { int16_t i,x0; uchar let; struct cut_elm *cut; char cc; int16_t ib2p; //предыдущая ib2 struct cut_elm *cute;//граница при движении по связным компонентам int16_t pmax; //наилучший результат int16_t set; //индекс множества точек разрезания int16_t ib0; int16_t wmin,wmax; //допустимая ширина буквы: мин. и макс. ib2p=*ib1; *il=iec=*ib2; cute=cut_list+iec; while (iec < iemax) { if (connect_) { //выбираем компоненту, добавляя узкие куски, лежащие недалеко x0=cut_list[*ib2].x; for (i=iec+1,cut=cute+1; i<=iemax; i++,cut++) { if (cut->dh != 0) continue; if (cut->rv.v3 > minp) break; //широкий просвет if (cut->x-cute->x > sym_width && cute->x-x0 > sym_width) break; iec=i; cute=cut; //кандидат на конец } if (i>iemax) { i--; cut--; } if (cut->x-cute->x <= sym_width || cute->x-x0 <= sym_width) { iec=i; cute=cut; } } else iec=iemax; //режем *il=*ib2; while (*il<iec) { version *vers0; char *ilet; int16_t ib1p=*ib1; if (*ib2<ie2 && ie2<=iec && cut_list[ie2].x-cut_list[*ib2].x <= w2) { ib0=*ib2; if ((addij(LC,r,cut_list,vers_list,ncut,ib0,ie2,0) & (2+4+8)) == 0) if (cut_list[ie2].versm.vers[0].prob>trs2) { *ib1=*il=ie2; goto accept; } } pmax=-1; wmin=w1; wmax=w2; for (set=1; set<=3; set++) { ib0=*ib2; //пробуем следующую cc=lcut_out(ib0,*ib2,iec,wmin,wmax,set,trs2,il,&pmax); if (cc) { *ib1=*il; goto accept; } } wmin=minw; wmax=h2; for (set=1; set<=4; set++) { ib0=*ib2; cc=lcut_out(ib0,*ib2,iec,wmin,wmax,set,trs2,il,&pmax); //пробуем следующую if (cc) { *ib1=*il; goto accept; } if (*ib1 != *ib2) { //слева буква может быть частью более широкой ib0=*ib1; cc=lcut_out(ib0,*ib2,iec,minw,h2,set,trs2,il,&pmax); //расширяем предыдущую if (cc) { *ib1=*ib2; goto accept; } } } if (*ib2>ib2p) { ib0=*ib2; cc=ladjust_cut(ib2p,&ib0,il,iec,minw,&pmax); if (cc) { *ib1=*il; goto accept; } } return 0; accept: *ib2=*il; ib2p=ib0; let=0; vers0=&cut_list[*il].versm.vers[0]; let=vers0->let; if (let=='-') *ib1=ib1p; else if ( (let==(uchar)'т' || let==(uchar)'ш' || let==(uchar)'Ш' || strchr(sticks_left_to_bad,let) ) && !is_russian_baltic_conflict(let) &&// 17.07.2001 E.P. !is_russian_turkish_conflict(let) // 21.05.2002 E.P. ) *ib1=ib0; else if ( (ilet=strchr(letters_left_to_bad,let))!=0 && !is_russian_baltic_conflict(let) // 17.07.2001 E.P. ) if (vers0->prob < prob_left_to_bad[(uchar*)ilet-letters_left_to_bad]) *ib1=ib0; //может быть частью буквы if (debug_on) #ifndef MY_DEBUG if (det_trace) #endif { sprintf(snap_text,"keep: (%d,%d) %c",ib0,*il,let); show_and_wait(snap_text); } if (*ib2>=ie2) if (*ib2==ie2 || on_path(*ib2,iemax,cut_list)) return 1; if ( (let==(uchar)'ь' || let==(uchar)'Ь') && !is_russian_baltic_conflict(let) // 17.07.2001 E.P. ) { fl_b=1; return 0; } } } return 1; }