void ResolutionChecker::check() { PAGEINFO page_info; if(!GetPageInfo(cpage_, &page_info)) return; if(isValidResolution(page_info)) { cfDebug(cf::MODULE_RSTUFF) << "no resolution correction needed: " << page_info.DPIX << "x" << page_info.DPIY; return; } ComponentHistogram hist; hist.fill(ccom_); hist.calculate(); bool changed = false; if(hist.isYCorrectionNeeded(page_info)) { page_info.DPIY = hist.yDpi(); changed = true; } if(hist.isXCorrectionNeeded(page_info)) { page_info.DPIX = hist.xDpi(); changed = true; } if(changed) { SetPageInfo(cpage_, page_info); cfDebug(cf::MODULE_RSTUFF) << "new resolution: " << page_info.DPIX << "x" << page_info.DPIY; } if(hist_height_callback_) hist_height_callback_(hist.heightHistogram()); if(hist_width_callback_) hist_width_callback_(hist.widthHistogram()); }
Bool32 DeleteLines(Handle hCPage,void* phCLINE, const char* ImageDelLines) { // LDPUMA_ConsoleN("Активизируется функция тривиального удаления линий"); int time=clock(); CLINE_handle* pCLINE=(CLINE_handle*)phCLINE; MyLine* pHorLines=NULL; MyLine* pVerLines=NULL; int nHorLines=0; int nVerLines=0; int len_hor_mas=0; int len_ver_mas=0; int add_len_mas=50; uint32_t size_lineinfo=sizeof(LineInfo); if(!LDPUMA_Skip(NotKillPointed)) fl_not_kill_pointed=TRUE; else fl_not_kill_pointed=FALSE; dphNotTestAlik=!LDPUMA_Skip(hNotTestAlik); CIMAGEIMAGECALLBACK cbk; CIMAGEIMAGECALLBACK cbk1; // LinesTotalInfo lti; // LineInfo linfo; // собственно, что и надо PAGEINFO info = {0}; // Описание страницы // Handle pBlock; // uint32_t size32; int i; // uint32_t HorType; // uint32_t VerType; Bool fl_cont; uchar ImageName[CPAGE_MAXNAME]; // Получаем PAGEINFO текущей страницы GetPageInfo(hCPage,&info); // Копируем в pImage из PInfo указатель на изображение, // связанное со страницей for(i=0;i<CPAGE_MAXNAME;i++) ImageName[i]=info.szImageName[i]; if (!CIMAGE_GetCallbackImage(ImageName,&cbk)) return FALSE; cbk1.CIMAGE_ImageOpen = cbk.CIMAGE_ImageOpen; cbk1.CIMAGE_ImageRead = cbk.CIMAGE_ImageRead; cbk1.CIMAGE_ImageClose = cbk.CIMAGE_ImageClose; if (!CIMAGE_WriteCallbackImage((uchar*)ImageDelLines,cbk1)) { return FALSE; } Handle lpDIB; if(!CIMAGE_ReadDIB((uchar*)ImageDelLines,&lpDIB,1)) { CIMAGE_DeleteImage((uchar*)ImageDelLines); return FALSE; } CTDIB* ctdib = new CTDIB; if(!ctdib) { CIMAGE_DeleteImage((uchar*)ImageDelLines); return FALSE; } ctdib->SetDIBbyPtr (lpDIB); const int bytewide=ctdib->GetLineWidthInBytes(); int num_str=ctdib->GetLinesNumber (); // int bytesize=ctdib->GetImageSizeInBytes (); uchar* pmasp=(uchar*)(ctdib->GetPtrToBitFild()); // uchar* pos=(uchar*)(ctdib->GetPtrToPixel (pHorLines[0].begx,pHorLines[0].begy)); // uchar* pos2=(uchar*)(ctdib->GetPtrToPixel (pHorLines[0].begx,pHorLines[0].begy)); uint32_t size_line_com=sizeof(LINE_COM); CLINE_handle hline; if(LDPUMA_Skip(ObvKillLines)) { for(hline=CLINE_GetFirstLine(*pCLINE);hline;hline=CLINE_GetNextLine(hline)) { DelLineFromInside(pmasp,bytewide,num_str,hline); } } else//тривиальное снятие линий { // if(!LDPUMA_Skip(hUseCLine)) // { hline = CLINE_GetFirstLine(*pCLINE); nHorLines=0; len_hor_mas=50; nVerLines=0; len_ver_mas=50; if(!InitLineMas(&pHorLines,len_hor_mas)) { ctdib->ResetDIB (); delete ctdib; CIMAGE_DeleteImage((uchar*)ImageDelLines); return FALSE; } if(!InitLineMas(&pVerLines,len_ver_mas)) { DelLineMas(pHorLines); ctdib->ResetDIB (); delete ctdib; CIMAGE_DeleteImage((uchar*)ImageDelLines); return FALSE; } while(hline) { CPDLine cpdata; fl_cont=FALSE; cpdata=CLINE_GetLineData(hline); if(!cpdata) hline=CLINE_GetNextLine(hline); else { if((cpdata->Flags & LI_IsTrue)&&(!fl_not_kill_pointed||(fl_not_kill_pointed&&cpdata->Type!=NR_DT_LinePointed))) { if(cpdata->Dir==LD_Horiz) { if(nHorLines>=len_hor_mas) { if(!AddLenLineMas(&pHorLines,len_hor_mas,add_len_mas)) { fl_cont=TRUE; hline=CLINE_GetNextLine(hline); } } if(!fl_cont) { pHorLines[nHorLines].begx=cpdata->Line.Beg_X; pHorLines[nHorLines].begy=cpdata->Line.Beg_Y; pHorLines[nHorLines].endx=cpdata->Line.End_X; pHorLines[nHorLines].endy=cpdata->Line.End_Y; pHorLines[nHorLines].wide10=cpdata->Line.Wid10; nHorLines++; hline=CLINE_GetNextLine(hline); } } else { if(nVerLines>=len_ver_mas) { if(!AddLenLineMas(&pVerLines,len_ver_mas,add_len_mas)) { fl_cont=TRUE; hline=CLINE_GetNextLine(hline); } } if(!fl_cont) { pVerLines[nVerLines].begx=cpdata->Line.Beg_X; pVerLines[nVerLines].begy=cpdata->Line.Beg_Y; pVerLines[nVerLines].endx=cpdata->Line.End_X; pVerLines[nVerLines].endy=cpdata->Line.End_Y; pVerLines[nVerLines].wide10=cpdata->Line.Wid10; nVerLines++; hline=CLINE_GetNextLine(hline); } } } else hline=CLINE_GetNextLine(hline); } } /* } else { pBlock=NULL; pBlock = CPAGE_GetBlockFirst (hCPage, RLINE_BLOCK_TYPE ); if( pBlock==NULL) { info.Images|=IMAGE_DELLINE; SetPageInfo(hCPage,info); ctdib->ResetDIB (); delete ctdib; return TRUE; } size32 = CPAGE_GetBlockData(hCPage, pBlock, RLINE_BLOCK_TYPE, <i, sizeof(LinesTotalInfo)); if (size32 != sizeof(LinesTotalInfo) ) { ctdib->ResetDIB (); delete ctdib; CIMAGE_DeleteImage((uchar*)ImageDelLines); return FALSE; } HorType = (uint32_t)lti.Hor.Lns; VerType = (uint32_t)lti.Ver.Lns; ///////////////////////////////////////////////////////////////////////////////////////////// nHorLines=0; len_hor_mas=50; if(!InitLineMas(&pHorLines,len_hor_mas)) { ctdib->ResetDIB (); delete ctdib; CIMAGE_DeleteImage((uchar*)ImageDelLines); return FALSE; } pBlock=NULL; pBlock = CPAGE_GetBlockFirst(hCPage,HorType); while (pBlock) { fl_cont=FALSE; size32 = CPAGE_GetBlockData(hCPage,pBlock,HorType,&linfo,size_lineinfo); if(size32!=size_lineinfo) { fl_cont=TRUE; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType); } if(fl_cont) continue; if(!(linfo.Flags&LI_IsTrue)||(fl_not_kill_pointed&&(linfo.Flags&LI_Pointed))) { fl_cont=TRUE; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType); } if(fl_cont) continue; if(nHorLines>=len_hor_mas) { if(!AddLenLineMas(&pHorLines,len_hor_mas,add_len_mas)) { fl_cont=TRUE; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType); } } if(fl_cont) continue; pHorLines[nHorLines].begx=linfo.A.x; pHorLines[nHorLines].begy=linfo.A.y; pHorLines[nHorLines].endx=linfo.B.x; pHorLines[nHorLines].endy=linfo.B.y; pHorLines[nHorLines].wide10=(linfo.Thickness)*10; nHorLines++; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,HorType); } ///////////////////////////////////////////////////////////////////////////////////////////// nVerLines=0; len_ver_mas=50; pBlock=NULL; pBlock = CPAGE_GetBlockFirst(hCPage,VerType); if(!InitLineMas(&pVerLines,len_ver_mas)) { ctdib->ResetDIB (); delete ctdib; CIMAGE_DeleteImage((uchar*)ImageDelLines); DelLineMas(pHorLines); return FALSE; } while (pBlock) { fl_cont=FALSE; size32 = CPAGE_GetBlockData(hCPage,pBlock,VerType,&linfo,size_lineinfo); if(size32!=size_lineinfo) { fl_cont=TRUE; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType); } if(fl_cont) continue; if(!(linfo.Flags&LI_IsTrue)||(fl_not_kill_pointed&&(linfo.Flags&LI_Pointed))) { fl_cont=TRUE; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType); } if(fl_cont) continue; if(nVerLines>=len_ver_mas) { if(!AddLenLineMas(&pVerLines,len_ver_mas,add_len_mas)) { fl_cont=TRUE; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType); } } if(fl_cont) continue; pVerLines[nVerLines].begx=linfo.A.x; pVerLines[nVerLines].begy=linfo.A.y; pVerLines[nVerLines].endx=linfo.B.x; pVerLines[nVerLines].endy=linfo.B.y; pVerLines[nVerLines].wide10=(linfo.Thickness)*10; nVerLines++; pBlock = CPAGE_GetBlockNext(hCPage,pBlock,VerType); } } */ ///////////////////////////////////////////////////////////////////////////////////////////// int time_hor=clock(); for(i=0;i<nHorLines;i++) { if(pHorLines[i].begx>pHorLines[i].endx) DelOneHorLine(pmasp,bytewide,num_str,pHorLines[i].endx,pHorLines[i].endy,pHorLines[i].begx,pHorLines[i].begy,pHorLines[i].wide10); else DelOneHorLine(pmasp,bytewide,num_str,pHorLines[i].begx,pHorLines[i].begy,pHorLines[i].endx,pHorLines[i].endy,pHorLines[i].wide10); } time_hor=clock()-time_hor; // LDPUMA_ConsoleN("Time hor=%d",time_hor); int time_ver=clock(); for(i=0;i<nVerLines;i++) { if(pVerLines[i].begy>pVerLines[i].endy) DelOneVerLine(pmasp,bytewide,num_str,pVerLines[i].endx,pVerLines[i].endy,pVerLines[i].begx,pVerLines[i].begy,pVerLines[i].wide10); else DelOneVerLine(pmasp,bytewide,num_str,pVerLines[i].begx,pVerLines[i].begy,pVerLines[i].endx,pVerLines[i].endy,pVerLines[i].wide10); } time_ver=clock()-time_ver; // LDPUMA_ConsoleN("Time ver=%d",time_ver); DelLineMas(pHorLines); DelLineMas(pVerLines); }//конец тривиального удаления ctdib->ResetDIB (); delete ctdib; info.Images|=IMAGE_DELLINE; SetPageInfo(hCPage,info); time=clock()-time; // LDPUMA_ConsoleN("Time work=%d",time); return TRUE; }
Bool32 RemoveLines(PRSPreProcessImage Image, puchar * lppDIB) { Handle hccom = *Image->phCCOM; Handle hcpage = Image->hCPAGE; Handle *hLinesCCOM = Image->phLinesCCOM; puchar hDIB = NULL; Bool32 rc = TRUE; *hLinesCCOM = NULL; CCOM_comp *victim[100]; int32_t nvict,i; Bool32 yes_victim = FALSE; // // Удалим линии // if(!LDPUMA_Skip(ObvKillLines)||(LDPUMA_Skip(hNewLine)&&LDPUMA_Skip(Image->hDebugCancelVerifyLines))) rc=DeleteLines(hcpage,Image->phCLINE,PUMA_IMAGE_DELLINE); else { if(rc && !RLINE_DeleteLines(hcpage,PUMA_IMAGE_DELLINE)) { SetReturnCode_rstuff(RLINE_GetReturnCode()); rc = FALSE; } if (rc && LDPUMA_Skip(NotKillPointed) && LDPUMA_Skip(Image->hDebugCancelSearchDotLines)) rc = DeleteDotLines(Image->phCLINE, PUMA_IMAGE_DELLINE); } LDPUMA_Skip(hPrep2); // // Получим изображение с удаленными линиями // if(rc && !CIMAGE_ReadDIB((puchar)PUMA_IMAGE_DELLINE,(Handle*)&hDIB,TRUE)) { SetReturnCode_rstuff(CIMAGE_GetReturnCode()); rc = FALSE; } if(hDIB) { // // Удалим компоненты и выделим их заново. // *lppDIB = (puchar)hDIB; if(rc) { //if( CCOM_GetContainerVolume((CCOM_handle)*Image->phCCOM)>30000 ) // CCOM_CompressContatiner((CCOM_handle)*Image->phCCOM); if( CCOM_GetContainerVolume((CCOM_handle)*Image->phCCOM)<60000 && MyGetZher ((void**)victim, &nvict, 100, hcpage) && nvict ) yes_victim = TRUE; if( !yes_victim ) { CCOM_DeleteContainer((CCOM_handle)*Image->phCCOM); *Image->phCCOM = 0; } if(!ExtractComponents(FALSE, hLinesCCOM, (puchar)PUMA_IMAGE_DELLINE, Image)) { rc = FALSE; } else { PAGEINFO inf = {0}; GetPageInfo(Image->hCPAGE,&inf); strcpy((char*)inf.szImageName,PUMA_IMAGE_DELLINE); inf.Images|=IMAGE_DELLINE; SetPageInfo(Image->hCPAGE,inf); } if(rc) { *Image->phCCOM = (Handle)REXCGetContainer(); if(*Image->phCCOM == 0) { SetReturnCode_rstuff(REXC_GetReturnCode()); rc = FALSE; } hccom = *Image->phCCOM; if( *hLinesCCOM ) { // // Refersh CCOM // CCOM_comp *exa=CCOM_GetFirst((CCOM_handle)*hLinesCCOM,NULL); if( yes_victim ) { /* Rect16 rect1; uint32_t key = 111; for(i=0;i<nvict;i++) { exa = victim[i]; rect1.top = exa->upper; rect1.left = exa->left; rect1.bottom = exa->upper+exa->h; rect1.right = exa->left+exa->w; LDPUMA_DrawRect(NULL, &rect1, 0, 23635, 1, key); } if(!LDPUMA_Skip(hShowCheckLetters)) { LDPUMA_Console("Puma_Коробки жертв \n"); LDPUMA_WaitUserInput(NULL, NULL); LDPUMA_DeleteRects(NULL, key); } */ for(i=0;i<nvict;i++) { exa = victim[i]; if( remove_overlayed(exa,(CCOM_handle)*Image->phCCOM) ) { CCOM_comp *dup=CCOM_New((CCOM_handle)*Image->phCCOM,exa->upper,exa->left,exa->w,exa->h); if( dup ) { CCOM_Store(dup,0, exa->size_linerep, exa->linerep, exa->nl, exa->begs, exa->ends, exa->vers, NULL); dup->scale= exa->scale; dup->type = exa->type; dup->cs = exa->cs; } } } } CCOM_DeleteContainer((CCOM_handle)*hLinesCCOM); } } else LDPUMA_Console("Пропущен этап выделения компонент после удаления линий.\n"); } } return rc; }
//////////////////////////////////////////////////////////////////////////////// // Предварительная обработка // (07.07.2000) Изначально взято из puma.dll без изменений // сильно привязана к пуме // в начале окучиваем выделение компонент Bool32 PreProcessImage( PRSPreProcessImage Image ) { Bool32 gbAutoRotate = Image->gbAutoRotate; puchar *gpRecogDIB = Image->pgpRecogDIB; Handle hCPAGE = Image->hCPAGE; const char * glpRecogName = *Image->pglpRecogName; PCIMAGEBITMAPINFOHEADER info = (PCIMAGEBITMAPINFOHEADER)Image->pinfo; ///////////////////////////////// Bool32 rc = TRUE; //char * lpRecogName = NULL; uint32_t Angle = 0; hWndTurn = 0; if(InitPRGTIME()) ProgressStart(); if(!ProgressStep(1,5)) rc = FALSE; // Andrey 12.11.01 // Проинициализируем контейнер CPAGE // if(rc) { PAGEINFO PInfo = {0}; GetPageInfo(hCPAGE,&PInfo); strcpy((char*)PInfo.szImageName, glpRecogName); PInfo.BitPerPixel = info->biBitCount; PInfo.DPIX = info->biXPelsPerMeter*254L/10000; // PInfo.DPIX = PInfo.DPIX < 200 ? 200 : PInfo.DPIX; PInfo.DPIY = info->biYPelsPerMeter*254L/10000; // PInfo.DPIY = PInfo.DPIY < 200 ? 200 : PInfo.DPIY; PInfo.Height = info->biHeight; PInfo.Width = info->biWidth; // PInfo.X = 0; Уже установлено // PInfo.Y = 0; PInfo.Incline2048 = 0; PInfo.Page = 1; PInfo.Angle = Angle; SetPageInfo(hCPAGE,PInfo); } //////////////////////////////////////////////////////// // Выделим компоненты // if(!ProgressStep(2,65)) rc = FALSE; if(rc) { if(LDPUMA_Skip(Image->hDebugCancelComponent)/*DPumaSkipComponent()*/) { // uchar ori; PRGTIME prev = StorePRGTIME(65, 85); rc = ExtractComponents( gbAutoRotate, NULL, (puchar)glpRecogName, Image); RestorePRGTIME(prev); /* if(rc && gbAutoRotate) { //if(!REXC_GetOrient(&ori)) //if(!REXC_GetOrient(&ori) && db_spec_prj!=SPEC_PRJ_GIP ) if(!RNORM_GetOrient(&ori, *(Image->phCCOM)) && db_spec_prj!=SPEC_PRJ_GIP ) { SetReturnCode_rstuff(RNORM_GetReturnCode()); rc = FALSE; } else { //if(ori) if(ori && !(db_spec_prj==SPEC_PRJ_GIP&&ori==4)) { uint32_t dwTurn = 0; switch(ori) { case 1: Angle = 270; dwTurn = RIMAGE_TURN_270; break; case 2: Angle = 90; dwTurn = RIMAGE_TURN_90; break; case 3: Angle = 180; dwTurn = RIMAGE_TURN_180; break; } if( LDPUMA_Skip(Image->hDebugCancelTurn) /*umaSkipTurn()*/ /*) { if(!RIMAGE_Turn((puchar)glpRecogName,(puchar)PUMA_IMAGE_TURN,dwTurn,0)) { SetReturnCode_rstuff_rstuff(RIMAGE_GetReturnCode()); rc = FALSE; } else { if(!CIMAGE_ReadDIB((puchar)PUMA_IMAGE_TURN,(Handle*)gpRecogDIB,TRUE)) { SetReturnCode_rstuff_rstuff(CIMAGE_GetReturnCode()); rc = FALSE; } else { // // удалим общий контейнер // glpRecogName = PUMA_IMAGE_TURN; hWndTurn = LDPUMA_CreateWindow(PUMA_IMAGE_TURN,(*gpRecogDIB)); PRGTIME prev = StorePRGTIME(85, 100); rc = ExtractComponents( FALSE, NULL, (puchar)glpRecogName, Image); PAGEINFO info = {0}; GetPageInfo(hCPAGE,&info); info.Images|=IMAGE_TURN; // strcpy((char*)info.szImageName,PUMA_IMAGE_TURN); SetPageInfo(hCPAGE,info); RestorePRGTIME(prev); } } } } } }*/ //проверим наличие разрешения и попытаемся определить по компонентам, если его нет checkResolution(*(Image->phCCOM), hCPAGE); if(!ProgressStep(2,100)) rc = FALSE; } else LDPUMA_Console("Пропущен этап выделения компонент.\n"); } // // Переинициализируем контейнер CPAGE // if(rc) { PAGEINFO PInfo = {0}; GetPageInfo(hCPAGE,&PInfo); strcpy((char*)PInfo.szImageName, glpRecogName); PInfo.BitPerPixel = info->biBitCount; // PInfo.DPIX = info->biXPelsPerMeter*254L/10000; PInfo.DPIX = PInfo.DPIX < 200 ? 200 : PInfo.DPIX; // PInfo.DPIY = info->biYPelsPerMeter*254L/10000; PInfo.DPIY = PInfo.DPIY < 200 ? 200 : PInfo.DPIY; PInfo.Height = info->biHeight; PInfo.Width = info->biWidth; // PInfo.X = 0; Уже установлено // PInfo.Y = 0; PInfo.Incline2048 = 0; PInfo.Page = 1; PInfo.Angle = Angle; SetPageInfo(hCPAGE,PInfo); } if(DonePRGTIME()) ProgressFinish(); return rc; }
void checkResolution(Handle hCCOM, Handle hCPAGE) { PAGEINFO page_info = {0}; const int min_res = 99; CCOM_comp* pcomp=NULL; unsigned int Masy[100], Masx[100], i, Jy_m = 0, My_m = 0, Jx_m = 0, Mx_m = 0, M_t; bool flag_set = false; if (!GetPageInfo(hCPAGE, &page_info)) return; if (page_info.DPIX > min_res && page_info.DPIY > min_res) return; for (i=0; i<100; i++) Masx[i] = Masy[i] = 0; pcomp = CCOM_GetFirst(hCCOM, NULL); while (pcomp) { if (pcomp->h > 9 && pcomp->h < 100) Masy[pcomp->h]++; if (pcomp->w > 9 && pcomp->w < 100) Masx[pcomp->w]++; pcomp = CCOM_GetNext(pcomp, NULL); } for (i=11; i < 99; i++) { M_t = Masy[i-1] + Masy[i] + Masy[i+1]; if (M_t > My_m) { Jy_m = i; My_m = M_t; } M_t = Masx[i-1] + Masx[i] + Masx[i+1]; if (M_t > Mx_m) { Jx_m = i; Mx_m = M_t; } } if (Jy_m > 10 && My_m > 100 && !(page_info.DPIY*22 < 2*300*Jy_m && 2*page_info.DPIY*22 > 300*Jy_m)) { page_info.DPIY = (300*Jy_m+11)/22; flag_set = true; } if (Jx_m > 10 && Mx_m > 100 && !(page_info.DPIX*22 < 2*300*Jx_m && 2*page_info.DPIX*22 > 300*Jx_m)) { page_info.DPIX = (300*Jx_m+11)/22; flag_set = true; } if (flag_set) { SetPageInfo(hCPAGE, page_info); if (!LDPUMA_Skip(hDebugPrintResolution)) LDPUMA_ConsoleN("новое разрешение: DPIX=%d, DPIY=%d", page_info.DPIX, page_info.DPIY); } }