Пример #1
0
/**
 * OCR process from gray image input
 */
int ocrProcess(Image binImg) {

    int i, h, w;
    h = binImg.h;
    w = binImg.w;
    int count =0, lCount = 0;

    int start = 0;
    int endLine = 0;
    int nLine;
    Rect rect;

    int* charIndex[20];

    system("rm -rf data");
    system("mkdir -p data");
    system("rm -rf leven");
    system("mkdir -p leven");


    createNetworkFromFile();

    /// segmentation processing
    while((nLine = ccLineLabeling(binImg, start))!= 0) {
        if(nLine < 3) continue;
        printf("%d\n",nLine);
        int baseLine = getBaselineHeight(nLine);

//        int avgSpace = getAverageSpace(nLine);
        /// get slant deg
        int slantDeg = getSlantDeg(binImg, baseLine, nLine);
//        printf("slantDeg = %d\n", slantDeg);

        int nChar = 0;

        for(i = 0; i < nLine; i++) {
            int index = getSegmentIndex(i);
//            printf("%d ", index);
            rect = getCharRect(index);
            endLine = endLine > (rect.y + rect.h) ? endLine :(rect.y + rect.h);
            Image charImg = getImageFromRect(binImg, rect, index);
            if(slantDeg) {
                charImg = slantRemoval(charImg, slantDeg);
            }
//            char* name = (char*) malloc(20* sizeof(char));
//            sprintf(name, "out_s_%d_%d.txt", lCount, i);
//            printImage(charImg, name);

            charImg = contourFinding(charImg);
            smoothContour(charImg);
            thinImageOnMatch(charImg);
            double* input = getFeature(charImg);
            double prop, maxProp = 0.0;

            /// recognition
            nChar++;
            charIndex[nChar-1] = charRecognition(input, &prop);


            /// check space
            //int space = getSpace(i, nLine, binImg);
            //if(space > baseLine/2) {//printf(" ");
            //    createWordFst(charIndex, nChar);
            //    nChar = 0;
            //    printf(" ");
            //}
            deleteImage(charImg);
            free(input);
            count++;
//            }
//            printf(" ");
//            start_w = end_w;
//            deleteImage(wordImg);
        }
        printf("\n");
        start = endLine;
        lCount++;
    }
    deleteImage(binImg);
    deleteNetwork();
    printf("%d\n", count);
    return 0;
}
Пример #2
0
// Заполнение src->edgeA, src->edgeB src->inCont src->centLine
int correctContour(frGeomStrip* src){
	if(!src->isStrip()){
		return -1;
	}

	src->minX = src->maxX = src->minY = src->maxY = -1;

	// до начала имнимум-максимум - первая точка
	src->minX = src->maxX = ((CvPoint*) cvGetSeqElem(src->stripCont, 0))->x;
	src->minY = src->maxY = ((CvPoint*) cvGetSeqElem(src->stripCont, 0))->y;

	// ищем координаты прямоугольника, описывающего контур
	for( int i=0; i<src->stripCont->total; ++i ) {
		CvPoint* t = (CvPoint*)cvGetSeqElem ( src->stripCont, i );
		src->minX = (t->x < src->minX) ? t->x : src->minX;
		src->maxX = (t->x > src->maxX) ? t->x : src->maxX;
		src->minY = (t->y < src->minY) ? t->y : src->minY;
		src->maxY = (t->y > src->maxY) ? t->y : src->maxY;
	}

	// creating black image with contour highlited with white pixels
	// вспомогательное изображение для отрисовки и "прострела" контура
	IplImage* auxiliaryImage = cvCreateImage( cvSize(src->stripFrame->width, src->stripFrame->height), IPL_DEPTH_8U, 1);
	cvFillImage(auxiliaryImage, 0.0);

	CvRect myROI = src->getROI();

	/*
	if( myROI.x > 0)
		printf("*");
		*/
	// изображение для визуализации работы с гранями
	IplImage* visualImage = cvCreateImage( cvSize(myROI.width , myROI.height), IPL_DEPTH_8U, 3);
	cvFillImage(visualImage, -10.0);

	//сохранили оригинальное РОИ
	CvRect origROI = cvGetImageROI(src->stripFrame );

	// назначаем новое РОИ, чтобы скопировалась только нужная область в картинку visualImage
	cvSetImageROI(src->stripFrame, myROI);
	//	cvCopy(src->stripFrame, visualImage, 0);
	
	//cvShowImage("visual", visualImage);

	// восстановили оригинаьное РОИ
	cvSetImageROI(src->stripFrame, origROI);

	cvDrawContours(auxiliaryImage, src->stripCont, CVX_WHITE, CVX_WHITE, 0, 1);
	
	
	vector<CvPoint> APoints, BPoints, middlePoints; // левые и правые (иногда верхние и нижние) точки границы. заполняются сверху-вниз полосы

	int start = (vertical) ? src->minY + (src->maxY - src->minY) * ((float)HEAD_TAIL_PERCENT/100) : 
							 src->minX + (src->maxX - src->minX) * ((float)HEAD_TAIL_PERCENT/100) ;
	int finish =(vertical) ? src->minY + (src->maxY - src->minY) * (1 - (float)HEAD_TAIL_PERCENT/100) :
							 src->minX + (src->maxX - src->minX) * (1 - (float)HEAD_TAIL_PERCENT/100) ;
	int begin = (vertical) ? src->minX - 1 : src->minY - 1;
	int end	=	(vertical) ? src->maxX + 1 : src->maxY + 1;

	for( int i = start; i < finish; i++){		// Обходим сверху вниз (л-п)	

		for( int j = begin; j < end; j++){		// "стреляем" слева (сверху) до первого не чёрного пикселя
			uchar pix =  (vertical) ? px(auxiliaryImage, j /*- myROI.x*/, i /*- myROI.y*/) : px(auxiliaryImage, i /*- myROI.x*/, j /*- myROI.y*/);
			if( 0 != pix ){	// Первая не чёрная точка в этой строке пикселов
				CvPoint t;
				t.x = (vertical) ? j : i;
				t.y = (vertical) ? i : j;
				APoints.push_back( t );
				break;
			}// if 
		}// for j
		
		for( int j = end; j > begin; j--){ // "стреляем" справа (снизу) до первого не чёрного пикселя
			uchar pix =  (vertical) ? px(auxiliaryImage, j /*- myROI.x*/, i /*- myROI.y*/) : px(auxiliaryImage, i /*- myROI.x*/, j /*- myROI.y*/);
			if( 0 != pix ){	// Первая не чёрная точка в этой строке пикселов
				CvPoint t;
				t.x = (vertical) ? j : i;
				t.y = (vertical) ? i : j;
				BPoints.push_back( t );
				break;
			}// if 
		}// for j
		
		CvPoint t;
		t.x = (vertical) ? (APoints.back().x + BPoints.back().x) / 2 : i;
		t.y = (vertical) ? i : (APoints.back().y + BPoints.back().y) / 2;

		middlePoints.push_back(t);

	}// for i


	vector<CvPoint>::iterator itr;

	itr = APoints.begin();
	while(itr != APoints.end()){
		src->edgeA.push_back(*itr);	
		++itr;
	}

	itr = BPoints.begin();
	while(itr != BPoints.end()){
		src->edgeB.push_back(*itr);
		++itr;
	}

	itr = middlePoints.begin();
	while(itr != middlePoints.end()){
		 src->centLine.push_back(*itr);
		++itr;
	}

	// smooth contours edgeA and edgeB
	smoothContour( src );
	
	src->chordA = chorda(src->edgeA, src->posChordA);
	src->chordB = -chorda(src->edgeB, src->posChordB);

	
	// вывод результата (две грани и центральная линия) на картинку visualImage
		
	// рисуем  левую, правую и среднюю линии

	//printf("S: %d\t", curFrStrip.isStrip() ? 1 : 0);
		if(src->edgeA.size() > 5){
			
			vector<CvPoint>::iterator itr2 = src->edgeA.begin();
			while(itr2 != src->edgeA.end()){
				cvLine( visualImage, cvPoint(itr2->x - myROI.x, itr2->y - myROI.y), cvPoint(itr2->x - myROI.x, itr2->y - myROI.y), CV_RGB(0,0,0));
				++itr2;
			}
			
			vector<CvPoint>::iterator itr3 = src->edgeB.begin();
			while(itr3 != src->edgeB.end()){
				cvLine( visualImage, cvPoint(itr3->x - myROI.x, itr3->y - myROI.y), cvPoint(itr3->x - myROI.x, itr3->y - myROI.y), CV_RGB(0,0,0));
				++itr3;
			}
			
			vector<CvPoint>::iterator itr4 = src->centLine.begin();
			while(itr4 != src->centLine.end()){
				cvLine( visualImage, cvPoint(itr4->x - myROI.x, itr4->y - myROI.y), cvPoint(itr4->x - myROI.x, itr4->y - myROI.y), CV_RGB(0,255,0), 2);
				++itr4;
			}


		}

		FILE* fi;
	#ifdef __UNDIST_PROC__
		if ( src->undistAv == false ) {
	#endif
	#ifdef __DIST_PROC__
		 fi = fopen("chords.txt", "a+");
	#endif
	#ifdef __UNDIST_PROC__
		} else { 
			fi = fopen("undchords.txt", "a+");
		}
	#endif

		CvPoint A1, A2, B1, B2, Ah, Bh; 

		int p1 = (src->edgeA.size()*O_o > H_T_PIX) ? src->edgeA.size()*O_o : H_T_PIX;
		int p2 = (src->edgeA.size()*(1-O_o) < (src->edgeA.size() - H_T_PIX)) ? src->edgeA.size()*(1-O_o) : (src->edgeA.size() - H_T_PIX);

			A1 = cvPoint(src->edgeA[p1].x, src->edgeA[p1].y);
			A2 = cvPoint(src->edgeA[p2].x, src->edgeA[p2].y); 
			B1 = cvPoint(src->edgeB[p1].x, src->edgeB[p1].y);
			B2 = cvPoint(src->edgeB[p2].x, src->edgeB[p2].y);
		
		


		// Рисование хорд

		cvLine(visualImage, cvPoint(A1.x - myROI.x, A1.y - myROI.y) , cvPoint(A2.x - myROI.x, A2.y - myROI.y) , CV_RGB(255,0,0));
			cvLine(visualImage, cvPoint(A1.x - myROI.x, A1.y - myROI.y-3) , cvPoint(A1.x - myROI.x, A1.y - myROI.y+3) , CV_RGB(255,0,0));
			cvLine(visualImage, cvPoint(A2.x - myROI.x, A2.y - myROI.y-3) , cvPoint(A2.x - myROI.x, A2.y - myROI.y+3) , CV_RGB(255,0,0));
		
		cvLine(visualImage, cvPoint(B1.x - myROI.x, B1.y - myROI.y) , cvPoint(B2.x - myROI.x, B2.y - myROI.y) , CV_RGB(255,0,0));
			cvLine(visualImage, cvPoint(B1.x - myROI.x, B1.y - myROI.y-3) , cvPoint(B1.x - myROI.x, B1.y - myROI.y+3) , CV_RGB(255,0,0));
			cvLine(visualImage, cvPoint(B2.x - myROI.x, B2.y - myROI.y-3) , cvPoint(B2.x - myROI.x, B2.y - myROI.y+3) , CV_RGB(255,0,0));
			/*
		cvCircle(visualImage, cvPoint(src->posChordA.x - myROI.x, src->posChordA.y - myROI.y), 2, CV_RGB(255,0,0), 1);
		cvCircle(visualImage, cvPoint(src->posChordB.x - myROI.x, src->posChordB.y - myROI.y), 2, CV_RGB(255,0,0), 1);
		*/
		Ah = heightBase(A1, A2, src->posChordA);
		Bh = heightBase(B1, B2, src->posChordB);
		//cvDrawLine
		cvLine(visualImage, cvPoint(Ah.x - myROI.x, Ah.y - myROI.y), cvPoint(src->posChordA.x - myROI.x, src->posChordA.y - myROI.y), CV_RGB(0,0,0) );
		cvLine(visualImage, cvPoint(Bh.x - myROI.x, Bh.y - myROI.y), cvPoint(src->posChordB.x - myROI.x, src->posChordB.y - myROI.y), CV_RGB(0,0,0) );

		src->head_tail = findHeadTail(src);
		printf( "HT:\t%d\n", src->head_tail );

	//################################# AG code####################
    //chords in mm
		src->chordAmm = chordmm(src->edgeA, src->posChordA, src->cAnch);
		src->chordBmm = -chordmm(src->edgeB, src->posChordB, src->cAnch);
		printf("in mm:\tchords\t%3.2f\t%3.2f\tavg:\t%4.3f\tlen:\t%d\n", src->chordAmm, src->chordBmm, (src->chordAmm + src->chordBmm)/2, /*abs*/(pi2mm(src->edgeA.back(), src->cAnch ).x - pi2mm( src->edgeA.front(), src->cAnch ).x)) ;
		fprintf(fi,"in mm:\tchords\t%3.2f\t%3.2f\tavg:\t%4.3f\tlen:\t%d\tHT:%d\n", src->chordAmm, src->chordBmm, (src->chordAmm + src->chordBmm)/2, abs(pi2mm(src->edgeA.back(), src->cAnch ).x - pi2mm( src->edgeA.front(), src->cAnch ).x), src->head_tail) ;
    //################################# noneAG code####################


	//################################# AG code####################
    //chords in mm
		src->chordAmm = chordmm(src->edgeA, src->posChordA, src->cAnch);
		src->chordBmm = -chordmm(src->edgeB, src->posChordB, src->cAnch);
		printf("in mm:\tchords\t%3.2f\t%3.2f\tavg:\t%4.3f\tlen:\t%d\n", src->chordAmm, src->chordBmm, (src->chordAmm + src->chordBmm)/2, abs(pi2mm(src->edgeA.back(), src->cAnch ).x - pi2mm( src->edgeA.front(), src->cAnch ).x)) ;
       fprintf(fi,"in mm:\tchords\t%3.2f\t%3.2f\tavg:\t%4.3f\tlen:\t%d\n", src->chordAmm, src->chordBmm, (src->chordAmm + src->chordBmm)/2, abs(pi2mm(src->edgeA.back(), src->cAnch ).x - pi2mm( src->edgeA.front(), src->cAnch ).x)) ;
    //################################# noneAG code####################


		//printf("chords %3.2f:%3.2f; avg: %4.3f; len: %d \n", src->chordA, src->chordB, (src->chordA + src->chordB)/2, abs(src->edgeA.back().x - src->edgeA.front().x) );

	#ifdef __DEBUG_CHORDS__
		fprintf(fi,"in pi:\tchords\t%3.2f\t%3.2f\tavg:\t%4.3f\tlen:\t%d\n", src->chordA, src->chordB, (src->chordA + src->chordB)/2, abs(src->edgeA.back().x - src->edgeA.front().x)) ; 
		printf("in pi:\tchords\t%3.2f\t%3.2f\tavg:\t%4.3f\tlen:\t%d\n", src->chordA, src->chordB, (src->chordA + src->chordB)/2, abs(src->edgeA.back().x - src->edgeA.front().x)) ; 
	#endif
		
		fclose(fi);
		//////////////////////////////////////

	#ifdef __UNDIST_PROC__
		if ( src->undistAv == false ) {
	#endif
	#ifdef __DIST_PROC__
			cvShowImage("visual", visualImage);
	//	cvShowImage("visual", auxiliaryImage);
	#endif
	#ifdef __UNDIST_PROC__
		} else { 
			cvShowImage("undVisual", visualImage);
		}
	#endif
			
	// removing binaryImage from memory
	cvReleaseImage(&auxiliaryImage);
	cvReleaseImage(&visualImage);

	return 0;
}