亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cutpath.c

?? NIST Handwriting OCR Testbed
?? C
字號:
/*# proc: blob_split_n_test - splits an image along a specified vertical path and then# proc:              tests to see if any of the resulting pieces is empty or too small# proc:              in which case cut points are adjusted and a new path is found.# proc: find_cut_path - given a starting x position, finds a vertical cut path through# proc:              the image by following the gradient of character stroke edges.# proc: split_blob_along_path - given a vertical path, actually divides the image into# proc:              two separate pieces.# proc: join_2_vert_paths - joins to vertical paths at their closest points and ensures# proc:              that there is one and only one point in the resulting path for each# proc:              y-value in the image.# proc: cut_caused_fragments - determines if cut created spurious fragments of characters# proc:              by counting the number of non-dot blobs in the resulting pieces.*/#include <math.h>#include <blobls.h>#include <stdio.h>#include <defs.h>#include <segchars.h>/*******************************************************************/blob_split_n_test(lblob, rblob, px, py, pn, pa, cut_x, esw, sblob)BLOB **lblob, **rblob, *sblob;int **px, **py, *pn, *pa;int cut_x, esw;{   int count_limit, count, next_x, xlimit, found;   count_limit = max(1,(sblob->w>>1)/esw); /* half the image's width in strokes */   count = 0;   next_x = cut_x;   xlimit = sblob->w-esw;   *lblob = (BLOB *)NULL;   *rblob = (BLOB *)NULL;   found = 0;   /* if we haven't looped too much, and the left or right piece is too small */   while((!found) && (count++ < count_limit)){      /* find cut path from new starting points */      find_cut_path(px, py, pn, pa, sblob->data, next_x, esw, sblob->w, sblob->h);      split_blob_along_path(lblob, rblob, *px, *py, *pn, sblob);      /* left and right piece should never both be too small */      /* move cut points one stroke width away from piece that's too small */      if((*lblob == NULL) || is_noise_blob(*lblob, esw)){         if(*lblob != NULL)            free_blob(*lblob);         if(*rblob != NULL)            free_blob(*rblob);         free(*px);         free(*py);         next_x += esw;         if(next_x >= xlimit){            break;         }      }      else if((*rblob == NULL) || is_noise_blob(*rblob, esw)){         if(*lblob != NULL)            free_blob(*lblob);         if(*rblob != NULL)            free_blob(*rblob);         free(*px);         free(*py);         next_x -= esw;         if(next_x < esw){            break;         }      }      else         found = 1;   }   /* if never found successful cut path ... */   if(!found){      return(FALSE);   }   else if(cut_caused_fragments(sblob, *lblob, *rblob, esw, sblob->h)){      free(*px);      free(*py);      free_blob(*lblob);      free_blob(*rblob);      return(FALSE);   }   else{      return(TRUE);   }}/*******************************************************************/blob_split_n_test_orig(lblob, rblob, px, py, pn, pa, cut_x, esw, sblob)BLOB **lblob, **rblob, *sblob;int **px, **py, *pn, *pa;int cut_x, esw;{   int count_limit, count, next_x, xlimit, ltest, found;   /* find cut path from starting points */   find_cut_path(px, py, pn, pa, sblob->data, cut_x, esw, sblob->w, sblob->h);   /* split the image along the path */   split_blob_along_path(lblob, rblob, *px, *py, *pn, sblob);   /* test left and right pieces */   count_limit = max(1,(sblob->w>>1)/esw); /* half the image's width in strokes */   count = 0;   next_x = cut_x;   xlimit = sblob->w-esw;   found = 1;   /* if we haven't looped too much, and the left or right piece is too small */   while((count++ < count_limit) &&         (ltest = ((*lblob == NULL) || is_noise_blob(*lblob, esw)) ||          (*rblob == NULL) || is_noise_blob(*rblob, esw))){      /* left and right piece should never both be too small */      /* move cut points one stroke width away from piece that's too small */      if(ltest){         next_x += esw;         if(next_x >= xlimit){            found = 0;            break;         }      }      else{         next_x -= esw;         if(next_x < esw){            found = 0;            break;         }      }      if(*lblob != NULL)         free_blob(*lblob);      if(*rblob != NULL)         free_blob(*rblob);      free(*px);      free(*py);      /* find cut path from new starting points */      find_cut_path(px, py, pn, pa, sblob->data, next_x, esw, sblob->w, sblob->h);      split_blob_along_path(lblob, rblob, *px, *py, *pn, sblob);   }   /* if never found successful cut path ... */   if((count > count_limit) || (!found)){      free(*px);      free(*py);      if(*lblob != NULL)         free_blob(*lblob);      if(*rblob != NULL)         free_blob(*rblob);      return(FALSE);   }   else if(cut_caused_fragments(sblob, *lblob, *rblob, esw, sblob->h)){      free(*px);      free(*py);      free_blob(*lblob);      free_blob(*rblob);      return(FALSE);   }   else{      return(TRUE);   }}/*******************************************************************/find_cut_path(px, py, pn, pa, cdata, cx, winw, w, h)int **px, **py, *pn, *pa;unsigned char *cdata;int cx, winw, w, h;{   int *dx, *dy, dn, da;   int *ux, *uy, un, ua, ui;   dribble_down_up(&dx, &dy, &dn, &da, &ux, &uy, &un, &ua,                     cdata, cx, winw, w, h);   /* if both paths pass all the way through the image ... */   if((dn == h) && (un == h)){      /* choose path whose midpt y is closer to the cut line */      if(abs(cx - dy[dn>>1]) > abs(cx - uy[un>>1])){         /* choose upward path */         dn = 0;         for(ui = un - 1; ui >= 0; ui--)            add_point(ux[ui], uy[ui], &dx, &dy, &dn, &da);      }      /* otherwise use downward path (by default) */   }   /* if downward path cuts all the way through the image ... */   else if (dn == h){      /* use downward path by default */   }   /* if upward path cuts all the way through the image ... */   else if (un == h){      dn = 0;      for(ui = un - 1; ui >= 0; ui--)         add_point(ux[ui], uy[ui], &dx, &dy, &dn, &da);   }   /* if both paths have some points ... */   else if((dn > 0) && (un > 0)){      join_2_vert_paths(&dx, &dy, &dn, &da, &ux, &uy, &un, &ua);   }   /* otherwise, should never have no cut points */   free(ux);   free(uy);   *px = dx;   *py = dy;   *pn = dn;   *pa = da;}/*******************************************************************//* split_blob_along_path returns NULL blob pointers if unsuccessful*//*******************************************************************/split_blob_along_path(lblob, rblob, px, py, pn, sblob)BLOB **lblob, **rblob, *sblob;int *px, *py, pn;{   unsigned char *ldata, *rdata, *lptr, *rptr, *cptr;   unsigned char *mallocate_image(), *allocate_image();   int i, w, h, min_px, max_px;   int lw, rw;   int blx, bly, blw, blh;   int brx, bry, brw, brh;   static int flags = BLOB_XY1S | BLOB_WHS | BLOB_AS;   if(pn != sblob->h)      fatalerr("split_blob_along_path",               "number of points not equal to height of blob image", NULL);   w = sblob->w;   h = sblob->h;   find_first_max_forward(px, 0, pn, &i, &max_px);   lw = max_px;   find_first_min_forward(px, 0, pn, &i, &min_px);   rw = w - min_px;   /* if left or right piece empty ... */   if((lw == 0) || (rw == 0)){      *lblob = (BLOB *)NULL;      *rblob = (BLOB *)NULL;      return;   }   ldata = allocate_image(lw, h, 8);   rdata = allocate_image(rw, h, 8);   lptr = ldata;/* more readable, but less efficient *//*   rptr = rdata; */   rptr = rdata - min_px;   cptr = sblob->data;   for(i = 0; i < pn; i++){      memcpy(lptr, cptr, px[i]);      /* more readable, but less efficient *//*      memcpy(rptr+px[i]-min_px, cptr+px[i], w-px[i]); */      memcpy(rptr+px[i], cptr+px[i], w-px[i]);      lptr += lw;      rptr += rw;      cptr += w;   }   find_corners8(&blx, &bly, &blw, &blh, ldata, lw, h);   if((blw != 0) && (blh != 0)){      build_blob(lblob, flags, mallocate_image(blw, blh, 8), blx, bly, blw, blh);      subimage_copy(ldata, lw, h, (*lblob)->data, blw, blh, blx, bly, blw, blh, 0, 0);   }   else      *lblob = (BLOB *)NULL;   find_corners8(&brx, &bry, &brw, &brh, rdata, rw, h);   if((brw != 0) && (brh != 0)){      build_blob(rblob, flags, mallocate_image(brw, brh, 8),                 min_px+brx, bry, brw, brh);      subimage_copy(rdata, rw, h, (*rblob)->data, brw, brh, brx, bry, brw, brh, 0, 0);   }   else      *rblob = (BLOB *)NULL;   free(ldata);   free(rdata);}/*******************************************************************/split_blob_along_path_orig(lblob, rblob, px, py, pn, sblob)BLOB **lblob, **rblob, *sblob;int *px, *py, pn;{   unsigned char *ldata, *rdata, *lptr, *rptr, *cptr;   unsigned char *mallocate_image(), *allocate_image();   int i, w, h, min_px, max_px;   int lw, rw;   int blx, bly, blw, blh;   int brx, bry, brw, brh;   static int flags = BLOB_XY1S | BLOB_WHS | BLOB_AS;   if(pn != sblob->h)      fatalerr("split_blob_along_path",               "number of points not equal to height of blob image", NULL);   w = sblob->w;   h = sblob->h;   find_first_max_forward(px, 0, pn, &i, &max_px);   lw = max_px;   ldata = allocate_image(lw, h, 8);   find_first_min_forward(px, 0, pn, &i, &min_px);   rw = w - min_px;   rdata = allocate_image(rw, h, 8);   lptr = ldata;/* more readable, but less efficient *//*   rptr = rdata; */   rptr = rdata - min_px;   cptr = sblob->data;   for(i = 0; i < pn; i++){      memcpy(lptr, cptr, px[i]);      /* more readable, but less efficient *//*      memcpy(rptr+px[i]-min_px, cptr+px[i], w-px[i]); */      memcpy(rptr+px[i], cptr+px[i], w-px[i]);      lptr += lw;      rptr += rw;      cptr += w;   }   find_corners8(&blx, &bly, &blw, &blh, ldata, lw, h);   if((blw != 0) && (blh != 0)){      build_blob(lblob, flags, mallocate_image(blw, blh, 8), blx, bly, blw, blh);      subimage_copy(ldata, lw, h, (*lblob)->data, blw, blh, blx, bly, blw, blh, 0, 0);   }   else      *lblob = (BLOB *)NULL;   find_corners8(&brx, &bry, &brw, &brh, rdata, rw, h);   if((brw != 0) && (brh != 0)){      build_blob(rblob, flags, mallocate_image(brw, brh, 8),                 min_px+brx, bry, brw, brh);      subimage_copy(rdata, rw, h, (*rblob)->data, brw, brh, brx, bry, brw, brh, 0, 0);   }   else      *rblob = (BLOB *)NULL;   free(ldata);   free(rdata);}/*******************************************************************/join_2_vert_paths(dx, dy, dn, da, ux, uy, un, ua)int **dx, **dy, *dn, *da;int **ux, **uy, *un, *ua;{   int last_y;   int *sx, *sy, sn, sa, si, ui;   int dcx, dcy, dci, ucx, ucy, uci;   find_closest_pts(&dcx, &dcy, &dci, &ucx, &ucy, &uci, *dx, *dy, *dn, *ux, *uy, *un);   /* interpolate line between (dcx, dcy) and (ucx, ucy) */   sa = 0;   bres_line_alloc(dcx, dcy, ucx, ucy, &sx, &sy, &sn, &sa);   /* reset down list so point at dci is last point in list */   *dn = dci + 1;   /* append interpolated line to down list */   /* do not copy endpoints (dcx, dcy) and (ucx, ucy) */   /* do not copy consecutive ponts with same y coord */   last_y = dcy;   for(si = 1; si < sn - 1; si++){      if(sy[si] > last_y){         add_point(sx[si], sy[si], dx, dy, dn, da);         last_y = sy[si];      }   }   /* append upward points in reverse order from (ucx, ucy) */   if(last_y == ucy)      ui = uci - 1;   else      ui = uci;   for(; ui >= 0; ui--){      if((*uy)[ui] > last_y){         add_point((*ux)[ui], (*uy)[ui], dx, dy, dn, da);         last_y = (*uy)[ui];      }   }   free(sx);   free(sy);}/************************************************************/cut_caused_fragments(blob, lblob, rblob, esw, charh)BLOB *blob, *lblob, *rblob;int esw, charh;{   int hlimit;   int otot, ltot, rtot;   hlimit = sround(charh * FRAG_HEIGHT);   /* if left or right piece is a fragment */   if((lblob->h < hlimit) || (rblob->h < hlimit))      return(TRUE);   /* count number of non-dots in original blob */   otot = count_nondots_blob(blob, esw);   /* count number of non-dots in left piece */   ltot = count_nondots_blob(lblob, esw);   /* count number of non-dots in right piece */   rtot = count_nondots_blob(rblob, esw);   if(otot != ltot + rtot - 1)      return(TRUE);   else      return(FALSE);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡在线视频中文字幕| 91精品国产色综合久久不卡蜜臀| 亚洲日本一区二区三区| 欧美高清视频一二三区| a级高清视频欧美日韩| 蜜桃视频一区二区三区在线观看| 亚洲视频网在线直播| 欧美精品一区二区三区四区| 在线亚洲人成电影网站色www| 国产在线国偷精品产拍免费yy | 亚洲精品在线三区| 在线亚洲+欧美+日本专区| 国产麻豆视频一区二区| 天天综合色天天| 亚洲综合图片区| 亚洲欧美日韩国产成人精品影院| 久久久久久毛片| 欧美成人三级电影在线| 欧美高清视频一二三区| 在线观看一区二区精品视频| 成人激情综合网站| 国产v日产∨综合v精品视频| 捆绑变态av一区二区三区| 午夜私人影院久久久久| 一区二区不卡在线视频 午夜欧美不卡在| 久久久久久久久99精品| 精品国产一区二区亚洲人成毛片| 6080午夜不卡| 日韩一区二区电影在线| 911国产精品| 7777女厕盗摄久久久| 欧美精品黑人性xxxx| 欧美日韩色综合| 日韩亚洲欧美高清| 欧美在线看片a免费观看| 色综合视频在线观看| jlzzjlzz欧美大全| 99久久精品国产网站| 91麻豆视频网站| 94-欧美-setu| 欧美午夜精品一区| 欧美日韩极品在线观看一区| 欧美三级中文字幕| 7777精品伊人久久久大香线蕉经典版下载 | 精品福利在线导航| 欧美v日韩v国产v| 久久久久久久久久久久久女国产乱 | 亚洲色图另类专区| 亚洲欧洲综合另类在线| 亚洲精品国产成人久久av盗摄 | 国产精品麻豆网站| 中文字幕一区二区三区在线观看| 国产精品青草综合久久久久99| 中文字幕日韩一区二区| 亚洲美女免费在线| 午夜av一区二区三区| 日韩国产欧美视频| 久久精品国内一区二区三区| 激情六月婷婷久久| 成人sese在线| 在线一区二区视频| 欧美精品亚洲二区| 欧美一区二区三区人| 精品盗摄一区二区三区| 国产日韩欧美精品一区| 亚洲女厕所小便bbb| 亚洲福利一区二区三区| 日韩av一级片| 国产suv精品一区二区883| 26uuu成人网一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 中文天堂在线一区| 亚洲小说欧美激情另类| 韩国女主播成人在线观看| 波多野结衣在线一区| 欧美亚洲国产一卡| 久久久综合精品| 亚洲精品欧美激情| 久久爱www久久做| av电影在线观看完整版一区二区| 欧美三级资源在线| 中文字幕不卡一区| 日本怡春院一区二区| 福利一区福利二区| 欧美日韩国产a| 国产精品欧美一级免费| 日韩经典中文字幕一区| 99久久国产综合色|国产精品| 欧美日韩三级在线| 中文字幕人成不卡一区| 久久精品国内一区二区三区| 91蜜桃在线免费视频| 91精品国产综合久久福利 | 欧美经典一区二区三区| 亚洲一区在线播放| 国产成人午夜片在线观看高清观看| 在线观看一区不卡| 欧美激情一区二区三区在线| 青椒成人免费视频| 日本道精品一区二区三区| 久久久久久一级片| 久热成人在线视频| 欧洲av在线精品| 中文字幕日本乱码精品影院| 激情欧美一区二区| 欧美一级片在线看| 亚洲成人午夜影院| 92国产精品观看| 中文字幕一区二区三区在线播放| 美女爽到高潮91| 欧美日韩极品在线观看一区| 亚洲欧美aⅴ...| 成人免费高清视频| 国产欧美一区二区精品久导航 | 日韩不卡一二三区| 色呦呦网站一区| 国产精品久久久久久妇女6080| 激情久久五月天| 日韩欧美二区三区| 免费高清在线视频一区·| 色就色 综合激情| 亚洲特黄一级片| 成人av网站免费观看| 国产日产精品一区| 国产在线播放一区三区四| 日韩天堂在线观看| 日本三级韩国三级欧美三级| 欧美日韩一区二区在线观看| 亚洲一区在线播放| 欧美日韩日本视频| 五月天亚洲精品| 9191成人精品久久| 欧美aaaaaa午夜精品| 日韩午夜在线观看视频| 麻豆精品久久精品色综合| 欧美日高清视频| 日本成人在线电影网| 欧美日韩高清一区二区| 日韩激情视频在线观看| 欧美二区在线观看| 久久精品国产免费| 欧美精品一区二区三区很污很色的| 精品亚洲免费视频| 久久久久高清精品| 成人app下载| 一区二区高清免费观看影视大全| 欧美性猛交xxxx乱大交退制版| 亚洲自拍偷拍欧美| 欧美日韩卡一卡二| 蜜芽一区二区三区| 久久蜜桃av一区精品变态类天堂| 懂色一区二区三区免费观看| 亚洲欧洲99久久| 在线观看视频欧美| 青青草国产精品97视觉盛宴| 亚洲精品一区二区三区香蕉| 国产又黄又大久久| 国产精品成人免费在线| 欧美色窝79yyyycom| 日本女优在线视频一区二区| 久久久精品tv| 一本一道波多野结衣一区二区| 亚洲成a天堂v人片| 欧美成人精品福利| eeuss鲁片一区二区三区| 亚洲午夜一区二区| 26uuu精品一区二区| 成a人片亚洲日本久久| 亚洲第四色夜色| 久久久久亚洲蜜桃| 91精品福利在线| 免费观看30秒视频久久| 国产精品成人在线观看| 91.com在线观看| 成人精品视频.| 天天影视色香欲综合网老头| 久久免费午夜影院| 欧美色老头old∨ideo| 紧缚奴在线一区二区三区| 亚洲欧洲综合另类| 精品国产青草久久久久福利| 97se亚洲国产综合自在线观| 丝袜亚洲精品中文字幕一区| 中文字幕乱码日本亚洲一区二区| 欧美日韩精品免费| www.亚洲色图.com| 久久激五月天综合精品| 亚洲欧美激情插| 久久人人97超碰com| 欧美午夜影院一区| 成人丝袜高跟foot| 蜜桃一区二区三区在线| 亚洲人成伊人成综合网小说| 日韩精品一区二区三区四区视频| 91在线视频播放| 国产精一区二区三区| 五月天一区二区三区| 日韩毛片精品高清免费| 26uuu久久天堂性欧美| 欧美精品色综合|