vector<VisionRecognitionResult> KITECH_HSVColorRecognitionComp::Recognize(vector<unsigned char> image,int width,int height,int pixelBytes)
{
	//PrintMessage("SUCCESS:KITECH_HSVColorRecognitionComp::Recognize()");

	vector<VisionRecognitionResult> _recognitionResult(0);
	VisionRecognitionResult tmpResult;
	
	IplImage *cvImage = cvCreateImageHeader( cvSize(width, height), 8, pixelBytes );
	cvImage->imageData = (char *)&image[0];

	IplImage *hsvImage = cvCreateImage( cvGetSize(cvImage), 8, pixelBytes );
	cvCvtColor(cvImage, hsvImage, CV_BGR2HSV);

	IplImage *cvMask= cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 );

	for( unsigned int p = 0  ;  p < _colorRange.size()  ;  p++ ) {

		cvInRangeS( hsvImage,
				cvScalar(_colorRange[p].min1,_colorRange[p].min2,_colorRange[p].min3,0),
				cvScalar(_colorRange[p].max1,_colorRange[p].max2,_colorRange[p].max3,255),
				cvMask );

		CBlobLabeling blob;
		blob.SetParam( cvMask, width*height/1000 );
		blob.DoLabeling();

//		_recognitionResult.resize(blob.m_nBlobs);
		for( int i = 0  ;  i < blob.m_nBlobs  ;  i++ ) {
			tmpResult.name = _colorRange[p].name;

			tmpResult.point1X = blob.m_recBlobs[i].x;
			tmpResult.point1Y = blob.m_recBlobs[i].y;
			tmpResult.point2X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width;
			tmpResult.point2Y = blob.m_recBlobs[i].y;
			tmpResult.point3X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width;
			tmpResult.point3Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height;
			tmpResult.point4X = blob.m_recBlobs[i].x;
			tmpResult.point4Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height;
			_recognitionResult.push_back(tmpResult);
			//PrintMessage("SUCCESS:KITECH_HSVColorRecognitionComp::Recognize() -> I found %d data.(%d=%s)\n", blob.m_nBlobs, i, tmpResult.name.c_str());
		}
	}

	//cvSaveImage("KITECH_HSVColorRecognitionComp.jpg", cvImage);

	cvReleaseImage(&cvMask);
	cvReleaseImage(&hsvImage);
	cvReleaseImageHeader(&cvImage);

	return _recognitionResult;
}
vector<VisionRecognitionResult> KitechSkinColorFaceRecognitionComp::Recognize(vector<unsigned char> image,int width,int height,int pixelBytes)
{
	vector<VisionRecognitionResult> _recognitionResult(0);

	IplImage *cvImage = cvCreateImageHeader( cvSize(width, height), 8, pixelBytes );
	cvImage->imageData = (char *)&(image)[0];

	IplImage *ycrcbImage = cvCreateImage( cvGetSize(cvImage), 8, pixelBytes );
	cvCvtColor(cvImage, ycrcbImage, CV_BGR2YCrCb);

	IplImage *cvMask= cvCreateImage( cvSize(width, height), IPL_DEPTH_8U, 1 );

	cvInRangeS( ycrcbImage, cvScalar(0,133,77), cvScalar(255,173,127), cvMask );

	CBlobLabeling blob;
	blob.SetParam( cvMask, width*height/100 );
	blob.DoLabeling();

	_recognitionResult.resize(blob.m_nBlobs);
	for( int i = 0  ;  i < blob.m_nBlobs  ;  i++ ) {
		_recognitionResult[i].name = "Face";

		_recognitionResult[i].point1X = blob.m_recBlobs[i].x;
		_recognitionResult[i].point1Y = blob.m_recBlobs[i].y;
		_recognitionResult[i].point2X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width;
		_recognitionResult[i].point2Y = blob.m_recBlobs[i].y;
		_recognitionResult[i].point3X = blob.m_recBlobs[i].x + blob.m_recBlobs[i].width;
		_recognitionResult[i].point3Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height;
		_recognitionResult[i].point4X = blob.m_recBlobs[i].x;
		_recognitionResult[i].point4Y = blob.m_recBlobs[i].y + blob.m_recBlobs[i].height;
		//PrintMessage("SUCCESS:KitechSkinColorFaceRecognitionComp::recognize() -> I found %d data.(%d=%s)\n", blob.m_nBlobs, i, _recognitionResult[i].name.c_str());
	}

	//cvSaveImage("KitechSkinColorFaceRecognitionComp.jpg", cvImage);

	cvReleaseImage(&cvMask);
	cvReleaseImage(&ycrcbImage);
	cvReleaseImageHeader(&cvImage);

	return _recognitionResult;
}
void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{
    try
    {
        cv::Mat img21 = cv_bridge::toCvShare(msg, "bgr8")->image;
        //cv::imshow("view",img21 );

        frame_color_ycrcb = cv::Mat::zeros(480, 640 ,CV_8UC3);
        ///////

    //Get the corners from the object

         Capframe_one =img21;


         imshow("dsd",Capframe_one);
      //  if(Capframe_one.empty()) break;

       //	Capframe_one=imread("RR.jpg");




            frame_color_ycrcb=Capframe_one;
                frame_color_ycrcb_vel=frame_color_ycrcb.clone();
            frame_color_ycrcb.copyTo(frame_color_ycrcb_tri);
            //YCrCbÀ̹ÌÁö·Î º¯°æ

            Mat YCrCb, mask(frame_color_ycrcb.size(), CV_8U, Scalar(0));

            cvtColor(frame_color_ycrcb, YCrCb, CV_BGR2YCrCb);



            //YCrCb À̹ÌÁöžŠ °¢ À³Îº°·Î ºÐž®

            vector<Mat> planes;

            split(YCrCb, planes);

            int nr=frame_color_ycrcb.rows;

            int nc=frame_color_ycrcb.cols;



            // 170 < Cr <230, 70 <Cb < 130ÀÎ ¿µ¿ªžž 255·Î Ç¥œÃÇØŒ­ mask žžµé±â

            for(int i=0; i<nr; i++){

                uchar* Cr=planes[1].ptr<uchar>(i);

                uchar* Cb=planes[2].ptr<uchar>(i);

                for(int j=0; j<nc;j++){
                   //if((140<Cr[j] && Cr[j] <240) && (50<Cb[j] && Cb[j]<150) )

                   // if((170<Cr[j] && Cr[j] <250) && (70<Cb[j] && Cb[j]<180) )

                    if((130<Cr[j] && Cr[j] <220) && (40<Cb[j] && Cb[j]<140) )

                        mask.at<uchar>(i, j)=255;

                }

            }

            GaussianBlur(mask, mask, Size(3, 3), 2, 2);

           imshow("MASK", mask);


         img_gray=mask;


        drawStuff();


            vector<Vec3f> circles;

            std::vector<cv::Vec3f> circles2;
            Mat abcd;

                    cvtColor(frame_color_ycrcb_vel, abcd, CV_BGR2GRAY);
     //       HoughCircles(mask, circles, CV_HOUGH_GRADIENT, 2, 1000,20,95,2,50);
     HoughCircles(abcd, circles, CV_HOUGH_GRADIENT, 2,frame_color_ycrcb_vel.rows/4,200,100,2,50);



            std::vector<cv::Vec3f>::iterator itc_R = circles.begin();
            double count_circle=0;
            while (itc_R != circles.end()) {
                count_circle++;
              //  std::cout << count_circle << std::endl;



             ++itc_R;

            }






            for(int i=0; i<circles.size(); i++)
            {

                Point center((circles[i][0]), (circles[i][1]));
                int radius=(circles[i][2]);

                double b=-70;
                Rect ROI_Rect((double)circles[i][0] - (double)circles[i][2]-b/(double)circles[i][2], (double)circles[i][1] - (double)circles[i][2]-b/(double)circles[i][2], (double)circles[i][2] * 2+b*2/(double)circles[i][2], (double)circles[i][2] * 2+b*2/(double)circles[i][2]);

            //	std::cout << "rect_draw" << std::endl;


           // printf("one dectect");
               // circle(frame_color_ycrcb, center, radius, Scalar(0,255,0), 1);




                if( ((circles[i][0] - circles[i][2]-100)>=0 )&&
                    ((circles[i][0] + circles[i][2]+100)<=640)&&
                    ((circles[i][1] + circles[i][2]+100)<=480)&&
                    ((circles[i][1] - circles[i][2]-100)>=0))

                {
                Mat Temp_ROI,circle_ROI,Temp_ROI_vel;



                frame_color_ycrcb_vel(ROI_Rect).copyTo(Temp_ROI_vel);
                cvtColor(Temp_ROI_vel,Temp_ROI_vel,CV_YCrCb2BGR);

                Mat Temp_vel_gray;

                Mat Temp_vel_gray_ROI;


                double c=12;
                double d=1.35;
                    if(((double)circles[i][2])>=35.0){
                    d=1;
                    }

                    if(((double)circles[i][2])<=21.0&&((double)circles[i][2])>=17.0){
                    d=1;
                    }

                Rect ROI_Rect_vel(((double)(circles[i][0])-((double)(circles[i][2]))),
                                  ((double)(circles[i][1])-((double)(circles[i][2]))),
                                  (double)(circles[i][2])*2,
                                  ((double)(circles[i][2]))*2);


        vector<Rect> Rect_Vector;


                if((0<=((double)(circles[i][0])-((double)(circles[i][2])/1.414213)+((double)(circles[i][2])/1.414213)*2)<=640 )&&
                   (0<=((double)(circles[i][0])-((double)(circles[i][2])/1.414213)+((double)(circles[i][2])/1.414213)*2)>=0 )&&
                   ((((double)(circles[i][1])-((double)(circles[i][2])/1.414213))+((double)(circles[i][2])/1.414213)*2)<=480)&&
                   ((((double)(circles[i][1])-((double)(circles[i][2])/1.414213))+((double)(circles[i][2])/1.414213)*2)>=0))

                {

                    Mat vel_ocr;

                     Temp_vel_gray_ROI=frame_color_ycrcb_vel.clone();
                     Mat 	Temp_vel_gray_ROI_2;
                int x, y, x2, y2;
                if (radius > 25){
                    x = cvRound(circles[i][0]) - (radius*0.8); // ¹ÝÁöž§ÀÌ 25ºžŽÙ Å«°æ¿ì
                    y = cvRound(circles[i][1]) - (radius*0.6);
                    if (x > 0 && y > 0){
                        Temp_vel_gray_ROI_2 = Temp_vel_gray_ROI(Rect(x, y, 1.6 * radius, 1.2*radius));
                        imshow("ROI", Temp_vel_gray_ROI_2);

                    }
                }
                else{
                    x = cvRound(circles[i][0]) - (radius*0.8); // ¹ÝÁöž§ÀÌ 25ºžŽÙ Å«°æ¿ì
                    y = cvRound(circles[i][1]) - (radius*0.6);
                    if (x > 0 && y > 0){
                        Temp_vel_gray_ROI_2= Temp_vel_gray_ROI(Rect(x, y, 1.8 * radius, 1.4*radius));
                        imshow("ROI", Temp_vel_gray_ROI_2);
                    }
                }



                if (x > 0 && y > 0){
                    if (2 * radius < 80){
            CBlobLabeling blob;
            //cvtColor(Temp_vel_gray_ROI,Temp_vel_gray_ROI,CV_BGR2GRAY);

            IplImage *out = new IplImage(Temp_vel_gray_ROI_2);
            IplImage * gray=cvCreateImage(cvSize(out->width,out->height),8,1);

            cvCvtColor(out,gray,CV_BGR2GRAY);
            cvThreshold(gray,gray,126,255,CV_THRESH_BINARY_INV);
            //cvThreshold(gray,gray,126,255,CV_THRESH_BINARY|CV_THRESH_OTSU);

            IplImage * labeled=cvCreateImage(cvSize(out->width,out->height),8,3);
            cvCvtColor(gray,labeled,CV_GRAY2BGR);


            blob.SetParam(gray, 25);
            blob.DoLabeling();

                        int x_min = 100;
                        int x_max = 0;
                        int y_min = 100;
                        int y_max = 0;

                    printf("라벨링 개수: %d\n", blob.m_nBlobs);

                    for (int i = 0; i < blob.m_nBlobs; i++)
                    {


                        CvPoint pt1 = cvPoint(blob.m_recBlobs[i].x, blob.m_recBlobs[i].y);
                        CvPoint pt2 = cvPoint(pt1.x + blob.m_recBlobs[i].width, pt1.y + blob.m_recBlobs[i].height);
                            if (x_max < pt2.x) x_max = pt2.x;
                            if (x_min > pt1.x) x_min = pt1.x;
                            if (y_max < pt2.y) y_max = pt2.y;
                            if (y_min > pt1.y) y_min = pt1.y;

                    }
                //	printf("%d : %d %d %d %d\n", blob.m_nBlobs, x_max, x_min, y_max, y_min);
                        // °¢ ·¹À̺í Ç¥œÃ


                        CvPoint pt1 = cvPoint(x_min, y_min);
                        CvPoint pt2 = cvPoint(x_min + (x_max - x_min), y_min + (y_max - y_min));

                        CvScalar color = cvScalar(0, 0, 255);
                        //cvDrawRect(labeled, pt1, pt2, color);
                  Rect rect1(1+pt1.x, 1+pt1.y, pt2.x-1, pt2.y-1);
                   if(     rect1.width >= 0 && rect1.height >= 0 && rect1.x < labeled->width && rect1.y < labeled->height && rect1.x + rect1.width >= (int)(rect1.width > 0) && rect1.y + rect1.height >= (int)(rect1.height > 0)){
                        cvSetImageROI(labeled, rect1);


                        //printf("%d \n", blob.m_nBlobs);
                        Mat labeling(labeled);
                        cvtColor(labeling, labeling, CV_RGB2GRAY);
                        threshold(labeling, labeling, 100, 255, 0);
                        countnum(labeling);
                        //imshow("temp_vel_gray_ROI",Temp_vel_gray_ROI);
                        imshow("labeling", labeling);
                        //waitKey(0);

                        cvReleaseImage(&labeled);
}



                }

}
                }


         }


       }

            imshow("IMAGE", frame_color_ycrcb);




        //////










    }
    catch (cv_bridge::Exception& e)
    {
        ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
    }
}
Exemple #4
0
void main()
{
	CvCapture *capture;
	IplImage * Image;
	UDPClient *client = new UDPClient(addr, port);
	int Dang = 0;
	capture = cvCaptureFromFile("[mix]test.mp4");  
	IplImage * median;
	IplImage * gray;
	IplImage * sendimage;
	IplImage * faceimage;
	IplImage * fa_gr_image;
	IplImage * mosaimage;
	IplImage * mosaimage1;
	IplImage *canny;
	IplImage * out1;

	IplImage *send3image;

	double a, b, x0, y0,busx=0.0,bus=0.0,k1,k2,angle1,temp;
	float *line, rho, theta;
	CvMemStorage *storage;
	CvSeq *lines = 0;
	CvPoint *point, pt1, pt2;

	while(1)  
	{
		bool movecheck = false;

		char endkey;
		Image=cvQueryFrame(capture); 
		if(!Image)
			break;
		send3image = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3);
		mosaimage = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3);
		mosaimage1 = cvCreateImage(cvSize(1,1), IPL_DEPTH_8U, 3);
		faceimage = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3);
		fa_gr_image = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1);
		gray = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1);  
		sendimage = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1);
		canny = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 1);
		IplImage *realhough = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3);
		IplImage *probhough = cvCreateImage(cvGetSize(Image), IPL_DEPTH_8U, 3);


		cvCvtColor(Image, sendimage, CV_RGB2GRAY);
		cvCvtColor(Image, gray, CV_RGB2GRAY);

		cvCopy(Image,faceimage);
		cvCopy(Image,mosaimage);
		cvCopy(Image,send3image);

		
		gaussian(gray);  //open SW



		cvSmooth(gmmframe,gmmframe,CV_MEDIAN,5);
		cvMorphologyEx(gmmframe,gmmframe,0,0,CV_MOP_CLOSE,2);

		detectskin(faceimage);	//open SW






		cvCanny(gray, canny,60,70,3);


		storage = cvCreateMemStorage (0); 

		lines = cvHoughLines2 (canny, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 80, 0,0);

		for(int i = 0; i< MIN(lines->total, 100); i++)
		{
			line =(float*) cvGetSeqElem(lines, i);
			rho = line[0];
			theta = line[1];
			a = cos (theta);
			b = sin (theta);
			x0 = a*rho;
			y0 = b*rho;
			pt1.x =cvRound(x0 + 500 * (-b));
			pt1.y =cvRound(y0 + 500 * (a));
			pt2.x =cvRound(x0 - 500 * (-b));
			pt2.y =cvRound(y0 - 500 * (a));
			k1=(pt1.x-pt2.x);
			k2=pt1.y-pt2.y;

			angle1=k1/k2;
			if(0.08>angle1)
			{
				if(pt1.x>170 &&pt1.x<gmmframe->width)
				{
					cvLine (realhough, pt1,pt2,CV_RGB(255, 0,0), 1, 8,0);
					temp=pt1.x;
				}
			}
		}

		for(int i=0; i<gmmframe->height; i++)
		{
			for(int j = 0; j<gmmframe->width; j++)
			{
				if(j>temp)
					gmmframe->imageData[j+gmmframe->widthStep*i]=0;
			}
		}




		if(frameCnt>25)
		{

			CBlobLabeling blob;   //open SW(labeling)
			blob.SetParam(gmmframe, 100 );   
			blob.DoLabeling();   
			if(blob.m_nBlobs>0)
			{
				printf("%d", blob.m_nBlobs);
				printf("명이 있습니다 \n");
			}
			int face_size = blob.m_nBlobs;
			int face_x1[100],face_x2[100];
			int face_y1[100],face_y2[100];

			for(int i=0; i< blob.m_nBlobs; i++)   
			{
				cvDrawRect(Image,cvPoint(blob.m_recBlobs[i].x,blob.m_recBlobs[i].y), 
					cvPoint(blob.m_recBlobs[i].x+blob.m_recBlobs[i].width, blob.m_recBlobs[i].y+blob.m_recBlobs[i].height),
					CV_RGB(255,0,0),2); 
				if((blob.m_recBlobs[i].width>=(double)Image->width/3)&&(blob.m_recBlobs[i].height>=(double)Image->height*0.75))
					movecheck = true;
				face_x1[i] = blob.m_recBlobs[i].x;
				face_x2[i] = blob.m_recBlobs[i].x+blob.m_recBlobs[i].width;
				face_y1[i] = blob.m_recBlobs[i].y;
				face_y2[i] = blob.m_recBlobs[i].y+blob.m_recBlobs[i].height/3;
			}
			if(movecheck == true)
				continue;
			else{

			int mosa_cnt = 0;
			double mosa_var_r = 0;
			double mosa_var_g = 0;
			double mosa_var_b = 0;

			for(int i=0; i<faceimage->height; i++){
				for(int j=0; j<faceimage->width; j++){
					bool face_t = false;
					if(faceimage->imageData[(i*faceimage->widthStep)+j*3+0]!=0 
						|| faceimage->imageData[(i*faceimage->widthStep)+j*3+1]!=0 
						|| faceimage->imageData[(i*faceimage->widthStep)+j*3+2]!=0){
							for(int t=0; t<blob.m_nBlobs; t++){
								if(j>=face_x1[t] && j<=face_x2[t] && i>=face_y1[t] && i<=face_y2[t]){
									face_t = true;
								}
							}
					}


					if(face_t == false){
						faceimage->imageData[(i*faceimage->widthStep)+j*3+2] = 0;
						faceimage->imageData[(i*faceimage->widthStep)+j*3+1] = 0;
						faceimage->imageData[(i*faceimage->widthStep)+j*3+0] = 0;
					}

				}
			}

			cvCvtColor(faceimage, fa_gr_image, CV_RGB2GRAY);

			CBlobLabeling blob1;   
			blob1.SetParam(fa_gr_image, 3);   
			blob1.DoLabeling();

			for(int i=0; i<mosaimage->height; i++){
				for(int j=0; j<mosaimage->width; j++){
					for(int t=0; t<blob1.m_nBlobs; t++){
						int mosa_wid = blob1.m_recBlobs[t].width*0.5;
						int mosa_hei = blob1.m_recBlobs[t].height*0.5;
						if(j>blob1.m_recBlobs[t].x-mosa_wid && j<(blob1.m_recBlobs[t].width+blob1.m_recBlobs[t].x)+mosa_wid
							&& i>blob1.m_recBlobs[t].y -mosa_hei && i<(blob1.m_recBlobs[t].height+blob1.m_recBlobs[t].y)+mosa_hei){
								mosa_var_b += (unsigned char)mosaimage->imageData[(i*mosaimage->widthStep)+j*3+0];
								mosa_var_g += (unsigned char)mosaimage->imageData[(i*mosaimage->widthStep)+j*3+1];
								mosa_var_r += (unsigned char)mosaimage->imageData[(i*mosaimage->widthStep)+j*3+2];
								mosa_cnt++;
						}
					}
				}
			}

			mosa_var_b /= mosa_cnt;
			mosa_var_g /= mosa_cnt;
			mosa_var_r /= mosa_cnt;

			for(int i=0; i<faceimage->height; i++){
				for(int j=0; j<faceimage->width; j++){
					for(int t=0; t<blob1.m_nBlobs; t++){
						int mosa_wid = blob1.m_recBlobs[t].width*0.5;
						int mosa_hei = blob1.m_recBlobs[t].height*0.5;
						if(j>blob1.m_recBlobs[t].x-mosa_wid && j<(blob1.m_recBlobs[t].width+blob1.m_recBlobs[t].x)+mosa_wid
							&& i>blob1.m_recBlobs[t].y -mosa_hei && i<(blob1.m_recBlobs[t].height+blob1.m_recBlobs[t].y)+mosa_hei){
								mosaimage->imageData[(i*mosaimage->widthStep)+j*3+2] = (unsigned char)(int)mosa_var_r;
								mosaimage->imageData[(i*mosaimage->widthStep)+j*3+1] = (unsigned char)(int)mosa_var_g;
								mosaimage->imageData[(i*mosaimage->widthStep)+j*3+0] = (unsigned char)(int)mosa_var_b;
						}
					}
				}
			}

			for(int i=0; i<send3image->height; i++){
				for(int j=0; j<send3image->width; j++){
					if(send3image->imageData[j*3+0+i*send3image->widthStep]==0)
						send3image->imageData[j*3+0+i*send3image->widthStep]+=1;
					if(send3image->imageData[j*3+1+i*send3image->widthStep]==0)
						send3image->imageData[j*3+1+i*send3image->widthStep]+=1;
					if(send3image->imageData[j*3+2+i*send3image->widthStep]==0)
						send3image->imageData[j*3+2+i*send3image->widthStep]+=1;
				}
			}

			char *buff = new char[30000];

			int snsz = 30000;

			int x = strlen(send3image->imageData)/snsz+2;
			int y = strlen(send3image->imageData)%snsz;
			char end[10] = "end";
			int cnt1 = 0;

			for(int i = 0; i<x; i++)
			{
				int snsz1;
				if(i < x-2)
					snsz1 = snsz;
				else
					snsz1 = y;

				if(i == x-1)
					strcpy(buff,end);
				else
					strncpy(buff,send3image->imageData+(i*snsz),snsz1);

				int result = client->sendData((char*)(&buff[0]), strlen(buff));
				cnt1++;
				if(result < 0)
					cout<<"전송 실패"<<endl;
			}

			for(int i=0; i<mosaimage->height; i++){
				for(int j=0; j<mosaimage->width; j++){
					if(mosaimage->imageData[j*3+0+i*mosaimage->widthStep]==0)
						mosaimage->imageData[j*3+0+i*mosaimage->widthStep]+=1;
					if(mosaimage->imageData[j*3+1+i*mosaimage->widthStep]==0)
						mosaimage->imageData[j*3+1+i*mosaimage->widthStep]+=1;
					if(mosaimage->imageData[j*3+2+i*mosaimage->widthStep]==0)
						mosaimage->imageData[j*3+2+i*mosaimage->widthStep]+=1;
				}
			}

			x = strlen(mosaimage->imageData)/snsz+2;
			y = strlen(mosaimage->imageData)%snsz;

			cnt1 = 0;

			for(int i = 0; i<x; i++)
			{
				int snsz1;
				if(i < x-2)
					snsz1 = snsz;
				else
					snsz1 = y;

				if(i == x-1)
					strcpy(buff,end);
				else
					strncpy(buff,mosaimage->imageData+(i*snsz),snsz1);

				int result = client->sendData((char*)(&buff[0]), strlen(buff));
				cnt1++;
				if(result < 0)
					cout<<"전송 실패"<<endl;

			}

			if(blob.m_nBlobs == 0 )
			{
				PlaySound(0,0,0);
				Dang = 0;
			}

			else if(blob.m_nBlobs!=0 && Dang == 0)
			{
				PlaySound("wav.wav",NULL,SND_ASYNC | SND_LOOP);
				Dang = 1;
			}
			}

			cvShowImage("Image",Image);  
			cvShowImage("back",gmmframe);
			cvShowImage("face",faceimage);
			cvShowImage("mosaic",mosaimage);
			cvShowImage("Canny", canny );
			cvShowImage("Real Hough Transform", realhough);

		}

		cvReleaseImage(&gmmframe);
		cvReleaseImage(&faceimage);
		cvReleaseImage(&mosaimage);
		cvReleaseImage(&canny);
		cvReleaseImage(&realhough);
		cvReleaseImage(&send3image);
		cvReleaseImage(&fa_gr_image);

		endkey = cvWaitKey(1);
		if(endkey ==27)
			break;

	}
		
}
JNIEXPORT jstring JNICALL Java_kr_ac_ajou_ddozzip_calmera_OpencvActivity_FindFeatures(JNIEnv* env, jobject obj, jlong addrGray, jlong addrRgba)
{
	int g_switch_value = 0;
	jstring outFormula;

    Mat* pMatRgb=(Mat*)addrRgba;
    Mat* pMatGr=(Mat*)addrGray;



    Mat MatRgb = *pMatRgb;
    Mat MatGr = *pMatGr;


    IplImage rgbImg = MatRgb;
    IplImage grayImg = MatGr;
    IplImage* pGrayImg = &grayImg;
    IplImage* pRgbImg = &rgbImg;

    IplImage labeledImg;
    Mat* pMatLabeled;
    Mat MatLabeled;
    vector<KeyPoint> v;

	string formula;
	string strTemp = "";

    //binary Process 반전
    cvtColor(*pMatRgb, *pMatGr, CV_BGR2GRAY);
    threshold( *pMatGr, *pMatGr, 127.0, 255.0, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);

    //IplImage로 변환
    MatGr = *pMatGr;
    grayImg = Mat(MatGr);
    pGrayImg = &grayImg;

    IplImage* pLabeledImg = cvCreateImage(cvSize(pGrayImg->width, pGrayImg->height), 8, 3);
    IplImage* pGrayImg_inv = cvCreateImage(cvSize(pGrayImg->width, pGrayImg->height), 8, pGrayImg->nChannels);


    IplConvKernel *element1;
    element1 = cvCreateStructuringElementEx (3, 3, 2, 2, CV_SHAPE_RECT, NULL);
    IplConvKernel *element2;
    element2 = cvCreateStructuringElementEx (3, 3, 2, 2, CV_SHAPE_RECT, NULL); // 필터의 크기를 5x5로 설정

    cvDilate( pGrayImg, pGrayImg, element1, 1); // 팽창

    //스무스
    cvSmooth(pGrayImg,pGrayImg, CV_MEDIAN, 3);
    cvThreshold( pGrayImg, pGrayImg, 127.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);

    cvErode(pGrayImg, pGrayImg, element2, 1);  // 침식



//    cvSmooth(pGrayImg,pGrayImg, CV_GAUSSIAN, 3);
//    cvThreshold( pGrayImg, pGrayImg, 127.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);

    //반전에 반전 (원본)
    cvNot(pGrayImg,pGrayImg_inv);
    cvCvtColor( pGrayImg_inv, pLabeledImg, CV_GRAY2RGB);

    CBlobLabeling blob;
    blob.SetParam( pGrayImg, 20 );

    blob.DoLabeling();

	CvScalar color = cvScalar(255, 0, 0);

	if((tImage[0][0] = cvLoadImage("ocr_templete/0_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[0][1] = cvLoadImage("ocr_templete/0_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[1][0] = cvLoadImage("ocr_templete/1_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[1][1] = cvLoadImage("ocr_templete/1_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[2][0] = cvLoadImage("ocr_templete/2_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[2][1] = cvLoadImage("ocr_templete/2_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[3][0] = cvLoadImage("ocr_templete/3_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[3][1] = cvLoadImage("ocr_templete/3_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[4][0] = cvLoadImage("ocr_templete/4_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[4][1] = cvLoadImage("ocr_templete/4_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[5][0] = cvLoadImage("ocr_templete/5_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[5][1] = cvLoadImage("ocr_templete/5_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[6][0] = cvLoadImage("ocr_templete/6_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[6][1] = cvLoadImage("ocr_templete/6_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[7][0] = cvLoadImage("ocr_templete/7_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[7][1] = cvLoadImage("ocr_templete/7_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[8][0] = cvLoadImage("ocr_templete/8_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[8][1] = cvLoadImage("ocr_templete/8_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[9][0] = cvLoadImage("ocr_templete/9_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[9][1] = cvLoadImage("ocr_templete/9_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[10][0] = cvLoadImage("ocr_templete/plus_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[10][1] = cvLoadImage("ocr_templete/plus_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[11][0] = cvLoadImage("ocr_templete/minus_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;
//	if((tImage[11][1] = cvLoadImage("ocr_templete/minus_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL) ;

	if((tImage[12][0] = cvLoadImage("ocr_templete/divide_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[12][1] = cvLoadImage("ocr_templete/divide_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[13][0] = cvLoadImage("ocr_templete/pi_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
	if((tImage[13][1] = cvLoadImage("ocr_templete/pi_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[14][0] = cvLoadImage("ocr_templete/bracket_l_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[14][1] = cvLoadImage("ocr_templete/bracket_l_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[15][0] = cvLoadImage("ocr_templete/bracket_r_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[15][1] = cvLoadImage("ocr_templete/bracket_r_2.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[16][0] = cvLoadImage("ocr_templete/A.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[16][1] = cvLoadImage("ocr_templete/A.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[17][0] = cvLoadImage("ocr_templete/L.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[17][1] = cvLoadImage("ocr_templete/L.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[18][0] = cvLoadImage("ocr_templete/t_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[18][1] = cvLoadImage("ocr_templete/t.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[19][0] = cvLoadImage("ocr_templete/i_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[19][1] = cvLoadImage("ocr_templete/I.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[20][0] = cvLoadImage("ocr_templete/c_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[20][1] = cvLoadImage("ocr_templete/C.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[21][0] = cvLoadImage("ocr_templete/s_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[21][1] = cvLoadImage("ocr_templete/S.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[22][0] = cvLoadImage("ocr_templete/o_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[22][1] = cvLoadImage("ocr_templete/O.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[23][0] = cvLoadImage("ocr_templete/dot.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);
//	if((tImage[23][1] = cvLoadImage("ocr_templete/dot.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[24][0] = cvLoadImage("ocr_templete/m_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[25][0] = cvLoadImage("ocr_templete/n_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[26][0] = cvLoadImage("ocr_templete/d_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[27][0] = cvLoadImage("ocr_templete/e_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[28][0] = cvLoadImage("ocr_templete/f_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[29][0] = cvLoadImage("ocr_templete/dx_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[30][0] = cvLoadImage("ocr_templete/diff_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[31][0] = cvLoadImage("ocr_templete/Large_c_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[32][0] = cvLoadImage("ocr_templete/arrow_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[33][0] = cvLoadImage("ocr_templete/y_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[34][0] = cvLoadImage("ocr_templete/x_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[35][0] = cvLoadImage("ocr_templete/a_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[36][0] = cvLoadImage("ocr_templete/integral_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[37][0] = cvLoadImage("ocr_templete/sigma_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);

	if((tImage[37][0] = cvLoadImage("ocr_templete/root_1.jpg" , CV_LOAD_IMAGE_GRAYSCALE )) == NULL);


	for(int i = 0; i < TEMPLATE_NUM; i++)  {
		for(int j = 0; j < TEMPLATE_FONT; j++){
			if(tImage[i][j] != NULL){
				cvThreshold(tImage[i][j], tImage[i][j], 127.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);
			}
		}
	}

    for(int i = 0; i < blob.m_nBlobs; i++)
    {
    	CvPoint pt1 = cvPoint(blob.m_recBlobs[i].x-5, blob.m_recBlobs[i].y-5);
    	CvPoint pt2 = cvPoint(pt1.x + blob.m_recBlobs[i].width + 10, pt1.y + blob.m_recBlobs[i].height + 10);

    	if((blob.m_recBlobs[i].x-5<= 0)||(blob.m_recBlobs[i].y-5<= 0)){
    		//size error
    	} else{

			//각 레이블 표시

			// 이미지 매칭
			IplImage* pLabeledImg_obj = cvCreateImage(cvSize(pt2.x-pt1.x, pt2.y-pt1.y), 8, pGrayImg_inv->nChannels);
			int nMatchValue;
			double error;

			/*
			__android_log_print(ANDROID_LOG_INFO,"pLabeledImg_obj->height:", pLabeledImg_obj->height);
			__android_log_print(ANDROID_LOG_INFO,"pLabeledImg_obj->width:", pLabeledImg_obj->width);

			__android_log_print(ANDROID_LOG_INFO,"pt1.x:", pt1.x);
			__android_log_print(ANDROID_LOG_INFO,"pt1.y:", pt1.y);
			__android_log_print(ANDROID_LOG_INFO,"pt2.x:", pt2.x);
			__android_log_print(ANDROID_LOG_INFO,"pt2.y:", pt2.y);


			__android_log_print(ANDROID_LOG_INFO,"jni","pGrayImg_inv->nChannels:" + 123);
			__android_log_print(ANDROID_LOG_INFO,"jni","pGrayImg_inv->nChannels:" + 1232);
	*/

			cvSetImageROI(pGrayImg_inv,cvRect(pt1.x,pt1.y,pt2.x-pt1.x,pt2.y-pt1.y));

			cvCopy(pGrayImg_inv, pLabeledImg_obj);
			cvResetImageROI(pGrayImg_inv);
/*
			string makeTamplate = "/sdcard/calmera_template/";
			//makeTamplate += i;
			makeTamplate += i;
			makeTamplate += "_3.jpg";

			__android_log_print(ANDROID_LOG_INFO,"jni","saving...");
			cvSaveImage(makeTamplate.c_str(), pLabeledImg_obj);
			__android_log_print(ANDROID_LOG_INFO,"jni","saved!!!");
*/

		  	  //여기서 위치정보 판별
			objCenterPosition[i][0] = (pt2.x-pt1.x)/2 + pt1.x;
			objCenterPosition[i][1] = (pt2.y-pt1.y)/2 + pt1.y;
			nMatchValue = matching(pLabeledImg_obj, &error);

			cvDrawRect(pLabeledImg, pt1, pt2, color);

			CvFont point_font;
			cvInitFont(&point_font,CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 8);
			char text[20];
			char letter[5];

			if((objCenterPosition[0][1]-objCenterPosition[i][1])>40){ // 자승 처리
				formula += "^";
			}


			switch(nMatchValue){

			case 0:
					strcpy(letter, "0");
					formula +=  "0";
					break;
			case 1:
					strcpy(letter, "1");
					formula +=  "1";
					break;
			case 2:
					strcpy(letter, "2");
					formula +=  "2";
					break;
			case 3:
					strcpy(letter, "3");
					formula +=  "3";
					break;
			case 4:
					strcpy(letter, "4");
					formula +=  "4";
					break;
			case 5:
					strcpy(letter, "5");
					formula +=  "5";
					break;
			case 6:
					strcpy(letter, "6");
					formula +=  "6";
					break;
			case 7:
					strcpy(letter, "7");
					formula +=  "7";
					break;
			case 8:
					strcpy(letter, "8");
					formula +=  "8";
					break;
			case 9:
					strcpy(letter, "9");
					formula +=  "9";
					break;
			case 10:
					strcpy(letter, "+");
					formula +=  "+";
					break;
			case 11:
					strcpy(letter, "-");
					if(((objCenterPosition[i][0] - objCenterPosition[i-1][0])<5)&&((objCenterPosition[i][0] - objCenterPosition[i-1][0])>-5)){
						formula.erase(formula.length() -1 ,1 );
						formula +=  "=";
					}
					else
						formula +=  "-";
					break;
			case 12:
					strcpy(letter, "/");
					formula +=  "/";
					break;
			case 13:
					strcpy(letter, "pi");
					formula +=  "pi";
					break;
			case 14:
					strcpy(letter, "(");
					formula +=  "(";
					break;
			case 15:
					strcpy(letter, ")");
					formula +=  ")";
					break;

			case 16:
					strcpy(letter, "A");
					formula +=  "A";
					break;
			case 17:
					strcpy(letter, "L");
					formula +=  "L";
					break;
			case 18:
					strcpy(letter, "t");
					formula +=  "t";
					strTemp = formula.substr(formula.length()-1,formula.length());
					//if(strTemp == "d")
						//definedIntEndFlg = 1;
						definedIntVariable = "t";
					break;
			case 19:
					strcpy(letter, "I");
					formula +=  "I";
					break;
			case 20:
					strcpy(letter, "C");
					strTemp = formula.substr(formula.length()-2,formula.length());
					if((strTemp=="Se")||(strTemp=="SC")){
						formula.erase(formula.length() -2 ,2);
						formula +=  "sec";
					}
					else
					formula +=  "C";
					break;
			case 21:
					strcpy(letter, "S");
					strTemp = formula.substr(formula.length()-2,formula.length());
					if((strTemp=="CO")||(strTemp=="C0")||(strTemp=="cO")||(strTemp=="c0")){
						formula.erase(formula.length() -2 ,2);
						formula +=  "cos";
					}
					else
						formula +=  "S";
					break;
			case 22:
					strcpy(letter, "O");
					formula +=  "O";
					break;
			case 23:
					strcpy(letter, ".");

					if(((objCenterPosition[i][0] - objCenterPosition[i-1][0])<10)&&((objCenterPosition[i][0] - objCenterPosition[i-1][0])>-10)){
						formula.erase(formula.length() - 2, 2);
						formula +=  "i";
					}
					else
						formula +=  ".";

					if(formula.length()>=6){
						strTemp = formula.substr(formula.length()-6,formula.length());
						if(strTemp == ".^.^.^"){
							formula.erase(formula.length() -6 ,6);
							formula +=  "integral";
							objCenterPosition[0][0] = objCenterPosition[i-1][0];
						}

					}

					break;
			case 24:
					strcpy(letter, "m");
					formula +=  "m";
					break;
			case 25:
					strcpy(letter, "n");
					strTemp = formula.substr(formula.length()-2,formula.length());
					if((strTemp=="SI")||(strTemp=="Si")||(strTemp=="sI")||(strTemp=="si")||(strTemp=="S1")||(strTemp=="s1")){
						formula.erase(formula.length() -2 ,2);
						formula +=  "sin";
					}
					else
					formula +=  "n";
					break;
			case 26:
					strcpy(letter, "d");
					formula +=  "d";
					break;
			case 27:
					strcpy(letter, "e");
					formula +=  "e";
					break;
			case 28:
					strcpy(letter, "f");
					formula +=  "f";
					break;
			case 29:
					strcpy(letter, "dx");
					formula +=  "dx";
					//definedIntEndFlg = 1;
					break;
			case 30:
					strcpy(letter, "'");
					formula.erase(formula.length() -1 ,1 );
					formula +=  "'";
					break;
			case 31:
					strcpy(letter, "C");
					strTemp = formula.substr(formula.length()-1,formula.length());
					if((strTemp=="SC")||(strTemp=="Se")){
						formula.erase(formula.length() -2 ,2);
						formula +=  "sec";
					}
					else
						formula +=  "C";
					break;
			case 32:
					strcpy(letter, "->");
					formula +=  "->";
					break;
			case 33:
					strcpy(letter, "y");
					formula +=  "y";
					strTemp = formula.substr(formula.length()-1,formula.length());
					//if(strTemp == "d")
						//definedIntEndFlg = 1;
						definedIntVariable = "y";
					break;
			case 34:
					strcpy(letter, "x");
					formula +=  "x";
					strTemp = formula.substr(formula.length()-1,formula.length());
					//if(strTemp == "d")
						//definedIntEndFlg = 1;
						definedIntVariable = "x";
					break;
			case 35:
					strcpy(letter, "a");
					formula +=  "a";
					break;
			case 36:
					strcpy(letter, "integral");
					formula +=  "integral ";
					definedIntStartFlg = 1;
					break;
			case 37:
					strcpy(letter, "sigma");
					formula +=  "sigma ";
					break;
			case 38:
					strcpy(letter, "root");
					formula +=  "root ";
					break;
			}

			if(((objCenterPosition[0][1]-objCenterPosition[i][1])>40)&&definedIntStartFlg){ // 정적분
				strTemp = formula.substr(formula.length()-10,formula.length()-1);
				formula.erase(formula.length() - 2, 2);
				//if(strTemp == "integral ")
					definedInt[0] = letter;
					definedIntStartFlg = 0;
					definedIntEndFlg = 1;
			}else if(((objCenterPosition[0][1]-objCenterPosition[i][1])<-40)&&definedIntStartFlg){ // 정적분
				strTemp = formula.substr(formula.length()-10,formula.length()-1);
				formula.erase(formula.length() - 1, 1);
				//if(strTemp == "integral ")
					definedInt[1] = letter;
			}else if(definedIntStartFlg){
				if(nMatchValue != 36) definedIntStartFlg = 0;
				definedIntEndFlg = 0;
			}


			sprintf(text,"[%s]",letter);
			pt1.y = pt1.y-5;
			cvPutText(pLabeledImg,text, pt1, &point_font, CV_RGB(255,0,255));

			cvInitFont(&point_font,CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 8);
			sprintf(text,"[%.1f]",error*100);
			pt1.y = pt1.y-20;
			cvPutText(pLabeledImg,text, pt1, &point_font, CV_RGB(0,255,0));

/*
			cvInitFont(&point_font,CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 8);
			sprintf(text,"[%d, %d]",objCenterPosition[i][0],objCenterPosition[i][1]);
			pt1.y = pt1.y-40;
			cvPutText(pLabeledImg,text, pt1, &point_font, CV_RGB(0,0,255));
*/
    	}
		//cvWaitKey ( 0 );

    }



    if(definedIntEndFlg){
    	formula += " from " + definedIntVariable + "=" + definedInt[1] + " to " + definedInt[0];
    }

	outFormula = env->NewStringUTF(formula.c_str());
	//env->ReleaseStringUTFChars(outFormula, "hell...");
	*pMatGr = pLabeledImg;


	return outFormula;

}