void CV_KNearestTest::run( int /*start_from*/ )
{
    int sizesArr[] = { 500, 700, 800 };
    int pointsCount = sizesArr[0]+ sizesArr[1] + sizesArr[2];

    // train data
    Mat trainData( pointsCount, 2, CV_32FC1 ), trainLabels;
    vector<int> sizes( sizesArr, sizesArr + sizeof(sizesArr) / sizeof(sizesArr[0]) );
    vector<Mat> means, covs;
    defaultDistribs( means, covs );
    generateData( trainData, trainLabels, sizes, means, covs, CV_32FC1 );

    // test data
    Mat testData( pointsCount, 2, CV_32FC1 ), testLabels, bestLabels;
    generateData( testData, testLabels, sizes, means, covs, CV_32FC1 );

    int code = cvtest::TS::OK;
    KNearest knearest;
    knearest.train( trainData, trainLabels );
    knearest.find_nearest( testData, 4, &bestLabels );
    if( calcErr( bestLabels, testLabels, sizes, true ) > 0.01f )
    {
        ts->printf( cvtest::TS::LOG, "bad accuracy on test data" );
        code = cvtest::TS::FAIL_BAD_ACCURACY;
    }
    ts->set_failed_test_info( code );
}
예제 #2
0
void RunSelfTest(KNearest& knn2)
{
	Mat img;
	CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);
	// SelfTest
	char file[255];
	int z = 0;
	while (z++ < 10)
	{
		int iSecret = rand() % 10;
		//cout << iSecret;
		sprintf(file, "%s/%d.png", pathToImages, iSecret);
		img = imread(file, 1);
		Mat stagedImage;
		PreProcessImage(&img, &stagedImage, sizex, sizey);
		for (int n = 0; n < ImageSize; n++)
		{
			sample2->data.fl[n] = stagedImage.data[n];
		}
		float detectedClass = knn2.find_nearest(sample2, 1);
		if (iSecret != (int) ((detectedClass)))
		{
			exit(1);
		}
		sprintf(file, "/sdcard/exartisan_pics/%d.png", iSecret);
		imwrite(file,img);
	}
}
예제 #3
0
파일: digit.cpp 프로젝트: 12019/MyDigit
void RunSelfTest(KNearest& knn2)  
{  
 Mat img;  
 CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);  
 // SelfTest  
 char file[255];  
 int z = 0;  
 while (z++ < 10)  
 {  
  int iSecret = rand() % 10;  
  //cout << iSecret;  
  sprintf(file, "%s/%d.png", pathToImages, iSecret);  
  img = imread(file, 1);  
  Mat stagedImage;  
  PreProcessImage(&img, &stagedImage, sizex, sizey);  
  for (int n = 0; n < ImageSize; n++)  
  {  
   sample2->data.fl[n] = stagedImage.data[n];  
  }  
  float detectedClass = knn2.find_nearest(sample2, 1);  
  if (iSecret != (int) ((detectedClass)))  
  {  
   cout << "Falsch. Ist " << iSecret << " aber geraten ist "  
     << (int) ((detectedClass));  
   exit(1);  
  }  
  cout << "Richtig " << (int) ((detectedClass)) << "\n";  
  imshow("single", img);  
  waitKey(0);  
 }  
  
}  
예제 #4
0
float DigitRecognizer::classify(cv::Mat img)
{
	imwrite("/sdcard/digit/classify.png",img);
//	Mat cloneImg = preprocessImage(img);

//	return knn->find_nearest(Mat_<float>(cloneImg), 1);
	return knn->find_nearest(img, 1);
}
void analyseImage(char filename[], KNearest knearest){
	CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);
 	Mat image, gray, blur, thresh;
 	vector < vector<Point> > contours;
 	image = imread(filename, 1);
	if(image.empty()){
		cout << "Error: File \"" << filename << "\" not found." << endl;		
		exit(0);
	}
	
	imshow(filename,image);
	//Preprocessing
 	cvtColor(image, gray, COLOR_BGR2GRAY);
 	GaussianBlur(gray, blur, Size(5, 5), 2, 2);
 	adaptiveThreshold(blur, thresh, 255, 1, 1, 11, 2);
 	findContours(thresh, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);

	float charsequence[20];
	float orderedsequence[20];
	int char_x[20]; //the x-coordinate of the characters; used in sorting
	initializeArray(char_x);
	int counter=0;
	for (size_t i = 0; i < contours.size(); i++){
		vector < Point > cnt = contours[i];
	   	Rect rec = boundingRect(cnt);
		float ar_min = 0.30; //aspect_ratio_min
		float ar_max = 0.90; //aspect_ratio_max
		//cout << "rec width: " << rec.width;
		//cout << "rec hieght: " << rec.height << " \n ";
		float rec_ar = ((float)rec.width/(float)rec.height);
		//cout << "rec ar: " << rec_ar;
	   	if (rec.height > 28 && (rec_ar > ar_min && rec_ar < ar_max)){
	    		Mat roi = image(rec);
	    		Mat stagedImage;
	    		preProcessImage(&roi, &stagedImage, sizex, sizey);
	    		for (int n = 0; n < ImageSize; n++){
	     			sample2->data.fl[n] = stagedImage.data[n];
	    		}
	    		float result = knearest.find_nearest(sample2, 1);
			charsequence[counter]=result;
			char_x[counter] = rec.x;
			counter++;

	    		rectangle(image, Point(rec.x, rec.y),
	      		Point(rec.x + rec.width, rec.y + rec.height),
	      		Scalar(0, 0, 255), 2);
	   	}
	}
	imshow("License Plate Number Recognizer", image);
	cout << "---------------------------------" << endl;
	cout << "License Plate Number: ";
	string license_plate = "";
	
	orderCharacters(orderedsequence, charsequence, char_x);

	for (int a=0; a<counter; a++){
		license_plate = license_plate + decodeCharacter(orderedsequence[a]);
	} 
	cout << license_plate;
	cout << endl << "---------------------------------" << endl;
}
예제 #6
0
    void AnalyseImage(KNearest knearest, CvSVM SVM)  
    {  
      
     //CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);  
     CvMat* sample2;      
     Mat _image,image, gray, blur, thresh;  
      
     vector < vector<Point> > contours;  
     _image = imread("./images/37.png", 1);  
     //image = imread("./images/all_4.png", 1);  
     
     resize(_image,image,Size(2*sizex,1.2*sizey));
     cvtColor(image, gray, COLOR_BGR2GRAY);  
     GaussianBlur(gray, blur, Size(5, 5), 2, 2);  
     adaptiveThreshold(blur, thresh, 255, 1, 1, 11, 2);  
     findContours(thresh, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);  
     float digits[contours.size()];
     float number;
      
     for (size_t i = 0; i < contours.size(); i++)  
     {  
      vector < Point > cnt = contours[i];  
      if (contourArea(cnt) > 50)  
      {  
       Rect rec = boundingRect(cnt);  
       if (rec.height > 28)  
       {  
        Mat roi = image(rec);  
        Mat stagedImage;  

        // Descriptor    
        switch (descriptor) {
         case 1:
          {// HOG descriptor
           HOGDescriptor hog;
           vector<float> ders;
       	   vector<Point> locs;
           resize(roi,stagedImage,Size(64,128));
           hog.compute(stagedImage,ders,Size(0,0),Size(0,0),locs);
           //cout<<ders.size()<<"\n";
           sample2 = cvCreateMat(1, ders.size(), CV_32FC1);  
           for (int n = 0; n < ders.size(); n++)  
           {  
            sample2->data.fl[n] = ders.at(n);  
           }          
           break;
          }
         case 2:
          { // Image Data descriptor
           sample2 = cvCreateMat(1, ImageSize, CV_32FC1);
           PreProcessImage(&roi, &stagedImage, sizex, sizey);  
           for (int n = 0; n < ImageSize; n++)  
           {  
            sample2->data.fl[n] = stagedImage.data[n];  
           }  
           break;
          }
         case 3:
          {// HOG3 detector
           resize(roi,stagedImage,Size(sizex,sizey));
	   IplImage copy = stagedImage;
	   IplImage* img2 = &copy;	
           vector<float> ders;
       	   HOG3(img2,ders);
           sample2 = cvCreateMat(1, ders.size(), CV_32FC1);  
           for (int n = 0; n < ders.size(); n++)  
           {  
            sample2->data.fl[n] = ders.at(n);  
           }  
           break;       	  
          }
         case 4:
          { // Histogram as descriptor
       	   resize(roi,stagedImage,Size(sizex,sizey));
       	   // Establish the number of bins
	   int histSize = 9;
	   // Set the ranges (for grayscale values)
	   float range[] = { 0, 256 } ;
	   const float* histRange = { range };
	   bool uniform = true; bool accumulate = false;
	   Mat ders; // histogram descriptor
           int ders_size=ders.rows*ders.cols;
           sample2 = cvCreateMat(1, ders_size, CV_32FC1);	   
	   // Compute the histograms:
	   calcHist( &stagedImage, 1, 0, Mat(), ders, 1, &histSize, &histRange, uniform, accumulate );
           normalize( ders, ders, 0, 1, NORM_MINMAX, -1, Mat() );	   
	   for (int n = 0; n < ders_size; n++)  
           {  
            sample2->data.fl[n] = ders.data[n]; 
           } 
       	   break;	
          }          
        }
	
	// Classifier
        float result;
        switch (classifier) {
         case 1:
         {
       	   result = SVM.predict(sample2);
           break;
         }
         case 2:
         {
           result = knearest.find_nearest(sample2, 1);       	 	
       	   break;
         }
        }
        digits[contours.size()-i-1]=result;
        rectangle(image, Point(rec.x, rec.y),  
        Point(rec.x + rec.width, rec.y + rec.height),  
        Scalar(0, 0, 255), 2);  
      
        imshow("all", image);  
        cout << result << "\n";  
      
        imshow("single", stagedImage);  
        waitKey(0);  
       }  
      
      }  
      
     }
     number=digits[0]*10+digits[1];
     cout<< "number is "<<number<<"\n";
    }  
