Esempio n. 1
0
//новая версия грамматического анализатора.
//текст реконструируется на основе вероятностного анализа результатов распознавания
//с применением взаимной корреляции частей разных букв. Слоги и слова реконструируются
//на основе вероятносного анализа корпуса тибетских текстов и правил построения шрифта.
void GLogicProcessor::classification(vector<stringOCR>&strArray,
                                      vector<OCRMatch>&matchLine,
                                      GBitmap* lineImg32,
                                      string &mainString,
                                      int sizeLine,
                                      int lineIndex){

    int print=0;
    vector<OCRMatch>dLine;
    TIME_START
    y0Base=strArray[lineIndex].LimY0;
    y1Base=strArray[lineIndex].LimY1;
    DR("@@@y0Base"<<y0Base<<" y1Base="<<y1Base<<" s="<<matchLine.size())
    
    GBitmap *letterAImg=GBitmap::create(lineImg32->columns(),lineImg32->rows(),BITMAP_32);
    GBitmap *letterBImg=GBitmap::create(lineImg32->columns(),lineImg32->rows(),BITMAP_32);

    
    
#ifdef MAIN_MODE
    
    //for(int i=0;i<matchLine.size();i++)if(matchLine[i].letterIndex==15650){cout<<"@@@@@";exit(0);}
    
    //drawGrapeLine(matchLine); exit(0);
    
    
    sort(matchLine.begin(),matchLine.end(),sortMatchX0);
    
    //cout<<"strArray.size()="<<strArray[0].size()<<" matchLine.size()="<<matchLine.size()<<endl;
    
    if(!matchLine.size()||!strArray.size())return;   //
    
    for(int i=0;i<matchLine.size();i++){
        matchLine[i].correlationNew=0;
        if(!matchLine[i].correlation)continue;
        matchLine[i].status=0;
    }
    //drawGrapeLine(matchLine); exit(0);

    compressMatch(matchLine);
    //drawGrapeLine(matchLine); exit(0);


    //на этом этапе в matchLine записано около 50 результатов на одну букву текста
    //заменяем одинаковые буквы на букву с наибольшей корреляцией и наибольшей общей площадью совпадающей с изображением на странице.
    //также для каждой гипотезы распознанной буквы проверяем перекрытие с соседними буквами
    //оставляем только те буквы, которые лучше описывают соответствующие площади буквы области изображения.
    letterNeighborsNew(matchLine,lineImg32,letterAImg,letterBImg);

    //drawGrapeLine(matchLine); exit(0);
    
    
#ifdef STACK_MODE    
    //saveMatch(matchLine,"/2_2.match");
#endif
    

    for(int i=0;i<matchLine.size();i++){
        if(matchLine[i].correlation){
          matchLine[i].status=0;
          if(matchLine[i].OCRIndex!=3&&matchLine[i].correlationNew)matchLine[i].correlation=matchLine[i].correlationNew;
          dLine.push_back(matchLine[i]);
        }
    }
    
    DR("done match processing line.size()="<<dLine.size())
    sort(dLine.begin(),dLine.end(),sortMatchX0);
    DR("@@@@@ SAVE MATCH")
#ifdef STACK_MODE    
    //saveMatch(dLine,"/2.match");
#endif    
#endif
    
#ifdef STACK_MODE    
    //readMatch(dLine,"/2.match");
#endif    
    
    //компрессия. Все одинаковые буквы в пределах габарита буквы
    //заменяются на одну букву с макcмимальной корреляцией
    compressMatch(dLine);

    //drawGrapeLine(dLine); exit(0);

    collectStackLetter(strArray,dLine, matchLine,lineImg32,letterAImg,letterBImg,lineIndex);
    //cout<<"COLLECT"; TIME_PRINT_
     //exit(0);
    //drawGrapeLine(dLine);exit(0);

    compressMatch(dLine);
    //drawGrapeLine(dLine);exit(0);
    //анализ готовых стеков.
    //проверяем есть ли над или под одиночной буквой коренные буквы или огласовки с высокой корреляцией.
    //если есть, то букву считаем частью стека и убираем как строительный блок OpenType.
    //testStackLetter(dLine,lineImg32,letterAImg,letterBImg);
    
    //drawGrapeLine(dLine); exit(0);
    
    letterAImg->destroy();
    letterBImg->destroy();
    
    string strW;
    vector<uint>letterX;
    vector<OCRMatch>line;
    vector<OCRMatch>resultLine;
    map<vector<int>,ulong>searchResult;
    
    buildSearchString(dLine,line,letterX,strW);
    cout<<strW<<endl<<endl;
    //drawGrapeLine(line); exit(0);
    textCorpusGMap->getOCRStackKey(strW,letterX,searchResult, ANY_MATCH);
    //inputData.log<<" 2"<<endl;inputData.log.flush();
    for (int i=0;i<line.size();i++){
        if(!line[i].correlation)continue;                        //cout<<line[i].name;
        line[i].name=Unicode_to_UTF(line[i].wName);              //cout<<" -- "<<line[i].name;
        line[i].name=YagpoToUni(line[i].name);   //cout<<" -- "<<line[i].name<<endl;
        resultLine.push_back(line[i]);
    }
    //logicProcessor->drawGrapeLine(line); //exit(0);
    //inputData.log<<" 3"<<endl;inputData.log.flush();
    //renderDictSearch(searchResult,line,resultLine,matchLine);   //mainString+="<br>"+lineString+"original<br>";
    if(print){ cout<<"RENDER "; TIME_PRINT_ }
    strArray[lineIndex].line=dLine;   //сохраняем для вывода в HTML
    //logicProcessor->drawGrapeLine(dLine); //exit(0);
    //inputData.log<<" 4"<<endl;inputData.log.flush();

}
Esempio n. 2
0
//новая версия грамматического анализатора.
//текст реконструируется на основе вероятностного анализа результатов распознавания
//с применением взаимной корреляции частей разных букв. Слоги и слова реконструируются
//на основе вероятносного анализа корпуса тибетских текстов и правил построения тибетского шрифта.
void GLogicProcessor::letterAssociation(vector<stringOCR>*strArray,
                                      vector<OCRMatch>&matchLine,
                                      vector<OCRMatch>&dLine,
                                      GBitmap* lineImg32,
                                      string &mainString,
                                      int sizeLine,
                                      int lineIndex,
                                      int OCRMode){

    int print=0;
    TIME_START
    y0Base=strArray[0][lineIndex].LimY0;
    y1Base=strArray[0][lineIndex].LimY1;
    DR("@@@y0Base"<<y0Base<<" y1Base="<<y1Base<<" s="<<matchLine.size())
    
    GBitmap *letterAImg=GBitmap::create(lineImg32->columns(),lineImg32->rows(),BITMAP_32);
    GBitmap *letterBImg=GBitmap::create(lineImg32->columns(),lineImg32->rows(),BITMAP_32);

    
    
#ifdef MAIN_MODE
    
    //for(int i=0;i<matchLine.size();i++)if(matchLine[i].letterIndex==15650){cout<<"@@@@@";exit(0);}
    
    //drawGrapeLine(matchLine); exit(0);
    
    
    sort(matchLine.begin(),matchLine.end(),sortMatchX0);
    
    //cout<<"strArray[0].size()="<<strArray[0].size()<<" matchLine.size()="<<matchLine.size()<<endl;
    
    if(!matchLine.size()||!strArray[0].size())return;   //
    
    int count=0;
    //int maxH=45;
    //int maxCor=97;
    for(int i=0;i<matchLine.size();i++){
        matchLine[i].setSize();
        count=0;
        matchLine[i].correlationNew=0;
        /*
        if((matchLine[i].OCRIndex=='A'&&
           abs(matchLine[i].y0-y0Base)>3&&
           matchLine[i].correlation>maxCor&&
           matchLine[i].letterH>maxH)||
           (matchLine[i].OCRIndex=='A'&&
            matchLine[i].y0<y0Base-3&&
            matchLine[i].correlation>98)
           ){
            maxH=matchLine[i].letterH;
            maxCor=matchLine[i].correlation;
            y0Base=matchLine[i].y0; y1Base=y0Base+32;
        }
        */
        if(!matchLine[i].correlation)continue;
        matchLine[i].status=0;
    }
    //drawGrapeLine(matchLine); exit(0);
    
    compressMatch(matchLine);
    
    //drawGrapeLine(matchLine); exit(0);
    

    //на этом этапе в matchLine записано около 50 результатов на одну букву текста
    //заменяем одинаковые буквы на букву с наибольшей корреляцией и наибольшей общей площадью совпадающей с изображением на странице.
    //также для каждой гипотезы распознанной буквы проверяем перекрытие с соседними буквами
    //оставляем только те буквы, которые лучше описывают соответствующие площади буквы области изображения.
    letterNeighborsNew(matchLine,lineImg32,letterAImg,letterBImg);
    
    
    //drawGrapeLine(matchLine); exit(0);
    
#ifdef STACK_MODE    
    //saveMatch(matchLine,"/2_2.match");
#endif
    

    for(int i=0;i<matchLine.size();i++){
        if(matchLine[i].correlation){
          matchLine[i].status=0;
          if(matchLine[i].OCRIndex!=3&&matchLine[i].correlationNew)matchLine[i].correlation=matchLine[i].correlationNew;
          dLine.push_back(matchLine[i]);
        }
    }
    
    DR("done match processing line.size()="<<dLine.size())
    sort(dLine.begin(),dLine.end(),sortMatchX0);
    DR("@@@@@ SAVE MATCH")
#ifdef STACK_MODE    
    //saveMatch(dLine,"/2.match");
#endif    
#endif
    
#ifdef STACK_MODE    
    //readMatch(dLine,"/2.match");
#endif    
    
    //компрессия. Все одинаковые буквы в пределах габарита буквы
    //заменяются на одну букву с макcмимальной корреляцией
    compressMatch(dLine);

    //drawGrapeLine(dLine); exit(0);

    collectStackLetter(strArray,dLine, matchLine,lineImg32,letterAImg,letterBImg,lineIndex);
    //cout<<"COLLECT"; TIME_PRINT_
     //exit(0);
    //drawGrapeLine(dLine);exit(0);

    compressMatch(dLine);
    //drawGrapeLine(dLine);exit(0);

    //анализ готовых стеков.
    //проверяем есть ли над или под одиночной буквой коренные буквы или огласовки с высокой корреляцией.
    //если есть, то букву считаем частью стека и убираем как строительный блок OpenType.
    testStackLetter(dLine,lineImg32,letterAImg,letterBImg);
    
    //drawGrapeLine(dLine); exit(0);
    
    letterAImg->destroy();
    letterBImg->destroy();
    
#ifdef STACK_MODE    
    //saveMatch(line,"/2_1.match");
#endif    
    
    if(print){TIME_PRINT_}
    return;
 }
