87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* This sample code was originally provided by Liu Liu
 | |
|  * Copyright (C) 2009, Liu Liu All rights reserved.
 | |
|  */
 | |
| 
 | |
| #include "opencv2/highgui/highgui.hpp"
 | |
| #include "opencv2/features2d/features2d.hpp"
 | |
| #include "opencv2/imgproc/imgproc.hpp"
 | |
| 
 | |
| #include <iostream>
 | |
| #include <stdio.h>
 | |
| 
 | |
| using namespace cv;
 | |
| using namespace std;
 | |
| 
 | |
| static void help()
 | |
| {
 | |
|     cout << "\nThis program demonstrates the Maximal Extremal Region interest point detector.\n"
 | |
|     "It finds the most stable (in size) dark and white regions as a threshold is increased.\n"
 | |
|     "\nCall:\n"
 | |
|     "./mser_sample <path_and_image_filename, Default is 'puzzle.png'>\n\n";
 | |
| }
 | |
| 
 | |
| static const Vec3b bcolors[] =
 | |
| {
 | |
|     Vec3b(0,0,255),
 | |
|     Vec3b(0,128,255),
 | |
|     Vec3b(0,255,255),
 | |
|     Vec3b(0,255,0),
 | |
|     Vec3b(255,128,0),
 | |
|     Vec3b(255,255,0),
 | |
|     Vec3b(255,0,0),
 | |
|     Vec3b(255,0,255),
 | |
|     Vec3b(255,255,255)
 | |
| };
 | |
| 
 | |
| int main( int argc, char** argv )
 | |
| {
 | |
|     string path;
 | |
|     Mat img0, img, yuv, gray, ellipses;
 | |
|     help();
 | |
| 
 | |
|     img0 = imread( argc != 2 ? "puzzle.png" : argv[1], 1 );
 | |
|     if( img0.empty() )
 | |
|     {
 | |
|         if( argc != 2 )
 | |
|             cout << "\nUsage: mser_sample <path_to_image>\n";
 | |
|         else
 | |
|             cout << "Unable to load image " << argv[1] << endl;
 | |
|         return 0;
 | |
|     }
 | |
| 
 | |
|     cvtColor(img0, yuv, COLOR_BGR2YCrCb);
 | |
|     cvtColor(img0, gray, COLOR_BGR2GRAY);
 | |
|     cvtColor(gray, img, COLOR_GRAY2BGR);
 | |
|     img.copyTo(ellipses);
 | |
| 
 | |
|     vector<vector<Point> > contours;
 | |
|     double t = (double)getTickCount();
 | |
|     MSER()(yuv, contours);
 | |
|     t = (double)getTickCount() - t;
 | |
|     printf( "MSER extracted %d contours in %g ms.\n", (int)contours.size(),
 | |
|            t*1000./getTickFrequency() );
 | |
| 
 | |
|     // draw mser's with different colors
 | |
|     for( int i = (int)contours.size()-1; i >= 0; i-- )
 | |
|     {
 | |
|         const vector<Point>& r = contours[i];
 | |
|         for ( int j = 0; j < (int)r.size(); j++ )
 | |
|         {
 | |
|             Point pt = r[j];
 | |
|             img.at<Vec3b>(pt) = bcolors[i%9];
 | |
|         }
 | |
| 
 | |
|         // find ellipse (it seems cvfitellipse2 have error or sth?)
 | |
|         RotatedRect box = fitEllipse( r );
 | |
| 
 | |
|         box.angle=(float)CV_PI/2-box.angle;
 | |
|         ellipse( ellipses, box, Scalar(196,255,255), 2 );
 | |
|     }
 | |
| 
 | |
|     imshow( "original", img0 );
 | |
|     imshow( "response", img );
 | |
|     imshow( "ellipses", ellipses );
 | |
| 
 | |
|     waitKey(0);
 | |
| }
 | 
