Home | History | Annotate | Download | only in TrackingMotion
      1 /**
      2  * @function cornerSubPix_Demo.cpp
      3  * @brief Demo code for refining corner locations
      4  * @author OpenCV team
      5  */
      6 
      7 #include "opencv2/imgcodecs.hpp"
      8 #include "opencv2/highgui/highgui.hpp"
      9 #include "opencv2/imgproc/imgproc.hpp"
     10 #include <iostream>
     11 #include <stdio.h>
     12 #include <stdlib.h>
     13 
     14 using namespace cv;
     15 using namespace std;
     16 
     17 /// Global variables
     18 Mat src, src_gray;
     19 
     20 int maxCorners = 10;
     21 int maxTrackbar = 25;
     22 
     23 RNG rng(12345);
     24 const char* source_window = "Image";
     25 
     26 /// Function header
     27 void goodFeaturesToTrack_Demo( int, void* );
     28 
     29 /**
     30  * @function main
     31  */
     32 int main( int, char** argv )
     33 {
     34   /// Load source image and convert it to gray
     35   src = imread( argv[1], 1 );
     36   cvtColor( src, src_gray, COLOR_BGR2GRAY );
     37 
     38   /// Create Window
     39   namedWindow( source_window, WINDOW_AUTOSIZE );
     40 
     41   /// Create Trackbar to set the number of corners
     42   createTrackbar( "Max  corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo );
     43 
     44   imshow( source_window, src );
     45 
     46   goodFeaturesToTrack_Demo( 0, 0 );
     47 
     48   waitKey(0);
     49   return(0);
     50 }
     51 
     52 /**
     53  * @function goodFeaturesToTrack_Demo.cpp
     54  * @brief Apply Shi-Tomasi corner detector
     55  */
     56 void goodFeaturesToTrack_Demo( int, void* )
     57 {
     58   if( maxCorners < 1 ) { maxCorners = 1; }
     59 
     60   /// Parameters for Shi-Tomasi algorithm
     61   vector<Point2f> corners;
     62   double qualityLevel = 0.01;
     63   double minDistance = 10;
     64   int blockSize = 3;
     65   bool useHarrisDetector = false;
     66   double k = 0.04;
     67 
     68   /// Copy the source image
     69   Mat copy;
     70   copy = src.clone();
     71 
     72   /// Apply corner detection
     73   goodFeaturesToTrack( src_gray,
     74                corners,
     75                maxCorners,
     76                qualityLevel,
     77                minDistance,
     78                Mat(),
     79                blockSize,
     80                useHarrisDetector,
     81                k );
     82 
     83 
     84   /// Draw corners detected
     85   cout<<"** Number of corners detected: "<<corners.size()<<endl;
     86   int r = 4;
     87   for( size_t i = 0; i < corners.size(); i++ )
     88      { circle( copy, corners[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255)), -1, 8, 0 ); }
     89 
     90   /// Show what you got
     91   namedWindow( source_window, WINDOW_AUTOSIZE );
     92   imshow( source_window, copy );
     93 
     94   /// Set the neeed parameters to find the refined corners
     95   Size winSize = Size( 5, 5 );
     96   Size zeroZone = Size( -1, -1 );
     97   TermCriteria criteria = TermCriteria( TermCriteria::EPS + TermCriteria::COUNT, 40, 0.001 );
     98 
     99   /// Calculate the refined corner locations
    100   cornerSubPix( src_gray, corners, winSize, zeroZone, criteria );
    101 
    102   /// Write them down
    103   for( size_t i = 0; i < corners.size(); i++ )
    104      { cout<<" -- Refined Corner ["<<i<<"]  ("<<corners[i].x<<","<<corners[i].y<<")"<<endl; }
    105 }
    106