Esempio n. 3
0
//новая версия грамматического анализатора.
//текст реконструируется на основе вероятностного анализа результатов распознавания
//с применением взаимной корреляции частей разных букв. Слоги и слова реконструируются
//на основе вероятносного анализа корпуса тибетских текстов и правил построения тибетского шрифта.
void GLogicProcessor::letterAssociation(vector<stringOCR>&strArray,
                                      vector<OCRMatch>&matchLine,
                                      vector<OCRMatch>&dLine,
                                      GBitmap* lineImg32,
                                      GBitmap* letterAImg,
                                      GBitmap* letterBImg,
                                      string &mainString,
                                      int sizeLine,
                                      int lineIndex){

    int print=0;
    int OCRMode=inputData.OCRMode;
    TIME_START
    y0Base=strArray[lineIndex].LimY0;
    y1Base=strArray[lineIndex].LimY1;
    DR("@@@y0Base"<<y0Base<<" y1Base="<<y1Base<<" s="<<matchLine.size())
    
    //for(int i=0;i<matchLine.size();i++)if(matchLine[i].letterIndex==15650){cout<<"@@@@@";exit(0);}
    
    //drawGrapeLine(matchLine); exit(0);
    if(!matchLine.size()||!strArray.size())return;   //
 
    //для каждой буквы определяем количесво точек фокальных линий текста, совпадающих с областью ON всех масок буквы.
    //таким образом определем настолько область ON этой буквы совпадает с текстом.
    OCRBox s;
    for (int i=0;i<matchLine.size();i++){
        if(!matchLine[i].correlation)continue;
        letterAImg->fillColumns32V(0, &matchLine[i].s);  //стираем букву
        matchLine[i].drawPict32(letterAImg,0,0,XOR_MODE);
        matchLine[i].pCount=lineImg32->img32UnionLine(letterAImg, &matchLine[i].s);
        //if(i==518)cout<<i<<" "<< matchLine[i].name<<" pCount="<<matchLine[i].pCount<<endl;
    }
    
    compressMatch(matchLine);
    //drawGrapeLine(matchLine); exit(0);
    
    
    letterConstruction(matchLine,OCRMode);
    
    //drawGrapeLine(matchLine); exit(0);

//#ifndef OCR_woodblock
    
    //на этом этапе в matchLine записано около 50 результатов на одну букву текста
    //заменяем одинаковые буквы на букву с наибольшей корреляцией и наибольшей общей площадью совпадающей с изображением на странице.
    //также для каждой гипотезы распознанной буквы проверяем перекрытие с соседними буквами
    //оставляем только те буквы, которые лучше описывают соответствующие площади буквы области изображения.
//    letterNeighborsNew(matchLine,lineImg32,letterAImg,letterBImg);
//#else
    letterNeighborsNew(matchLine,lineImg32,letterAImg,letterBImg);
//#endif
    
    //drawGrapeLine(matchLine); exit(0);

    for(int i=0;i<matchLine.size();i++){
        if(matchLine[i].correlation){
          matchLine[i].status=0;
          dLine.push_back(matchLine[i]);
        }
    }

    //компрессия. Все одинаковые буквы в пределах габарита буквы
    //заменяются на одну букву с макcмимальной корреляцией
    compressMatch(dLine);
    
    for(int i=0;i<dLine.size();i++){
        if(!dLine[i].correlation||!dLine[i].name.size())continue;
        wstring w;  w=UTF_to_Unicode(dLine[i].name);
        //переводим все буквы в верхний регистр
        w[0]=UniBigLetters[w[0]];
        dLine[i].uni=w[0];
    }

    
    //drawGrapeLine(dLine); exit(0);
    
    if(print){TIME_PRINT_ DR("STACK")};

    
    
    //drawGrapeLine(dLine); exit(0);
    
    if(OCRMode==1){
        collectStackLetter(strArray,dLine, matchLine,lineImg32,letterAImg,letterBImg,lineIndex);

        //cout<<"COLLECT"; TIME_PRINT_
        //exit(0);
        //drawGrapeLine(matchLine);exit(0);
        compressMatch(matchLine);
    }else{
        matchLine=dLine;
        return;
    }
    
    
    //drawGrapeLine(matchLine);exit(0);

//#ifndef OCR_woodblock
    //анализ готовых стеков.
    //проверяем есть ли над или под одиночной буквой коренные буквы или огласовки с высокой корреляцией.
    //если есть, то букву считаем частью стека и убираем как строительный блок OpenType.
//    testStackLetter(matchLine,lineImg32,letterAImg,letterBImg);
//#endif
    
    for(int i=0;i<dLine.size();i++){
        if(!dLine[i].correlation||(dLine[i].OCRIndex!='Z'&&dLine[i].OCRIndex!='N'))continue;
        matchLine.push_back(dLine[i]);
        
    }
    
    //drawGrapeLine(matchLine); exit(0);
    
    if(print){TIME_PRINT_}
    return;
 }