예제 #7
0
   void RunSelfTest(KNearest& knn2, CvSVM& SVM2)  
    {  
     Mat img;  
     //CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);  
     CvMat* sample2;
     // SelfTest  
     char file[255];  
     int z = 0;  
     while (z++ < 10)  
     {  
      int iSecret = rand() % classes;  
      //cout << iSecret;  
      sprintf(file, "%s/%d/%d.png", pathToImages, iSecret, rand()%train_samples);  
      img = imread(file, 1);  
      Mat stagedImage;  

      switch (descriptor) {
       case 1:
       {// HOG descriptor
         HOGDescriptor hog;
         vector<float> ders;
       	 vector<Point> locs;
         resize(img,stagedImage,Size(64,128));
         hog.compute(stagedImage,ders,Size(0,0),Size(0,0),locs);
         //cout<<ders.size()<<"\n";
         sample2 = cvCreateMat(1, ders.size(), CV_32FC1);  
         for (int n = 0; n < ders.size(); n++)  
         {  
          sample2->data.fl[n] = ders.at(n);  
         }          
         break;
       }
       case 2:
       { // Image data as descriptor
         sample2 = cvCreateMat(1, ImageSize, CV_32FC1);
         PreProcessImage(&img, &stagedImage, sizex, sizey);  
         for (int n = 0; n < ImageSize; n++)  
         {  
          sample2->data.fl[n] = stagedImage.data[n];  
         }  
         break;
       }
       case 3:
       { // HOG3 descriptor
         resize(img,stagedImage,Size(sizex,sizey));
	 IplImage copy = stagedImage;
	 IplImage* img2 = &copy;	
         vector<float> ders;       	  
       	 HOG3(img2,ders);
         sample2 = cvCreateMat(1, ders.size(), CV_32FC1);  
         for (int n = 0; n < ders.size(); n++)  
         {  
          sample2->data.fl[n] = ders.at(n);  
         } 
         break;       	  
       } 
       case 4:
       { // Histogram as descriptor
       	 resize(img,stagedImage,Size(sizex,sizey));
       	 // Establish the number of bins
	 int histSize = 9;
	 // Set the ranges (for grayscale values)
	 float range[] = { 0, 256 } ;
	 const float* histRange = { range };
	 bool uniform = true; bool accumulate = false;
	 Mat ders; // histogram descriptor
	 int ders_size=ders.rows*ders.cols;
         sample2 = cvCreateMat(1, ders_size, CV_32FC1);	 
	 // Compute the histograms:
	 calcHist( &stagedImage, 1, 0, Mat(), ders, 1, &histSize, &histRange, uniform, accumulate );
	 normalize( ders, ders, 0, 1, NORM_MINMAX, -1, Mat() );	 
	 for (int n = 0; n < ders_size; n++)  
         {  
          sample2->data.fl[n] = ders.data[n]; 
         } 
       	 break;	
       }      
      } 
 
      float detectedClass;
      switch (classifier) {
       case 1:
       {
       	 detectedClass = SVM2.predict(sample2);
         break;
       }
       case 2:
       {
         detectedClass = knn2.find_nearest(sample2, 1);       	 	
       	 break;
       }
      }
     
      if (iSecret != (int) ((detectedClass)))  
      {  
       cout << "False " << iSecret << " matched with "  
         << (int) ((detectedClass));  
       exit(1);  
      }  
      cout << "Right " << (int) ((detectedClass)) << "\n";  
      imshow("single", stagedImage);  
      waitKey(0);  
     }  
      
    }  
