mirror of
https://github.com/bspeice/libcvautomation
synced 2024-12-04 13:58:11 -05:00
Add functions for working with arrays of images to match
Also, change "threshold" to "tolerance," it's much more descriptive
This commit is contained in:
parent
f1048394c8
commit
a63c54f9c4
@ -41,7 +41,7 @@ int main( int argc, char** argv )
|
||||
char *separator = ",";
|
||||
char *root_location = "root.png";
|
||||
char *sub_location = "sub.png";
|
||||
int threshold = INT_MAX;
|
||||
int tolerance = INT_MAX;
|
||||
int search_method = CV_TM_SQDIFF;
|
||||
int useX = 0; /* bool useX = false; */
|
||||
char *xDisplay;
|
||||
@ -60,7 +60,7 @@ int main( int argc, char** argv )
|
||||
{"sub-image", required_argument, 0, 's'},
|
||||
{"separator", required_argument, 0, 'p'},
|
||||
{"search-method",required_argument, 0, 'm'},
|
||||
{"threshold", required_argument, 0, 't'},
|
||||
{"tolerance", required_argument, 0, 't'},
|
||||
{"x-root", optional_argument, 0, 'x'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
@ -112,7 +112,7 @@ int main( int argc, char** argv )
|
||||
break;
|
||||
|
||||
case 't':
|
||||
threshold = atoi(optarg);
|
||||
tolerance = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'x':
|
||||
@ -148,9 +148,9 @@ int main( int argc, char** argv )
|
||||
sub_location = list_curr->fileName;
|
||||
|
||||
if (useX)
|
||||
result_point = matchSubImage_X11_location( xDisplay, sub_location, search_method, threshold );
|
||||
result_point = matchSubImage_X11_location( xDisplay, sub_location, search_method, tolerance );
|
||||
else
|
||||
result_point = matchSubImage_location( root_location, sub_location, search_method, threshold );
|
||||
result_point = matchSubImage_location( root_location, sub_location, search_method, tolerance );
|
||||
|
||||
if ( result_point.x != -1 && result_point.y != -1 )
|
||||
/* Output the match location */
|
||||
@ -195,8 +195,8 @@ Usage: \n\
|
||||
\t-r, --root-image:\tLocation of the root image to compare against.\n\
|
||||
\t-s, --sub-image:\tLocation of the sub-image to find in root.\n\
|
||||
\t-p, --separator:\tSeparator of the X and Y coordinates.\n\
|
||||
\t-t, --threshold:\tSet how strict the match is - 100 is recommended lowest value.\n\
|
||||
\t\t\t\tNote: When using CCORR or CCOEFF threshold works in opposite direction,\n\
|
||||
\t-t, --tolerance:\tSet how strict the match is - 100 is recommended lowest value.\n\
|
||||
\t\t\t\tNote: When using CCORR or CCOEFF tolerance works in opposite direction,\n\
|
||||
\t\t\t\tso -50 is recommended highest value.\n\
|
||||
\t-m, --search-method:\tSet which method is used to search for sub-images.\n\
|
||||
\t\t\t\tMethods:\n\
|
||||
|
@ -25,7 +25,7 @@
|
||||
* =====================================================================================
|
||||
*/
|
||||
|
||||
CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMethod, double threshold )
|
||||
CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMethod, double tolerance )
|
||||
{
|
||||
/* We have the two OpenCV images we want, go ahead and find if there are any matches */
|
||||
IplImage *result;
|
||||
@ -71,14 +71,14 @@ CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMetho
|
||||
/* Return the match location */
|
||||
if ( searchMethod == CV_TM_SQDIFF || searchMethod == CV_TM_SQDIFF_NORMED )
|
||||
{
|
||||
if ( minval < threshold )
|
||||
if ( minval < tolerance )
|
||||
return minloc;
|
||||
else
|
||||
return badpoint;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( maxval > threshold )
|
||||
if ( maxval > tolerance )
|
||||
return maxloc;
|
||||
else
|
||||
return badpoint;
|
||||
@ -92,7 +92,7 @@ CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMetho
|
||||
* Description: Match a root image and sub image from filename
|
||||
* =====================================================================================
|
||||
*/
|
||||
CvPoint matchSubImage_location ( char *rootImage_location, char *subImage_location, int searchMethod, double threshold )
|
||||
CvPoint matchSubImage_location ( char *rootImage_location, char *subImage_location, int searchMethod, double tolerance )
|
||||
{
|
||||
/* This is basically a wrapper for matchSubImage( IplImage, IplImage )
|
||||
* All we do is load the images from the given filenames, and then
|
||||
@ -113,7 +113,7 @@ CvPoint matchSubImage_location ( char *rootImage_location, char *subImage_locati
|
||||
return return_point;
|
||||
}
|
||||
|
||||
return_point = matchSubImage( rootImage, subImage, searchMethod, threshold );
|
||||
return_point = matchSubImage( rootImage, subImage, searchMethod, tolerance );
|
||||
|
||||
/* Free up the memory we created */
|
||||
cvReleaseImage( &rootImage );
|
||||
@ -123,3 +123,66 @@ CvPoint matchSubImage_location ( char *rootImage_location, char *subImage_locati
|
||||
return return_point;
|
||||
|
||||
} /* ----- end of function matchSubImage ----- */
|
||||
|
||||
/*
|
||||
* === FUNCTION ======================================================================
|
||||
* Name: matchSubImage_list
|
||||
* Description: Match a root image and sub image from a list of sub-images.
|
||||
* The list contains an element for each sub-image to specify its own
|
||||
* searchMethod and threshold value.
|
||||
* =====================================================================================
|
||||
*/
|
||||
void matchSubImage_list ( IplImage *rootImage, cvautomationList *subImageListHead, int listSize )
|
||||
{
|
||||
/* This is also a higher-end wrapper for matchSubImage, but is mostly aimed
|
||||
* at making python support for multiple images very easy. */
|
||||
|
||||
CvPoint resultPoint;
|
||||
cvautomationList curr;
|
||||
|
||||
int x = 0;
|
||||
for ( x = 0; x < listSize; x++ )
|
||||
{
|
||||
curr = subImageList[x];
|
||||
if ( subImageListHead[x].cvaImage != 0 )
|
||||
resultPoint = matchSubImage ( rootImage, curr.cvaImage, curr.searchMethod, curr.tolerance );
|
||||
else
|
||||
resultPoint = matchSubImage ( rootImage, curr.fileName, curr.searchMethod, curr.tolerance );
|
||||
|
||||
curr.resultPoint = resultPoint;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* === FUNCTION ======================================================================
|
||||
* Name: matchSubImage_list_location
|
||||
* Description: Match a root image from location, and sub image from
|
||||
* a list of sub-images.
|
||||
* The list contains an element for each sub-image to specify its own
|
||||
* searchMethod and threshold value.
|
||||
* =====================================================================================
|
||||
*/
|
||||
void matchSubImage_list ( char *rootImageFileName, cvautomationList *subImageListHead, int listSize )
|
||||
{
|
||||
/* This is also a higher-end wrapper for matchSubImage, but is mostly aimed
|
||||
* at making python support for multiple images very easy. */
|
||||
|
||||
CvPoint resultPoint;
|
||||
cvautomationList curr;
|
||||
|
||||
IplImage *rootImage;
|
||||
rootImage = cvLoadImage ( rootImageFileName, CV_LOAD_IMAGE_COLOR );
|
||||
|
||||
int x = 0;
|
||||
for ( x = 0; x < listSize; x++ )
|
||||
{
|
||||
curr = subImageList[x];
|
||||
if ( subImageListHead[x].cvaImage != 0 )
|
||||
resultPoint = matchSubImage ( rootImage, curr.cvaImage, curr.searchMethod, curr.tolerance );
|
||||
else
|
||||
resultPoint = matchSubImage ( rootImage, curr.fileName, curr.searchMethod, curr.tolerance );
|
||||
|
||||
curr.resultPoint = resultPoint;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,8 +18,7 @@
|
||||
#ifndef LIBCVAUTOMATION_OPENCV_H
|
||||
#define LIBCVAUTOMATION_OPENCV_H
|
||||
|
||||
#include <opencv/cv.h>
|
||||
#include <opencv/highgui.h>
|
||||
#include "libcvautomation.h"
|
||||
|
||||
/* It should be noted that the following are the macros for template matching:
|
||||
* CV_TM_SQDIFF (default)
|
||||
@ -31,9 +30,12 @@
|
||||
*/
|
||||
|
||||
/* Match a root image and sub image */
|
||||
CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMethod, double threshold );
|
||||
CvPoint matchSubImage ( IplImage *rootImage, IplImage *subImage, int searchMethod, double tolerance );
|
||||
|
||||
/* Match a root image and sub image from filename */
|
||||
CvPoint matchSubImage_location ( char *rootImage_location, char *subImage_location, int searchMethod, double threshold );
|
||||
CvPoint matchSubImage_location ( char *rootImage_location, char *subImage_location, int searchMethod, double tolerance );
|
||||
|
||||
/* Match a root image and sub images from a list of images */
|
||||
void matchSubImage_list ( IplImage *rootImage, cvautomationList *subImageListHead, int listSize )
|
||||
|
||||
#endif /* LIBCVAUTOMATION_OPENCV_H */
|
||||
|
@ -24,7 +24,7 @@
|
||||
* Description: Match a sub image using the X11 root window as root
|
||||
* =====================================================================================
|
||||
*/
|
||||
CvPoint matchSubImage_X11( char *displayLocation, IplImage *subImage, int searchMethod, int threshold )
|
||||
CvPoint matchSubImage_X11( char *displayLocation, IplImage *subImage, int searchMethod, int tolerance )
|
||||
{
|
||||
/* First things first, grab the root X window and convert it to
|
||||
* the IplImage format.
|
||||
@ -159,7 +159,7 @@ CvPoint matchSubImage_X11( char *displayLocation, IplImage *subImage, int search
|
||||
* However, we don't want to do any more work than we have to - send our images off
|
||||
* to matchSubImage in libopencvautomation-opencv. */
|
||||
|
||||
resultPoint = matchSubImage ( X_IPL, subImage, searchMethod, threshold );
|
||||
resultPoint = matchSubImage ( X_IPL, subImage, searchMethod, tolerance );
|
||||
|
||||
/* Clean up the CV image we created, as well as all X resources */
|
||||
XDestroyImage( rootImage );
|
||||
@ -177,7 +177,7 @@ CvPoint matchSubImage_X11( char *displayLocation, IplImage *subImage, int search
|
||||
* Description: Match a sub image using the X11 root window as root, from filename
|
||||
* =====================================================================================
|
||||
*/
|
||||
CvPoint matchSubImage_X11_location( char *displayLocation, char *subImage_location, int searchMethod, int threshold )
|
||||
CvPoint matchSubImage_X11_location( char *displayLocation, char *subImage_location, int searchMethod, int tolerance )
|
||||
{
|
||||
/* This is basically a wrapper for matchSubImage_X11( char *display, IplImage )
|
||||
* All we do is load the sub-image from the given filename, and then
|
||||
@ -195,7 +195,7 @@ CvPoint matchSubImage_X11_location( char *displayLocation, char *subImage_locati
|
||||
return return_point;
|
||||
}
|
||||
|
||||
return_point = matchSubImage_X11( displayLocation, subImage, searchMethod, threshold );
|
||||
return_point = matchSubImage_X11( displayLocation, subImage, searchMethod, tolerance );
|
||||
|
||||
/* Free up the memory we created */
|
||||
cvReleaseImage( &subImage );
|
||||
|
@ -19,12 +19,6 @@
|
||||
#ifndef LIBCVAUTOMATION_X11_H
|
||||
#define LIBCVAUTOMATION_X11_H
|
||||
|
||||
#include <opencv/cv.h>
|
||||
#include <opencv/highgui.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
#include "libcvautomation.h"
|
||||
|
||||
/* It should be noted that the following are the macros for template matching:
|
||||
@ -36,7 +30,7 @@
|
||||
* CV_TM_CCOEFF_NORMED
|
||||
*/
|
||||
|
||||
CvPoint matchSubImage_X11( char *displayLocation, IplImage *subImage, int searchMethod, int threshold ); /* Match a sub image using the X11 root window as root */
|
||||
CvPoint matchSubImage_X11_location( char *displayLocation, char *rootImage_location, int search_method, int threshold ); /* Match a sub image using X11 as root, from filename */
|
||||
CvPoint matchSubImage_X11( char *displayLocation, IplImage *subImage, int searchMethod, int tolerance ); /* Match a sub image using the X11 root window as root */
|
||||
CvPoint matchSubImage_X11_location( char *displayLocation, char *rootImage_location, int search_method, int tolerance ); /* Match a sub image using X11 as root, from filename */
|
||||
|
||||
#endif /* LIBCVAUTOMATION_X11_H */
|
||||
|
@ -19,7 +19,24 @@
|
||||
#define LIBCVAUTOMATION_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include "libcvautomation-opencv.h"
|
||||
#include "libcvautomation-x11.h"
|
||||
|
||||
#include <opencv/cv.h>
|
||||
#include <opencv/highgui.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
/* Define a basic structure to help us with using multiple-picture arguments
|
||||
* Yes, it's a hackish implementation, nobody said you had to use this one. */
|
||||
typedef struct {
|
||||
/* Use one or the other of fileName or cvaImage - cvaImage takes priority */
|
||||
IplImage *cvaImage;
|
||||
char *fileName;
|
||||
|
||||
CvPoint resultPoint;
|
||||
int searchMethod;
|
||||
int tolerance;
|
||||
|
||||
} cvautomationList;
|
||||
|
||||
#endif /* LIBCVAUTOMATION_H */
|
||||
|
Loading…
Reference in New Issue
Block a user