Bool32 RPIC_SearchPictures(CCOM_handle hCCOM, CCOM_handle hCCOM_big, Handle hCPAGE) { CCOM_comp * comp = NULL; CCOM_comp common; PAGEINFO pInfo; POLY_ block; uint32_t i, j; Rect16 rect; uint32_t key; uint32_t color; uint32_t tmp_comp = 0; Handle MainWindowD = NULL; MainWindowD = LDPUMA_GetWindowHandle("Изображение после разворота"); if (!MainWindowD) MainWindowD = LDPUMA_GetWindowHandle("Main"); OpenLogRes(); file_name = (char*) LDPUMA_GetFileName(NULL); //color = 23650; color = 200; key = 111; nPics = 0; if (pPics) { free(pPics); pPics = NULL; } nComps = 0; CPAGE_GetPageData(hCPAGE, PT_PAGEINFO, (void*) &pInfo, sizeof(pInfo)); for (i = 0; i < MaxHeightOfLetter; i++) { pHystogram[i] = 0; } //LDPUMA_FPuts(hFile, (char*)&pInfo.szImageName); LDPUMA_FPuts(logFile_comp, "*******************************************************\n"); LDPUMA_FPuts(logFile_comp, "new_file \n"); if ((pInfo.Angle == 90) || (pInfo.Angle == 270)) { uint32_t tmp; tmp = pInfo.Width; pInfo.Width = pInfo.Height; pInfo.Height = tmp; } //stepa_am comp = CCOM_GetFirst(hCCOM_big, NULL); while (comp) { tmp_comp++; if ((comp->h > MinHeightOfLetter) && (comp->h < MaxHeightOfLetter)) { nComps++; pHystogram[comp->h]++; } if (comp->scale < 1) goto lNextComp_big; /* if( comp->cs == 255) { comp->type = CCOM_CH_LETTER; goto lNextComp; } */ if (IsNotGoodComp(pInfo, comp)) { if (!LDPUMA_Skip(hShowAllCancelledGreat)) { rect.left = comp->left; rect.top = comp->upper; rect.right = comp->left + comp->w; rect.bottom = comp->upper + comp->h; LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 4, key); } goto lNextComp_big; } if (nPics % PICS_QUANTUM == 0) { pPics = (CCOM_comp *) realloc(pPics, (size_t) ((nPics / PICS_QUANTUM + 1) * PICS_QUANTUM * sizeof(CCOM_comp))); } pPics[nPics++] = *comp; lNextComp_big: comp = CCOM_GetNext(comp, NULL); } //end stepa_am comp = CCOM_GetFirst(hCCOM, NULL); while (comp) { tmp_comp++; if ((comp->h > MinHeightOfLetter) && (comp->h < MaxHeightOfLetter)) { nComps++; pHystogram[comp->h]++; } if ( /*comp->scale < */1) goto lNextComp; /* if( comp->cs == 255) { comp->type = CCOM_CH_LETTER; goto lNextComp; } */ if (IsNotGoodComp(pInfo, comp)) { if (!LDPUMA_Skip(hShowAllCancelledGreat)) { rect.left = comp->left; rect.top = comp->upper; rect.right = comp->left + comp->w; rect.bottom = comp->upper + comp->h; LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 4, key); } goto lNextComp; } if (nPics % PICS_QUANTUM == 0) { pPics = (CCOM_comp *) realloc(pPics, (size_t) ((nPics / PICS_QUANTUM + 1) * PICS_QUANTUM * sizeof(CCOM_comp))); } pPics[nPics++] = *comp; lNextComp: comp = CCOM_GetNext(comp, NULL); } if (!LDPUMA_Skip(hShowAllCancelledGreat)) { LDPUMA_Console("RPIC_Отмененные большие компоненты \n"); LDPUMA_WaitUserInput(hShowAllCancelledGreat, MainWindowD); LDPUMA_DeleteRects(MainWindowD, key); } if (!nComps) // OLEG return TRUE; // STEPA_AM if (!nPics) return TRUE; /**************************************************/ for (i = 0; i < MaxHeightOfLetter; i++) { nAverageHeight += pHystogram[i] * i; /* sprintf(tmp_str, " %i (i)\n", i); LDPUMA_FPuts(logFile,tmp_str); sprintf(tmp_str, " %i (pHystogram[i])\n", pHystogram[i]); LDPUMA_FPuts(logFile,tmp_str); */ } nAverageHeight /= nComps; sprintf(tmp_str, "Average height %i (nAverageHeight)\n", nAverageHeight); LDPUMA_FPuts(logFile_comp, tmp_str); /**************************************************/ /************** first union all crossed and included pictures ******************/ /* for (i=0; i<nPics; i++) { for (j=0; j<nPics; j++) { if ( (pPics[i].upper < pPics[j].upper)&& (pPics[i].left < pPics[j].left)&& (pPics[i].left + pPics[i].w > pPics[j].left + pPics[j].w)&& (pPics[i].upper + pPics[i].h > pPics[j].upper + pPics[j].h) ) { DeleteFromPics (j); j--; } } } for (i=0; i<nPics; i++) { for (j=0; j<nPics; j++) { if (i==j) continue; if ( (pPics[i].upper - VER_BOUND_SIZE < pPics[j].upper + pPics[j].h)&& (pPics[i].left - HOR_BOUND_SIZE < pPics[j].left + pPics[j].w)&& (pPics[i].left + pPics[i].w + HOR_BOUND_SIZE > pPics[j].left)&& (pPics[i].upper + pPics[i].h + VER_BOUND_SIZE > pPics[j].upper) ) { common = pPics[i]; if (pPics[i].upper >= pPics[j].upper) common.upper = pPics[j].upper; if (pPics[i].left >= pPics[j].left) common.left = pPics[j].left; if (pPics[i].upper + pPics[i].h < pPics[j].upper + pPics[j].h) common.h = pPics[j].upper + pPics[j].h - pPics[i].upper; if (pPics[i].left + pPics[i].w < pPics[j].left + pPics[j].w) common.w = pPics[j].left + pPics[j].w - pPics[i].left; common.h += pPics[i].upper - common.upper; common.w += pPics[i].left - common.left; pPics[i] = common; DeleteFromPics (j); j=0; i=0; } } } */ /***********************************************************************************/ color = 200; key = 111; if ((!LDPUMA_Skip(hShowAllGreat)) && nPics) { for (i = 0; i < nPics; i++) { rect.left = pPics[i].left; rect.top = pPics[i].upper; rect.right = pPics[i].left + pPics[i].w; rect.bottom = pPics[i].upper + pPics[i].h; LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key); } LDPUMA_Console("RPIC_Рассматриваемые большие компоненты \n"); LDPUMA_WaitUserInput(hShowAllGreat, MainWindowD); LDPUMA_DeleteRects(MainWindowD, key); } //sprintf(tmp_str, "Amount of 'letters' on the first step %i (nComps)\n", nComps); //LDPUMA_FPuts(logFile_comp,tmp_str); //sprintf(tmp_str, " <2 Н Страница = %d \n", page_count++); //LDPUMA_FPuts(resFile_comp,tmp_str); //char* str; //str = LDPUMA_GetFileName(NULL); LDPUMA_FPuts(resFile_comp, " <2 Н Страница ="); LDPUMA_FPuts(resFile_comp, file_name); LDPUMA_FPuts(resFile_comp, " \n"); //LDPUMA_FPuts(resFile_comp, " <2 Н Страница \n"); LDPUMA_FPuts(resFile_comp, " <3 Н Компоненты \n"); sprintf(tmp_str, " <4 П Перед выделением линий \n", nComps); LDPUMA_FPuts(resFile_comp, tmp_str); sprintf(tmp_str, " <4 Р %d \n", nComps); LDPUMA_FPuts(resFile_comp, tmp_str); sprintf(tmp_str, "Amount of pictures on the before first step %i (nPics)\n", nPics); LDPUMA_FPuts(logFile_comp, tmp_str); /*******************************************************************/ if (LDPUMA_Skip(hRectanglePictures)) SearchRectanglePictures(hCCOM, hCCOM_big, hCPAGE); if (LDPUMA_Skip(hPolyPictures)) SearchPolyPictures(hCCOM, hCPAGE); /*******************************************************************/ /************** final union all crossed and included pictures ******************/ for (i = 0; i < nPics; i++) { if (pPics[i].large & CCOM_LR_KILLED) { continue; } for (j = 0; j < nPics; j++) { if ((pPics[i].upper < pPics[j].upper) && (pPics[i].left < pPics[j].left) && (pPics[i].left + pPics[i].w > pPics[j].left + pPics[j].w) && (pPics[i].upper + pPics[i].h > pPics[j].upper + pPics[j].h)) { /* if((pPics[i].type!=CCOM_CH_LETTER)||(pPics[j].type!=CCOM_CH_LETTER)) { pPics[i].type = CCOM_CH_MERGE; } */ if (pPics[j].large & CCOM_LR_KILLED) { // it's bad, but will work cause pPics[].large not initialised in RPIC pPics[i].large |= CCOM_LR_TAKEN; continue; } DeleteFromPics(j); //j--; } } } for (i = 0; i < nPics; i++) { if (pPics[i].large & CCOM_LR_KILLED) { continue; } for (j = 0; j < nPics; j++) { if (pPics[j].large & CCOM_LR_KILLED) { continue; } if (i == j) continue; if ((pPics[i].upper - VER_BOUND_SIZE < pPics[j].upper + pPics[j].h) && (pPics[i].left - HOR_BOUND_SIZE < pPics[j].left + pPics[j].w) && (pPics[i].left + pPics[i].w + HOR_BOUND_SIZE > pPics[j].left) && (pPics[i].upper + pPics[i].h + VER_BOUND_SIZE > pPics[j].upper)) { common = pPics[i]; if (pPics[i].upper >= pPics[j].upper) common.upper = pPics[j].upper; if (pPics[i].left >= pPics[j].left) common.left = pPics[j].left; if (pPics[i].upper + pPics[i].h < pPics[j].upper + pPics[j].h) common.h = pPics[j].upper + pPics[j].h - pPics[i].upper; if (pPics[i].left + pPics[i].w < pPics[j].left + pPics[j].w) common.w = pPics[j].left + pPics[j].w - pPics[i].left; common.h += pPics[i].upper - common.upper; common.w += pPics[i].left - common.left; pPics[i] = common; DeleteFromPics(j); } } } LastCheck(hCCOM, hCCOM_big, hCPAGE); LDPUMA_FPuts(resFile_pict, " <2 Н Страница ="); LDPUMA_FPuts(resFile_pict, file_name); LDPUMA_FPuts(resFile_pict, " \n"); LDPUMA_FPuts(resFile_pict, " <3 Н Картинки \n"); LDPUMA_FPuts(resFile_pict, " <4 Н После первого прохода \n"); sprintf(tmp_str, " <4 Р %d %d %d \n", nPics, 0, 0); LDPUMA_FPuts(resFile_pict, tmp_str); int32_t min_image_width = (int32_t)(100 * ((double) (pInfo.DPIX + 1) / 300)); int32_t min_image_height = (int32_t)(100 * ((double) (pInfo.DPIY + 1) / 300)); for (i = 0; i < nPics; i++) { if (pPics[i].large & CCOM_LR_KILLED && !(pPics[i].large & CCOM_LR_TAKEN)) { continue; } block.com.type = TYPE_TEXT;//Текст, Картинка, Таблица; block.com.number = 0;//порядковый номер block.com.count = 4; block.com.Flags = 0; block.com.Vertex[0].rx() = pPics[i].left; block.com.Vertex[0].ry() = pPics[i].upper; block.com.Vertex[1].rx() = pPics[i].left + pPics[i].w; block.com.Vertex[1].ry() = pPics[i].upper; block.com.Vertex[2].rx() = pPics[i].left + pPics[i].w; block.com.Vertex[2].ry() = pPics[i].upper + pPics[i].h; block.com.Vertex[3].rx() = pPics[i].left; block.com.Vertex[3].ry() = pPics[i].upper + pPics[i].h; block.alphabet = 0; sprintf(tmp_str, " <4 О 1 %4d %4d %4d %4d %d \n", pPics[i].left, pPics[i].upper, pPics[i].left + pPics[i].w, pPics[i].upper, pPics[i].h); LDPUMA_FPuts(resFile_pict, tmp_str); if (pPics[i].large & CCOM_LR_TAKEN || pPics[i].w < min_image_width && pPics[i].h < min_image_height) { CPAGE_CreateBlock(hCPAGE, POSSIBLE_PICTURES, 0, 0, &block, sizeof(POLY_)); } else { CPAGE_CreateBlock(hCPAGE, TYPE_IMAGE, 0, 0, &block, sizeof(POLY_)); } } LDPUMA_FPuts(resFile_pict, " <4 К После первого прохода \n"); sprintf(tmp_str, "Amount of comps on the first step %i (tmp_comp) \n", tmp_comp); LDPUMA_FPuts(logFile_comp, tmp_str); sprintf(tmp_str, "Amount of pictures on the first step %i (nPics) \n", nPics); LDPUMA_FPuts(logFile_comp, tmp_str); LDPUMA_FPuts(logFile_comp, "*******************************************************\n"); if (pPics != NULL) { free(pPics); pPics = NULL; } nPics = 0; CloseLogRes(); Handle h = NULL; if (!LDPUMA_Skip(hShowFirstAttempt)) { h = NULL; nPics = 0; for (h = CPAGE_GetBlockFirst(hCPAGE, TYPE_IMAGE); h != NULL; h = CPAGE_GetBlockNext(hCPAGE, h, TYPE_IMAGE)) { nPics++; CPAGE_GetBlockData(hCPAGE, h, TYPE_IMAGE, &block, sizeof(block)); rect.left = block.com.Vertex[0].x(); rect.top = block.com.Vertex[0].y(); rect.right = block.com.Vertex[1].x(); rect.bottom = block.com.Vertex[2].y(); LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key); } if (nPics) { LDPUMA_Console("RPIC_Картинки после первого прохода \n"); LDPUMA_WaitUserInput(hShowFirstAttempt, MainWindowD); LDPUMA_DeleteRects(MainWindowD, key); } } if (!LDPUMA_Skip(hShowPossiblePics)) { h = NULL; nPics = 0; for (h = CPAGE_GetBlockFirst(hCPAGE, POSSIBLE_PICTURES); h != NULL; h = CPAGE_GetBlockNext(hCPAGE, h, POSSIBLE_PICTURES)) { nPics++; CPAGE_GetBlockData(hCPAGE, h, POSSIBLE_PICTURES, &block, sizeof(block)); rect.left = block.com.Vertex[0].x(); rect.top = block.com.Vertex[0].y(); rect.right = block.com.Vertex[1].x(); rect.bottom = block.com.Vertex[2].y(); LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key); } if (nPics) { LDPUMA_Console("RPIC_Неуверенные картинки после первого прохода \n"); LDPUMA_WaitUserInput(hShowPossiblePics, MainWindowD); LDPUMA_DeleteRects(MainWindowD, key); } } Handle BlockType = CPAGE_GetInternalType("pic's to letters boxes"); RPIC_Comp_Rect CompRect; if (!LDPUMA_Skip(hShowBigLetters)) { h = NULL; nPics = 0; for (h = CPAGE_GetBlockFirst(hCPAGE, BlockType); h != NULL; h = CPAGE_GetBlockNext(hCPAGE, h, BlockType)) { nPics++; CPAGE_GetBlockData(hCPAGE, h, BlockType, &CompRect, sizeof(CompRect)); rect.left = CompRect.left; rect.top = CompRect.upper; rect.right = CompRect.left + CompRect.w - 1; rect.bottom = CompRect.upper + CompRect.h - 1; LDPUMA_DrawRect(MainWindowD, &rect, 0, color, 2, key); } if (nPics) { LDPUMA_Console("RPIC_Буквицы \n"); LDPUMA_WaitUserInput(hShowBigLetters, MainWindowD); LDPUMA_DeleteRects(MainWindowD, key); } } return TRUE; }
Bool32 CheckAreaForComps(CCOM_handle hCCOM, CCOM_handle hCCOM_big, Rect32 rect, int32_t Height, uint32_t *Result1, uint32_t *Result2) { CCOM_comp * comp; uint32_t i; comp = NULL; Rect16 rect1; uint32_t key = 111; uint32_t color = 23000; Handle MainWindowD = NULL; MainWindowD = LDPUMA_GetWindowHandle("Изображение после разворота"); if (!MainWindowD) MainWindowD = LDPUMA_GetWindowHandle("Main"); *Result1 = 0; *Result2 = 0; if (!LDPUMA_Skip(hShowCheckLetters)) { rect1.top = (uint16_t) rect.top; rect1.left = (uint16_t) rect.left; rect1.bottom = (uint16_t) rect.bottom; rect1.right = (uint16_t) rect.right; LDPUMA_DrawRect(MainWindowD, &rect1, 0, 23635, 4, key); } //stepa_am comp = CCOM_GetFirst(hCCOM_big, NULL); while (comp) { if (comp->h < Height / 6) goto lNextComp_big; if (comp->h > Height * 1.5) goto lNextComp_big; if (comp->upper < rect.top) goto lNextComp_big; if (comp->left < rect.left) goto lNextComp_big; if (comp->upper + comp->h > rect.bottom) goto lNextComp_big; if (comp->left + comp->w > rect.right) goto lNextComp_big; if ((comp->h < Height / 3) && (comp->upper < rect.top)) goto lNextComp_big; for (i = 0; i < nPics; i++) { if ((comp->upper >= pPics[i].upper) && (comp->left >= pPics[i].left) && (comp->upper + comp->h < pPics[i].upper + pPics[i].h) && (comp->left + comp->w <= pPics[i].left + pPics[i].w)) { goto lNextComp_big; } } if ((comp->h > Height * 0.5) && (comp->h < Height * 1.5)) { (*Result1)++; if (!LDPUMA_Skip(hShowCheckLetters)) { rect1.left = comp->left; rect1.top = comp->upper; rect1.right = comp->left + comp->w; rect1.bottom = comp->upper + comp->h; LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 8, key); } goto lNextComp_big; } if ((comp->h > Height / 3 * 0.5) && (comp->h < Height / 3* 1.5 )) { (*Result2)++; if (!LDPUMA_Skip(hShowCheckLetters)) { rect1.left = comp->left; rect1.top = comp->upper; rect1.right = comp->left + comp->w; rect1.bottom = comp->upper + comp->h; LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 2, key); } goto lNextComp_big; } lNextComp_big: comp = CCOM_GetNext(comp, NULL); } //end stepa_am comp = CCOM_GetFirst(hCCOM, NULL); while (comp) { if (comp->h < Height / 6) goto lNextComp; if (comp->h > Height * 1.5) goto lNextComp; if (comp->upper < rect.top) goto lNextComp; if (comp->left < rect.left) goto lNextComp; if (comp->upper + comp->h > rect.bottom) goto lNextComp; if (comp->left + comp->w > rect.right) goto lNextComp; if ((comp->h < Height / 3) && (comp->upper < rect.top)) goto lNextComp; for (i = 0; i < nPics; i++) { if ((comp->upper >= pPics[i].upper) && (comp->left >= pPics[i].left) && (comp->upper + comp->h < pPics[i].upper + pPics[i].h) && (comp->left + comp->w <= pPics[i].left + pPics[i].w)) { goto lNextComp; } } if ((comp->h > Height * 0.5) && (comp->h < Height * 1.5)) { (*Result1)++; if (!LDPUMA_Skip(hShowCheckLetters)) { rect1.left = comp->left; rect1.top = comp->upper; rect1.right = comp->left + comp->w; rect1.bottom = comp->upper + comp->h; LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 8, key); } goto lNextComp; } if ((comp->h > Height / 3* 0.5 )&&(comp->h < Height/3*1.5)) { (*Result2)++; if(!LDPUMA_Skip(hShowCheckLetters)) { rect1.left = comp->left; rect1.top = comp->upper; rect1.right = comp->left + comp->w; rect1.bottom = comp->upper + comp->h; LDPUMA_DrawRect(MainWindowD, &rect1, 0, color, 2, key); } goto lNextComp; } lNextComp: comp = CCOM_GetNext(comp,NULL); } if(!LDPUMA_Skip(hShowCheckLetters)) { LDPUMA_Console("RPIC_Анализ на заголовки \n"); LDPUMA_WaitUserInput(hShowCheckLetters, MainWindowD); LDPUMA_DeleteRects(MainWindowD, key); } return TRUE; }
RNEG_FUNC(void) RNEG_RecogNeg(CCOM_handle hCCOM, Handle hCPage,uchar* pImageName,int skew) { MainWindowD=NULL; MainWindowD=LDPUMA_GetWindowHandle ("Изображение после разворота"); if(!MainWindowD) MainWindowD=LDPUMA_GetWindowHandle ("Main"); dpTime=!LDPUMA_Skip(hTime); dpPrintResConsole=!LDPUMA_Skip(PrintResConsole); dpNegResD=!LDPUMA_Skip(NegResD); dpNegRecD=!LDPUMA_Skip(NegRecD); dpRecOneLetter=!LDPUMA_Skip(RecOneLetter); // LDPUMA_ConsoleN(""); if(dpTime) LDPUMA_ConsoleN("Активизируется функция поиска и разпознования негативов"); int time=clock(); if(!(LDPUMA_Skip (NegSearch)) ) return; uint32_t code_sersized=(512<<16); uint32_t code_normd=(512<<17); uint32_t code_colord=(512<<17)+(512<<16); uint32_t code_cutd=(512<<18); uint32_t code_cutstrd=(512<<18)+(512<<16); uint32_t code_sized=(512<<18)+(512<<17); #define NEGA 1<<14 #define VERTICA 1<<13 inf_neg_h=30; inf_neg_w=100; neg_cut_black=.95; neg_cut_white=.3; neg_cut_str=.8; min_let_h=2; min_let_w=2; inf_betw_str_h=10; sup_square=500000; PAGEINFO info = {0}; GetPageInfo(hCPage,&info); DPIX=info.DPIX; DPIY=info.DPIY; inf_neg_h=inf_neg_h*((int)(DPIY)+1)/300; inf_neg_w=inf_neg_w*((int)(DPIX)+1)/300; inf_betw_str_h=inf_betw_str_h*((int)(DPIY)+1)/300; sup_square=(int)(((double)sup_square*(double)(DPIY+1)*(double)(DPIX+1))/90000); min_let_w=min_let_w*((int)(DPIX)+1)/300; min_let_h=min_let_h*((int)(DPIY)+1)/300; if((info.Angle==90)||(info.Angle==270)) { Height=info.Width; Width=info.Height; } else { Height=info.Height; Width=info.Width; } NegList* root=NULL; NegList* now; NegList* temp; int nRC=0; int i; Bool fl_del_mas_neg; Bool flag_rotate; Bool flag_rimage_rotate; if(!LDPUMA_Skip(SetSkew)) skew=Skew; for(i=0;i<CPAGE_MAXNAME&&pImageName[i]!='\0';i++) ImageName[i]=pImageName[i]; if(i<CPAGE_MAXNAME) ImageName[i]='\0'; if(!InitMyImage()) return; if(dpTime) { LDPUMA_ConsoleN("Time prep=%d",clock()-time); time=clock(); } /* Осуществляется поиск кандидатов в негативы по размеру*/ if(LDPUMA_Skip (NegSearchSize) ) { fl_del_mas_neg=SearchNegBySize(hCCOM,hCPage,&root,nRC); /*Прорисовка найденных кандидатов в негативы по размерам*/ if(nRC>0) { now=root; if(!(LDPUMA_Skip (NegSearchSizeD)) ) { for(i=0;i<nRC;i++) { NegDrawRect(MainWindowD,code_sersized,RGB(0,0,255),(now->neg).pRc[0]); now=now->next; } LDPUMA_ConsoleN("По размерам"); LDPUMA_WaitUserInput (NegSearchSizeD,MainWindowD); if(LDPUMA_Skip (NegSearchSizeDC) ) LDPUMA_DeleteRects (MainWindowD,code_sersized); } } } flag_rimage_rotate=IfNeedGlobalRotate(root,skew); now=root; while(now) { while((now->neg).pRc[0].top<=0) ((now->neg).pRc[0].top)++; while(((now->neg).pRc[0].bottom+1)>Height ) ((now->neg).pRc[0].bottom)--; while((now->neg).pRc[0].left<0) ((now->neg).pRc[0].left)++; while( ((now->neg).pRc[0].right+1)>Width ) ((now->neg).pRc[0].right)--; int prewide=(((now->neg).pRc[0].right-(now->neg).pRc[0].left+8)/8)*8; if( ((now->neg).pRc[0].left+prewide)>Width ) (now->neg).pRc[0].right-=8; now=now->next; } /* Осуществляется удаление(если повезёт) грязи, т.е. приведение негатива к каноническому виду*/ if(LDPUMA_Skip (NegNorm) ) { /* Поворот (если необходим) негативов*/ flag_rotate=NegRotate(hCPage,root,nRC,skew); now=root; for(i=1;i<nRC;i++) now=now->next; i=nRC-1; while(i>=0) { temp=now->prev; NormNeg(hCPage,now,&root,nRC); i--; now=temp; } /*Обратное преобразование*/ if(flag_rotate) { now=root; while(now) { if((now->neg).rot.pmasp) { RSELSTR_UnRotateRect(-skew,&((now->neg).pRc[0]),1,(now->neg).rot.Rc,(now->neg).rot.begx,(now->neg).rot.movey,(now->neg).rot.flmovey,(now->neg).rot.hi); PostRotate(now,skew); } DeleteRotateMas(&((now->neg).rot.pmasp),&((now->neg).rot.begx),&((now->neg).rot.movey),&((now->neg).rot.flmovey),&((now->neg).rot.hi)); now=now->next; } } /* Прорисовка нормализованных кандидатов в негативы*/ if(nRC>0) { now=root; if(!(LDPUMA_Skip (NegNormD)) ) { for(i=0;i<nRC;i++) { NegDrawRect(MainWindowD,code_normd,RGB(0,255,0),(now->neg).pRc[0]); now=now->next; } LDPUMA_ConsoleN("Нормализованные"); LDPUMA_WaitUserInput (NegNormD,MainWindowD); if(LDPUMA_Skip (NegNormDC) ) LDPUMA_DeleteRects (MainWindowD,code_normd); } } } /* Резка сложных негативов*/ if(LDPUMA_Skip (NegCut) ) { /* Поворот (если необходим) негативов*/ flag_rotate=NegRotate(hCPage,root,nRC,skew); CutNeg(hCPage,&root,nRC,skew); /* Поворот (если необходим) негативов*/ flag_rotate=NegRotate(hCPage,root,nRC,skew); now=root; for(i=1;i<nRC;i++) now=now->next; i=nRC-1; while(i>=0) { temp=now->prev; NormNeg(hCPage,now,&root,nRC); i--; now=temp; } /*Обратное преобразование*/ if(flag_rotate) { now=root; while(now) { if((now->neg).rot.pmasp) { RSELSTR_UnRotateRect(-skew,&((now->neg).pRc[0]),1,(now->neg).rot.Rc,(now->neg).rot.begx,(now->neg).rot.movey,(now->neg).rot.flmovey,(now->neg).rot.hi); PostRotate(now,skew); } DeleteRotateMas(&((now->neg).rot.pmasp),&((now->neg).rot.begx),&((now->neg).rot.movey),&((now->neg).rot.flmovey),&((now->neg).rot.hi)); now=now->next; } } /* Прорисовка разрезанных негативов*/ if(nRC>0) { now=root; if(!(LDPUMA_Skip (NegCutD)) ) { for(i=0;i<nRC;i++) { NegDrawRect(MainWindowD,code_cutd,RGB(255,0,0),(now->neg).pRc[0]); now=now->next; } LDPUMA_ConsoleN("Разрезанные"); LDPUMA_WaitUserInput (NegCutD,MainWindowD); if(LDPUMA_Skip (NegCutDC) ) LDPUMA_DeleteRects (MainWindowD,code_cutd); } } } now=root; for(i=1;i<nRC;i++) now=now->next; int h; int w; Rect16 Rc; /*Отсев по размеру*/ if(LDPUMA_Skip (NegSize) ) { while(now) { h=(now->neg).pRc[0].bottom-(now->neg).pRc[(now->neg).nRc-1].top+1; w=(now->neg).pRc[0].right-(now->neg).pRc[0].left+1; if( ((h<2*w)&&(w<2*h)) || ((h*w)>sup_square) ) { temp=now; if(!temp->prev) root=temp->next; nRC--; now=now->prev; delete temp; } else now=now->prev; } /* Прорисовка отсеянных по размеру*/ if(nRC>0) { now=root; if(!(LDPUMA_Skip (NegSizeD)) ) { for(i=0;i<nRC;i++) { Rc.left=(now->neg).pRc[0].left; Rc.right=(now->neg).pRc[0].right; Rc.bottom=(now->neg).pRc[0].bottom; Rc.top=(now->neg).pRc[(now->neg).nRc-1].top; NegDrawRect(MainWindowD,code_sized,RGB(255,255,0),Rc); now=now->next; } LDPUMA_ConsoleN("Окончательная прорисовка"); LDPUMA_WaitUserInput (NegSizeD,MainWindowD); if(LDPUMA_Skip (NegSizeDC) ) LDPUMA_DeleteRects (MainWindowD,code_sized); } } } /* Поворот (если необходим) негативов*/ flag_rotate=NegRotate(hCPage,root,nRC,skew); /* Осуществляется отсев кандидатов в негативы по насыщенности чёрного цвета*/ if(LDPUMA_Skip (NegColor) ) { SearchNegByBlack(hCPage,&root,nRC); /*Прорисовка кандидатов в негативы после отсева по цветовой гамме*/ if(nRC>0) { now=root; if(!(LDPUMA_Skip (NegColorD)) ) { for(i=0;i<nRC;i++) { NegDrawRect(MainWindowD,code_colord,RGB(0,255,255),(now->neg).pRc[0]); now=now->next; } LDPUMA_ConsoleN("Отсеянные по цветовой гамме"); LDPUMA_WaitUserInput (NegColorD,MainWindowD); if(LDPUMA_Skip (NegColorDC) ) LDPUMA_DeleteRects (MainWindowD,code_colord); } } } /* Резка многострочных негативов*/ if(LDPUMA_Skip (NegCutStr) ) { CutNegStr(hCPage,&root,nRC,skew); /* Прорисовка разрезанных негативов*/ if(nRC>0) { now=root; if(!(LDPUMA_Skip (NegCutStrD)) ) { while(now) { for(i=0;i<(now->neg).nRc;i++) NegDrawRect(MainWindowD,code_cutstrd,RGB(255,0,255),(now->neg).pRc[i]); now=now->next; } LDPUMA_ConsoleN("Разрезанные на строки"); LDPUMA_WaitUserInput (NegCutStrD,MainWindowD); if(LDPUMA_Skip (NegCutStrDC) ) LDPUMA_DeleteRects (MainWindowD,code_cutstrd); } } } /*Отсев пересекающихся*/ DelIn(hCPage,&root,nRC); int time_stuff=clock(); if(dpTime) LDPUMA_ConsoleN("Time stuff=%d",time_stuff-time); /* Осуществляется распознование из массива кандидатов*/ if(flag_rimage_rotate) { UnRotateNeg(root,skew); ResetMyImage(); if(!InitMyImage()) return; CheckNega(root); if(!flag_rotate) flag_rotate=NegRotate(hCPage,root,nRC,skew); } if(LDPUMA_Skip (NegRec) ) { NegRecog(hCPage,&root,nRC,skew); } if(dpTime) LDPUMA_ConsoleN("Time recog=%d",clock()-time_stuff); if(!(LDPUMA_Skip (NegPrintFILE) )) { FILE *f; f=fopen("recneg.res","a"); if(f==NULL) f=fopen("recneg.res","w+"); if(f!=NULL) { NegPrintInFile(f,root,nRC); fclose(f); } } /* Отпись в CPage*/ now=root; if(1/*!(LDPUMA_Skip (PutToCPage) )*/) { POLY_ block={0}; uint32_t size_poly=sizeof(POLY_); while(now) { if((now->neg).p>inf_prob) { block.com.Flags=0; Rc.left=(now->neg).pRc[0].left; Rc.right=(now->neg).pRc[0].right; Rc.top=(now->neg).pRc[(now->neg).nRc-1].top; Rc.bottom=(now->neg).pRc[0].bottom; block.com.type = TYPE_TEXT; //Текст, Картинка, Таблица; block.com.count = 4; block.negative=TYPE_NEGATIVE; block.com.Flags=NEGA; //Andrey: moved from RBLOCK (keyword:TYPE_NEGATIVE) //------------------------------ block.alphabet=0; block.com.number=0; //------------------------------ //commented by Andrey /* if(Rc.bottom-Rc.top>Rc.right-Rc.left) { block.orient=TYPE_DOWNUP; block.com.Flags|=VERTICA; } else block.orient=TYPE_LEFTRIGHT; */ if ((now->neg).Flags&FlVert) { block.com.Flags |= VERTICA; block.orient = (now->neg).Flags&FlDown2Up ? TYPE_DOWNUP : TYPE_UPDOWN; } else block.orient = TYPE_LEFTRIGHT; block.com.Vertex[0].x = Rc.left; block.com.Vertex[0].y = Rc.top; block.com.Vertex[1].x = Rc.right; block.com.Vertex[1].y = Rc.top; block.com.Vertex[2].x = Rc.right; block.com.Vertex[2].y = Rc.bottom; block.com.Vertex[3].x = Rc.left; block.com.Vertex[3].y = Rc.bottom; //Andrey: create TYPE_TEXT block CPAGE_CreateBlock(hCPage, TYPE_IMAGE,0,0,&block,size_poly); // CPAGE_CreateBlock(hCPage, TYPE_TEXT,0,0,&block,size_poly); } now=now->next; } } if(!(LDPUMA_Skip (PutToCHSTR) )) { now=root; uchar Name[CPAGE_MAXNAME]; for (int j=0; j<CPAGE_MAXNAME; j++) Name[j] = ImageName[j]; if(!(LDPUMA_Skip (TestCHSTR) )) { CHSTR_Objects Hstr; Hstr.Rc.top=TOP; Hstr.Rc.bottom=BOTTOM; Hstr.Rc.left=LEFT; Hstr.Rc.right=RIGHT; Hstr.block_number=1000; Hstr.ImageName[0]='\0'; Hstr.type_neg=NEGATIVE; Hstr.type_vert=VERTICALE; RSELSTR_PutObjects(hCPage,(void*)hCCOM,&Hstr,1); } } PutTempToCPAGE(hCPage,root); if( (LDPUMA_Skip (NegSearchSize))&&(fl_del_mas_neg==TRUE) ) { while(root) { now=root; root=root->next; delete now; } } ResetMyImage(); // LDPUMA_ConsoleN("Time work RNEG=%d",clock()-time); }