⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pitsync1.cpp

📁 一OCR的相关资料。.希望对研究OCR的朋友有所帮助.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                                 //min permissible  min_x = max_x - pitch + pitch_error * 2 + 1;  right_max = right_edge + pitch - pitch_error - 1;  segpts = new FPSEGPT_LIST;     //list of points  segpt_it.set_to_list (segpts);  for (x = min_x; x <= max_x; x++) {    segpt = new FPSEGPT (x);     //make a new one                                 //put in list    segpt_it.add_after_then_move (segpt);  }                                 //first segment  lattice_it.add_before_then_move (segpts);  min_index = 0;  region_index = 1;  best_cost = MAX_FLOAT32;  best_end = NULL;  min_it = *blob_it;  min_box = box_next (&min_it);  //first box  do {    left_best_x = -1;    right_best_x = -1;    segpts = new FPSEGPT_LIST;   //list of points    segpt_it.set_to_list (segpts);    min_x += pitch - pitch_error;//next limits    max_x += pitch + pitch_error;    while (min_box.right () < min_x && min_index < blob_count) {      min_index++;      min_box = box_next (&min_it);    }    max_it = min_it;    max_index = min_index;    max_box = min_box;    next_box = box_next (&max_it);    for (x = min_x; x <= max_x && x <= right_max; x++) {      while (x < right_edge && max_index < blob_count      && x > max_box.right ()) {        max_index++;        max_box = next_box;        next_box = box_next (&max_it);      }      if (x <= max_box.left () + pitch_error        || x >= max_box.right () - pitch_error || x >= right_edge        || max_index < blob_count - 1 && x >= next_box.left ()        || x - max_box.left () > pitch * pitsync_joined_edge      && max_box.right () - x > pitch * pitsync_joined_edge) {      //                      || projection->local_min(x))        if (x - max_box.left () > 0          && x - max_box.left () <= pitch_error)                                 //dist to real break          offset = x - max_box.left ();        else if (max_box.right () - x > 0          && max_box.right () - x <= pitch_error          && (max_index >= blob_count - 1          || x < next_box.left ()))          offset = max_box.right () - x;        else          offset = 0;        //                              offset=pitsync_offset_freecut_fraction*projection->pile_count(x);        segpt = new FPSEGPT (x, FALSE, offset, region_index,          pitch, pitch_error, lattice_it.data ());      }      else {        offset = projection->pile_count (x);        segpt = new FPSEGPT (x, TRUE, offset, region_index,          pitch, pitch_error, lattice_it.data ());      }      if (segpt->previous () != NULL) {        segpt_it.add_after_then_move (segpt);        if (x >= right_edge - pitch_error) {          segpt->terminal = TRUE;//no more wanted          if (segpt->cost_function () < best_cost) {            best_cost = segpt->cost_function ();            //find least            best_end = segpt;            best_region_index = region_index;            left_best_x = x;            right_best_x = x;          }          else if (segpt->cost_function () == best_cost            && right_best_x == x - 1)            right_best_x = x;        }      }      else {        delete segpt;            //no good      }    }    if (segpts->empty ()) {      if (best_end != NULL)        break;                   //already found one      make_illegal_segment (lattice_it.data (), min_box, min_it,        region_index, pitch, pitch_error, segpts);    }    else {      if (right_best_x > left_best_x + 1) {        left_best_x = (left_best_x + right_best_x + 1) / 2;        for (segpt_it.mark_cycle_pt (); !segpt_it.cycled_list ()          && segpt_it.data ()->position () != left_best_x;          segpt_it.forward ());        if (segpt_it.data ()->position () == left_best_x)                                 //middle of region          best_end = segpt_it.data ();      }    }                                 //new segment    lattice_it.add_before_then_move (segpts);    region_index++;  }  while (min_x < right_edge);  ASSERT_HOST (best_end != NULL);//must always find some  for (lattice_it.mark_cycle_pt (); !lattice_it.cycled_list ();  lattice_it.forward ()) {    segpts = lattice_it.data ();    segpt_it.set_to_list (segpts);    //              if (blob_count==8 && pitch==27)    //              {    //                      for (segpt_it.mark_cycle_pt();!segpt_it.cycled_list();segpt_it.forward())    //                      {    //                              segpt=segpt_it.data();    //                              tprintf("At %d, (%x) cost=%g, m=%g, sq=%g, pred=%x\n",    //                                      segpt->position(),segpt,segpt->cost_function(),    //                                      segpt->sum(),segpt->squares(),segpt->previous());    //                      }    //                      tprintf("\n");    //              }    for (segpt_it.mark_cycle_pt (); !segpt_it.cycled_list ()      && segpt_it.data () != best_end; segpt_it.forward ());    if (segpt_it.data () == best_end) {                                 //save good one      segpt = segpt_it.extract ();      outseg_it.add_before_then_move (segpt);      best_end = segpt->previous ();    }  }  ASSERT_HOST (best_end == NULL);  ASSERT_HOST (!outseg_it.empty ());  outseg_it.move_to_last ();  mean_sum = outseg_it.data ()->sum ();  mean_sum = mean_sum * mean_sum / best_region_index;  if (outseg_it.data ()->squares () - mean_sum < 0)    tprintf ("Impossible sqsum=%g, mean=%g, total=%d\n",      outseg_it.data ()->squares (), outseg_it.data ()->sum (),      best_region_index);  lattice.deep_clear ();         //shift the lot  return outseg_it.data ()->squares () - mean_sum;}/********************************************************************** * make_illegal_segment * * Make a fake set of chop points due to having no legal places. **********************************************************************/void make_illegal_segment(                          //find segmentation                          FPSEGPT_LIST *prev_list,  //previous segments                          BOX blob_box,             //bounding box                          BLOBNBOX_IT blob_it,      //iterator                          INT16 region_index,       //number of segment                          INT16 pitch,              //pitch estimate                          INT16 pitch_error,        //tolerance                          FPSEGPT_LIST *seg_list    //output list                         ) {  INT16 x;                       //current coord  INT16 min_x = 0;               //in this region  INT16 max_x = 0;  INT16 offset;                  //dist to edge  FPSEGPT *segpt;                //segment point  FPSEGPT *prevpt;               //previous point  float best_cost;               //best path  FPSEGPT_IT segpt_it = seg_list;//iterator                                 //previous points  FPSEGPT_IT prevpt_it = prev_list;  best_cost = MAX_FLOAT32;  for (prevpt_it.mark_cycle_pt (); !prevpt_it.cycled_list ();  prevpt_it.forward ()) {    prevpt = prevpt_it.data ();    if (prevpt->cost_function () < best_cost) {                                 //find least      best_cost = prevpt->cost_function ();      min_x = prevpt->position ();      max_x = min_x;             //limits on coords    }    else if (prevpt->cost_function () == best_cost) {      max_x = prevpt->position ();    }  }  min_x += pitch - pitch_error;  max_x += pitch + pitch_error;  for (x = min_x; x <= max_x; x++) {    while (x > blob_box.right ()) {      blob_box = box_next (&blob_it);    }    offset = x - blob_box.left ();    if (blob_box.right () - x < offset)      offset = blob_box.right () - x;    segpt = new FPSEGPT (x, FALSE, offset,      region_index, pitch, pitch_error, prev_list);    if (segpt->previous () != NULL) {      ASSERT_HOST (offset >= 0);      fprintf (stderr, "made fake at %d\n", x);                                 //make one up      segpt_it.add_after_then_move (segpt);      segpt->faked = TRUE;      segpt->fake_count++;    }    else      delete segpt;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -