00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #include <stdlib.h>
00019 #include <stdio.h>
00020 #include <unistd.h>
00021 #include <getopt.h>
00022 #include <limits.h>
00023 
00024 #include <libcvautomation/libcvautomation.h>
00025 
00026 void usage ();
00027 
00028 struct list {
00029     char *fileName;
00030     struct list *next;
00031 };
00032 
00033 typedef struct list basic_list; 
00034 
00035 int main( int argc, char** argv )
00036 {
00037     CvPoint result_point;
00038     result_point.x = result_point.y = 0;
00039 
00040     
00041     char *separator = ",";
00042     char *root_location = "root.png";
00043     char *sub_location = "sub.png";
00044     int tolerance = INT_MAX;
00045     int search_method = CV_TM_SQDIFF;
00046     int useX = 0; 
00047     int useCenter = 0;
00048     char *xDisplayLocation;
00049     Display *display;
00050     
00051     display = NULL;
00052 
00053     
00054     xDisplayLocation = "";
00055 
00056     
00057     basic_list *list_head = NULL, *list_curr = NULL, *list_prev = NULL;
00058 
00059     
00060     while (1)
00061     {
00062         static struct option long_options[] =
00063         {
00064                 {"help",        no_argument,        0,  'h'},
00065                 {"usage",       no_argument,        0,  'u'},
00066                 {"version",     no_argument,        0,  'v'},
00067                 {"root-image",  required_argument,  0,  'r'},
00068                 {"sub-image",   required_argument,  0,  's'},
00069                 {"separator",   required_argument,  0,  'p'},
00070                 {"search-method",required_argument, 0,  'm'},
00071                 {"tolerance",   required_argument,  0,  't'},
00072                 {"x-root",      optional_argument,  0,  'x'},
00073                 {"center",      no_argument,        0,  'c'},
00074                 {"sane-tolerance", required_argument, 0, 'o'},
00075                 {0, 0, 0, 0}
00076         };
00077 
00078         int option_index = 0;
00079         opterr = 0;
00080 
00081         int c = getopt_long (argc, argv, "hur:s:p:m:t:x::c",
00082                             long_options, &option_index);
00083 
00084         
00085         if (c == -1)
00086             break;
00087 
00088         switch (c)
00089         {
00090             case 0:
00091                 break;
00092 
00093             case 'h':
00094                 usage();
00095                 break;
00096 
00097             case 'u':
00098                 usage();
00099                 break;
00100 
00101             case 'v':
00102                 usage();
00103                 break;
00104 
00105             case 'r':
00106                 root_location = optarg;
00107                 break;
00108 
00109             case 's':
00110                 if ( list_head == NULL )
00111                 {
00112                     list_head = (basic_list *) malloc (sizeof(basic_list));
00113                     list_curr = list_head;
00114                 }
00115                 list_curr->fileName = optarg;
00116                 list_curr->next = (basic_list *) malloc (sizeof(basic_list));
00117                 list_curr = list_curr->next;
00118                 break;
00119 
00120             case 'p':
00121                 separator = optarg;
00122                 break;
00123 
00124             case 'm':
00125                 search_method = atoi(optarg);
00126                 break;
00127 
00128             case 't':
00129                 tolerance = atoi(optarg);
00130                 break;
00131 
00132             case 'x':
00133                 if ( optarg != NULL ) {
00134                     useX = 1;
00135                     xDisplayLocation = optarg;
00136                     display = XOpenDisplay(xDisplayLocation);
00137                 } else {
00138                     useX = 1;
00139                     xDisplayLocation = "";
00140                     display = XOpenDisplay(xDisplayLocation);
00141                 }
00142                 break;
00143 
00144             case 'c':
00145                 useCenter = 1;
00146 
00147             case 'o':
00148                 tolerance = atoi(optarg);
00149                 
00150 
00151                 tolerance = pow(1.2397076, tolerance);
00152                 break;
00153 
00154             case '?':
00155                 
00156                 break;
00157 
00158             default:
00159                 fprintf( stderr, "Unknown option..." );
00160                 exit(0);
00161         };
00162     }
00163 
00164     
00165 
00166     if ( list_head == NULL )
00167         return 1;
00168     else
00169         list_curr = list_head;
00170 
00171     do
00172     {
00173         sub_location = list_curr->fileName;
00174 
00175         if (useX && useCenter)
00176             result_point = matchSubImage_X11_location_center( display, sub_location, search_method, tolerance );
00177         else if (useX && !useCenter)
00178             result_point = matchSubImage_X11_location( display, sub_location, search_method, tolerance );
00179         else if (!useX && useCenter)
00180             result_point = matchSubImage_location_center( root_location, sub_location, search_method, tolerance );
00181         else 
00182             result_point = matchSubImage_location( root_location, sub_location, search_method, tolerance );
00183 
00184         if ( result_point.x != -1 && result_point.y != -1 )
00185             
00186             printf ("%s%s%i%s%i\n", list_curr->fileName, separator,
00187                     result_point.x, separator, result_point.y );
00188 
00189         
00190 
00191 
00192         list_prev = list_curr;
00193         list_curr = list_curr->next;
00194         free(list_prev);
00195 
00196     } while ( list_curr->fileName != NULL );
00197 
00198     
00199     free(list_curr);
00200 
00201     
00202     if (useX)
00203         XCloseDisplay(display);
00204 
00205     return 0;
00206 }
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 void usage ( )
00215 {
00216     fprintf( stderr, "\
00217 Libcvautomation version: %s\n\
00218 cva-match -r <root_image> -s <sub_image> \n\
00219 cva-match -s <sub_image> -x \n\
00220 \n\
00221 This program uses OpenCV in order to recognize an image within an image.\n\
00222 The return code is how many matches were found - return 0 for no matches,\n\
00223 1 for one match, etc.\n\
00224 \n\
00225 Usage: \n\
00226 \n\
00227 \t-h, --help:\t\tDisplay this usage message.\n\
00228 \t-u, --usage:\t\tDisplay this usage message.\n\
00229 \t-r, --root-image:\tLocation of the root image to compare against.\n\
00230 \t-s, --sub-image:\tLocation of the sub-image to find in root.\n\
00231 \t-p, --separator:\tSeparator of the X and Y coordinates.\n\
00232 \t-t, --tolerance:\tSet how strict the match is - 100 is recommended lowest value.\n\
00233 \t\t\t\tNote: When using CCORR or CCOEFF tolerance works in opposite direction,\n\
00234 \t\t\t\tso -50 is recommended highest value.\n\
00235 \t-m, --search-method:\tSet which method is used to search for sub-images.\n\
00236 \t\t\t\tMethods:\n\
00237 \t\t\t\t\tCV_TM_SQDIFF = 0\n\
00238 \t\t\t\t\tCV_TM_SQDIFF_NORMED = 1\n\
00239 \t\t\t\t\tCV_TM_CCORR = 2\n\
00240 \t\t\t\t\tCV_TM_CCORR_NORMED = 3\n\
00241 \t\t\t\t\tCV_TM_CCOEFF = 4\n\
00242 \t\t\t\t\tCV_TM_COEFF_NORMED = 5\n\
00243 \t-x, --x-root[=DISPLAY]:\tSet the root image to come from X11\n\
00244 \t\t\t\tThe DISPLAY variable is optional, not specifying it will cause X\n\
00245 \t\t\t\tto use the default display (not specifically :0.0)\n\
00246 \t\t\t\tPlease note also that the '-x' must come at the end\n\
00247 \t\t\t\tsince it is an optional argument.\n\
00248 \t-c, --center:\t\tThe output points should be centered on the sub-image, rather\n\
00249 \t\t\t\tthan the top-left corner.\n\
00250 \t-o, --sane-tolerance:\tSet the tolerance using a scale of 1-100,\n\
00251 \t\t\t\trather than INT_MIN to INT_MAX (100 ~= INT_MAX)\n\
00252 \n\
00253 If you have any questions, comments, concerns, email <%s>\n", LIBCVAUTOMATION_VERSION, LIBCVAUTOMATION_BUGREPORT );
00254 
00255     exit (0);
00256 
00257 }       
00258 
00259 
00266