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

📄 scanedg.cpp

📁 一OCR的相关资料。.希望对研究OCR的朋友有所帮助.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        else                                 //new horiz edge          current = h_edge (xpos, y, uppercolour - colour, *prevline);        *prevline = NULL;        //no change this time      }      else {        if (colour == uppercolour)          *prevline = v_edge (xpos, y, colour - prevcolour, *prevline);                                 //8 vs 4 connection        else if (colour == WHITE_PIX) {          join_edges(current, *prevline);          current = h_edge (xpos, y, uppercolour - colour, NULL);          *prevline = v_edge (xpos, y, colour - prevcolour, current);        }        else {          newcurrent = h_edge (xpos, y, uppercolour - colour, *prevline);          *prevline = v_edge (xpos, y, colour - prevcolour, current);          current = newcurrent;  //right going h edge        }        prevcolour = colour;     //remember new colour      }    }    else {      if (colour != prevcolour) {        *prevline = current =          v_edge (xpos, y, colour - prevcolour, current);        prevcolour = colour;      }      if (colour != uppercolour)        current = h_edge (xpos, y, uppercolour - colour, current);      else        current = NULL;          //no edge now    }  }  if (current != NULL) {                                 //out of block    if (*prevline != NULL) {     //got one to join to?      join_edges(current, *prevline);      *prevline = NULL;          //tidy now    }    else {                                 //fake vertical      *prevline = v_edge (xpos, y, FLIP_COLOUR(prevcolour)-prevcolour, current);    }  }  else if (*prevline != NULL)                                 //continue fake    *prevline = v_edge (xpos, y, FLIP_COLOUR(prevcolour)-prevcolour, *prevline);}/********************************************************************** * h_edge * * Create a new horizontal CRACKEDGE and join it to the given edge. **********************************************************************/CRACKEDGE *h_edge (                         //horizontal edgeINT16 x,                         //xpositionINT16 y,                         //y positionINT8 sign,                       //sign of edgeCRACKEDGE * join                 //edge to join to) {  CRACKEDGE *newpt;              //return value  //      check_mem("h_edge",JUSTCHECKS);  if (free_cracks != NULL) {    newpt = free_cracks;    free_cracks = newpt->next;   //get one fast  }  else {    newpt = new CRACKEDGE;  }  newpt->pos.set_y (y + 1);      //coords of pt  newpt->stepy = 0;              //edge is horizontal  if (sign > 0) {    newpt->pos.set_x (x + 1);    //start location    newpt->stepx = -1;    newpt->stepdir = 0;  }  else {    newpt->pos.set_x (x);        //start location    newpt->stepx = 1;    newpt->stepdir = 2;  }  if (join == NULL) {    newpt->next = newpt;         //ptrs to other ends    newpt->prev = newpt;  }  else {    if (newpt->pos.x () + newpt->stepx == join->pos.x ()    && newpt->pos.y () == join->pos.y ()) {      newpt->prev = join->prev;  //update other ends      newpt->prev->next = newpt;      newpt->next = join;        //join up      join->prev = newpt;    }    else {      newpt->next = join->next;  //update other ends      newpt->next->prev = newpt;      newpt->prev = join;        //join up      join->next = newpt;    }  }  return newpt;}/********************************************************************** * v_edge * * Create a new vertical CRACKEDGE and join it to the given edge. **********************************************************************/CRACKEDGE *v_edge (                         //vertical edgeINT16 x,                         //xpositionINT16 y,                         //y positionINT8 sign,                       //sign of edgeCRACKEDGE * join                 //edge to join to) {  CRACKEDGE *newpt;              //return value  if (free_cracks != NULL) {    newpt = free_cracks;    free_cracks = newpt->next;   //get one fast  }  else {    newpt = new CRACKEDGE;  }  newpt->pos.set_x (x);          //coords of pt  newpt->stepx = 0;              //edge is vertical  if (sign > 0) {    newpt->pos.set_y (y);        //start location    newpt->stepy = 1;    newpt->stepdir = 3;  }  else {    newpt->pos.set_y (y + 1);    //start location    newpt->stepy = -1;    newpt->stepdir = 1;  }  if (join == NULL) {    newpt->next = newpt;         //ptrs to other ends    newpt->prev = newpt;  }  else {    if (newpt->pos.x () == join->pos.x ()    && newpt->pos.y () + newpt->stepy == join->pos.y ()) {      newpt->prev = join->prev;  //update other ends      newpt->prev->next = newpt;      newpt->next = join;        //join up      join->prev = newpt;    }    else {      newpt->next = join->next;  //update other ends      newpt->next->prev = newpt;      newpt->prev = join;        //join up      join->next = newpt;    }  }  return newpt;}/********************************************************************** * join_edges * * Join 2 edges together. Send the outline for approximation when a * closed loop is formed. **********************************************************************/void join_edges(                   //join edge fragments                CRACKEDGE *edge1,  //edges to join                CRACKEDGE *edge2   //no specific order               ) {  CRACKEDGE *tempedge;           //for exchanging  if (edge1->pos.x () + edge1->stepx != edge2->pos.x ()  || edge1->pos.y () + edge1->stepy != edge2->pos.y ()) {    tempedge = edge1;    edge1 = edge2;               //swap araound    edge2 = tempedge;  }  //      tprintf("Joining %x=(%d,%d)+(%d,%d)->%x<-%x ",  //              edge1,edge1->pos.x(),edge1->pos.y(),edge1->stepx,edge1->stepy,  //              edge1->next,edge1->prev);  //      tprintf("to %x=(%d,%d)+(%d,%d)->%x<-%x\n",  //              edge2,edge2->pos.x(),edge2->pos.y(),edge2->stepx,edge2->stepy,  //              edge2->next,edge2->prev);  if (edge1->next == edge2) {                                 //already closed    complete_edge(edge1);  //approximate it                                 //attach freelist to end    edge1->prev->next = free_cracks;    free_cracks = edge1;         //and free list  }  else {                                 //update opposite ends    edge2->prev->next = edge1->next;    edge1->next->prev = edge2->prev;    edge1->next = edge2;         //make joins    edge2->prev = edge1;  }}/********************************************************************** * free_crackedges * * Really free the CRACKEDGEs by giving them back to delete. **********************************************************************/void free_crackedges(                  //really free them                     CRACKEDGE *start  //start of loop                    ) {  CRACKEDGE *current;            //current edge to free  CRACKEDGE *next;               //next one to free  for (current = start; current != NULL; current = next) {    next = current->next;    delete current;              //delete them all  }}

⌨️ 快捷键说明

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