// -------------------------------------------------------------------------------------- void RedrawPrefsWindowList(WindowRef prefsWindow) { ListHandle iconList; ListBounds visibleCells; SInt16 pixelDepth; Boolean isColorDevice; short row; Cell theCell; GetWindowProperty(prefsWindow, kAppSignature, kIconListTag, sizeof(ListHandle), NULL, &iconList); GetListVisibleCells(iconList, &visibleCells); GetWindowDeviceDepthAndColor(prefsWindow, &pixelDepth, &isColorDevice); SetThemeBackground(kThemeBrushWhite, pixelDepth, isColorDevice); for (row = visibleCells.top; row < visibleCells.bottom; row++) // redraw just the { // visible cells SetPt(&theCell, 0, row); LDraw(theCell, iconList); } }
// ОДИН ЗАПУСК // Подпрограмма фильтрации строк с вычисленным параметром фильтрации KHigS; // ----------------------------------------------------------------------------- void GBitset::RepeatStringDetector() { int y,x,p,d,s; int MGilb,PGilb; int print=1; /// GAmp; амплитуда сигнала после 2х преобразований ГИЛБЕРТА. BufHelp.assign(ncnr,0); PGilb=KFStrok; // PGilb - параметр (ширина) преобразования ГИЛБЕРТА // p=KFStrok; // KHigS - параметр фильтрации MGilb=nrows; // размер массива преобразования ГИЛБЕРТА // KHigS=PGilb*4+8; // KHigS - параметр фильтрации // нормировка импульсной характеристики фильтра, т.е. импульсные // характеристики фильтров разных порядков должны иметь одинаковые амплитуды. s=sqrt((float)100*KHigS) ; for ( y=0; y < nrows; y++ ){ if( HStr[y]<4 ){ BufS[y]=0; } // Суммы меньше 8 пикселов считаются равными нолю. // <8 (4) пикселей - строки определяются начиная с 2 (1) букв else { BufS[y]=HStr[y]*s/7; } // ВАЖНО - сумма вдоль текста HStr[y] домножена на 4 (BufS[y]=4*HStr[y]*s/28;) } // for y // BufS[y]=24*sqrt(HStr[y]*s/28); // адаптивная фильтрация H[y] SP->filterHigh(BufS,KHigS); // преобразование ГИЛБЕРТА 1 - BufT filterGilbert(BufS,BufT, MGilb,PGilb); #ifdef DEBUGLVL if ( GrafT[1][5] ) {LDraw(BufT,1200,0x0000AA00);} // вызов функции рисования зеленый #endif // преобразование ГИЛБЕРТА 2 - BufR сигнал без постоянной составляющей filterGilbert(BufT,BufR, MGilb,PGilb); //// PolarCoordinates( BufT, BufR, 50000, 500, 200, 16, 0x0000AA00); // увеличение градиента преобразования ГИЛБЕРТА // в окрестности максимума исходной кривой H[y] for ( y=6; y < nrows-6; y++ ){ x=BufT[y]*BufS[y]; if(x>=0) BufT[y] = sqrt((float)x); else BufT[y] =-sqrt((float)-x); }// for y #ifdef DEBUGLVL if ( GrafT[1][5] ) { LDraw(BufT,1100,0x0000AA00); } // вызов функции рисования зеленый #endif // предворительное вычисление трех направляющих строки.Вычисление максимальнй // амплитуды (8 пиксемей от края печа не используются) d=0; NStrok=0; // GAmp=0; for ( y=8; y < nrows-8; y++ ){ // вычисление координат середины строки SAmp по максимому энергии if( BufT[y]<=0 && BufT[y+1]>0 && BufT[y-2]< BufT[y] && BufT[y+1]< BufT[y+3] && BufT[y-4]< BufT[y-2] && BufT[y+3]< BufT[y+5] ) { NStrok++; /// BufHelp[y]=800; // GAmp=BufR[y]/2; SAmp=BufS[y]; // вычисление 2 координат верха и низа строки по уровню GAmp=BufR[y]/2; for ( p=y-4; BufR[p]<BufR[y]/2 && p>8 && p < nrows-8; p-- ){ } HBuf[d]=0; HBuf[d+1]=p; d+=2; /// BufHelp[p]+=400; for ( p=y+4; BufR[p]<BufR[y]/2 && p>8 && p < nrows-8; p++ ){ } HBuf[d]=ncolumns; HBuf[d+1]=p; d+=2; /// BufHelp[p]+=300; } // BufHelp[y]=400; }// for y // NStrok вычисленное колличество строк в печа DT(" NStrok="<<NStrok);DM(END); /* // смещение направляющих строк в вверх и в низ на долю от ширины строки for(y=0; y < NStrok*4 && y<nrows; y+=4){ // смещение направляющий строки в вверх на одну пятую HBuf[y+3]=HBuf[y+3]+(HBuf[y+3]-HBuf[y+1])/5; // смещение направляющий строки в низ на одну треть HBuf[y+1]=HBuf[y+1]-(HBuf[y+3]-HBuf[y+1])/5; }// for y */ // Заполнение структур координатами строк // OCRclases.h // ImageProcessor.cpp strArray->resize(NStrok); d=0; if(NStrok){ for ( y=0; y < NStrok*4 && y<nrows-4; y+=4 ){ // x0,y0,x1,y1 координаты строк strArray[0][d].x0=HBuf[y]; strArray[0][d].y0=HBuf[y+1]; strArray[0][d].x1=HBuf[y+2]; strArray[0][d].y1=HBuf[y+3]; strArray[0][d].stringFlag=1; // флаг cтроки =1 (=0), cтрока состоит из букв (линии). strArray[0][d].NLetter=0; // примерная длинна строки (оценка) d++; // DM( " x0="<<wt.x0<< " y0="<<wt.y0<< " x1="<<wt.x1<< " // y1="<<wt.y1<< "\n---\n"); }// for y } /* */ // x0,y0,x1,y1 // x0,y0 координаты левого нижнего угла прямоугольника строки (глифа, слога, буквы). // x1,y1координаты правого верхнего угла прямоугольника строки (глифа, слога, буквы). //cout<<" @@@@ NStrok="<<NStrok<<" strArray[0][ns].y0="<<strArray[0][0].y0<<" strArray[0][ns].y1="<<strArray[0][0].y1<<endl; /// Дополнение структуры координатами середины между строк и производными от них int ns, LimY0, LimY1; // strArray->resize(NStrok); if( NStrok >=1 ){ for ( d=0; d < NStrok && d<nrows-4; d++ ){ // h высота строки strArray[0][d].h=(strArray[0][d].y1-strArray[0][d].y0); // vLim минимальная длинна вектора strArray[0][d].vLim=strArray[0][d].h*2; // *3/2 сами вектора домножены на *10 }// for d for ( d=0; d < NStrok-1 && d<nrows-4; d++ ){ // // LimY0 верхний лимит строки strArray[0][d].LimY0=(strArray[0][d].y0 + strArray[0][d].y1 + strArray[0][d+1].y0 + strArray[0][d+1].y1)/4; // LimY1 нижний лимит строки strArray[0][d+1].LimY1=strArray[0][d].LimY0; }// for d /**/ } // if(NStrok) // отработка самой верхней и самой нижней строки // для получения лимитов строк (середины между строками) if( NStrok >=2 ){ ns=NStrok-1; // самый нижний лимит LimY1=strArray[0][0].y0 + strArray[0][0].y1 - strArray[0][1].LimY1; // самый верхний лимит LimY0=strArray[0][ns].y1 + strArray[0][ns].y0 - strArray[0][ns-1].LimY0; // проверка выхода за граници изображения if ( LimY1 < 2 ) LimY1=1; if ( LimY0 > nrows-2 ) LimY0=nrows-1; strArray[0][0].LimY1=LimY1; strArray[0][ns].LimY0=LimY0; /// ТАБЛИЦА // DM(END); DM(strArray[0][d].y0<<"\t"); if (y%10==0)DM(END); DM(END); } if( NStrok ==1 ){ LimY0=strArray[0][0].y0 - (strArray[0][0].y0 - strArray[0][0].y1)*2; // проверка выхода за граници изображения if ( LimY0<0 ) LimY0=0; strArray[0][0].LimY0=LimY0; } /**/ // ВИЗУАЛИЗАЦИЯ лимитов строк (черная) /* int delta1=strArray[0][0].LimY1; int delta0=strArray[0][ns].LimY0; for(x=0; x < ncolumns-1; x++) { for (y=delta1; y<12+delta1; y++)drawData[0][y][x]*=0.1; // 0.8*ncolumns; for (y=delta0; y<6 +delta0; y++)drawData[0][y][x]*=0.1; // 0.8*ncolumns; } */ #ifdef DEBUGLVL if ( GrafT[1][5] ) { /* // ВИЗУАЛИЗАЦИЯ цифровая DM(END); DM(nrows<<" nrows "); DM(END); DM(END); DM(KFStrok<<" KFStrok "); DM(KHigS<<" KHigS "); DM(NStrok<<" NStrok "); DM(END); DM(END); */ /* // ВИЗУАЛИЗАЦИЯ цифровая, координаты строк, медленный вывод DM(END); for ( y=0; y < NStrok*4; y++ ){ // ТАБЛИЦА DM(HBuf[y]<<"\t"); if ((y+1)%10==0)DM(END); }//for y DM(END); DM(END); */ // ВИЗУАЛИЗАЦИЯ аналоговая LDraw(BufS,1350,0x000000FF); // вызов функции рисования красный LDraw(BufR,1200,0x000000FF); // вызов функции рисования красный //LDraw(BufHelp,1100,0x000000FF); // вызов функции рисования красный LineVertical(1200, 0x0000AA00); // зеленый //sm =(KHigS*8+1250); //LDraw(BufR,sm,0x00AA0011); // вызов функции рисования темно синий /* */ /* /// ТАБЛИЦА лимитов строк DM(END); for ( y=0; y < NStrok; y++ ){ DM(strArray[0][y].LimY0<<"\t"); if (y%10==0)DM(END); /// ТАБЛИЦА }//for y DM(END); /// ТАБЛИЦА лимитов строк DM(END); for ( y=0; y < NStrok; y++ ){ DM(strArray[0][y].LimY1<<"\t"); if (y%10==0)DM(END); }//for y DM(END); */ // ВИЗУАЛИЗАЦИЯ аналоговая // получение координат верхнего LimY0 и нижнего LimY1 лимита строки из структуры /* for (int m=0; m <NStrok; m++ ){ // m+=2 for( int x =0; x <ncolumns; x++ ){ drawData[0][strArray[0][m].LimY0][x]*=0.1; drawData[0][strArray[0][m].LimY0+1][x]*=0.1; drawData[0][strArray[0][m].LimY1][x]*=0.1; drawData[0][strArray[0][m].LimY1+1][x]*=0.1; } //// DM(strArray[0][m].LimY1<<"LimY1 "); DM(strArray[0][m].LimY0<<"LimY0 "); } // m //// DM(END); */ } // if ( GrafT[1][5] ) // Визуализация аналоговая прямоугольников в структурах // if ( GrafT[1][6] ) { stringDraw(0x0000AA00); } // зеленый #endif /**/ //strArray[0][ns].LimY0 = 1000; //strArray[0][0].LimY1=2000; }//_____________________________________________________________________________