Example #1
0
	/*四角变换后,显示一个复数图*/
	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);
	}
Example #2
0
/*---------------------------------------------------------------------
  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;
}
Example #3
0
/*---------------------------------------------------------------------
  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;
}