예제 #8
0
bool AnalyseImage(KNearest knearest)
{
	CvMat* sample2 = cvCreateMat(1, ImageSize, CV_32FC1);

	Mat image, gray, blur, thresh;

	vector < vector<Point> > contours;
	image = imread("/sdcard/exartisan_pics/answer_number_code.jpg", 1);
	if(!image.data) return 0;

	char file[255];
	Mat text_img(image.size(), CV_8U);
	rectangle(text_img,Rect(0,0,text_img.cols,text_img.rows),Scalar(255,255,255,255),CV_FILLED);

	cvtColor(image, gray, COLOR_BGR2GRAY);
	GaussianBlur(gray, blur, Size(5, 5), 2, 2);
	adaptiveThreshold(blur, thresh, 255, 1, 1, 11, 2);
	findContours(thresh, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);

	for (size_t i = 0; i < contours.size(); i++)
	{
		vector < Point > cnt = contours[i];
		if (contourArea(cnt) > 50)
		{
			Rect rec = boundingRect(cnt);
			if ((rec.height > 27)&&(rec.height < 35)&&(rec.width < 28))
			{
				Mat roi = image(rec);
				Mat stagedImage;
				PreProcessImage(&roi, &stagedImage, sizex, sizey);

				for (int n = 0; n < ImageSize; n++)
				{
					sample2->data.fl[n] = stagedImage.data[n];
				}

				// bug in here.....
				float result = knearest.find_nearest(sample2, 1);

				//     float result = dr->classify(sample2);
				rectangle(image, Point(rec.x, rec.y),
						Point(rec.x + rec.width, rec.y + rec.height),
						Scalar(0, 0, 255), 2);
				if((rec.height/rec.width)>3)	result = 1;
				text_img.data[(10)*text_img.cols+rec.x] = round(result);

			}
		}
	}

	if (abc ==1)	imwrite("/sdcard/exartisan_pics/abc_1.png",image);

	int m=0;char tt;
	for (int k=0;k<text_img.rows;k++)
		for (int l=0;l<text_img.cols;l++)
		{
			if (text_img.data[k*text_img.cols+l]<10)
			{
				sprintf(&tt,"%d",text_img.data[k*text_img.cols+l]);
				text[m] = tt;
				m++;
			}
		}
	text[m] = '\0';

	putText(image, text, Point(50, 30), FONT_HERSHEY_PLAIN, 1.5, Scalar(255,100,100,255), 2.0);
	imwrite("/sdcard/exartisan_pics/answer_number_code_result.jpg", image);

	cvReleaseMat( &sample2 );

	if (m != 16)
	{
//		sprintf(text,"recognition failed!");
		return false;
	}
	return true;
}