Question

I have 2 images, say smallerImage and largerImage. Now, I want to check that does smallerImage is part(or subimage) of largerImage or not. I am not getting how to check that. I want to so this whole stuff in iOS. After gogling, i got that using openCV library is best library to use for such a stuff. But i am not getting how to use openCV library to perform my task.

In Short, i want to know about,

1) What are the different techniques/methods/algorithms to find/check subimage in larger image

2) How to use openCV Library to perform (1).(i.e. how to use it to check subimage in larger image)

Was it helpful?

Solution

You can use OpennCV Template Matching algorithm..

please try it..

download opencv2.framework from https://github.com/Fl0p/OpenCV-iOS

download UIImage+OpenCV from https://github.com/aptogo/OpenCVForiPhone/tree/master/OpenCVClient

import files opencv2/nonfree/nonfree.hpp, opencv2/highgui/highgui.hpp, opencv2/calib3d/calib3d.hpp, UIImage+OpenCV.h

use this function for matching images.

-(BOOL) matchImages:(UIImage*)largerImage Image2:(UIImage*)subImage
{

 cv::Mat tempMat1 = [largerImage CVMat];
 cv::Mat tempMat2 = [subImage CVMat];

 cv::Mat result;


 int match_method = CV_TM_SQDIFF_NORMED;
 //cv::cvtColor(tempMat1, debug, CV_GRAY2BGR);
 //cv::cvtColor(tempMat1, tempMat1, cv::COLOR_RGB2GRAY);
 //cv::cvtColor(tempMat2, tempMat2, cv::COLOR_RGB2GRAY);

 int result_cols =  tempMat1.cols - tempMat2.cols + 1;
 int result_rows = tempMat1.rows - tempMat2.rows + 1;

 result.create( result_cols, result_rows, CV_32FC1 );


 /// Do the Matching and Normalize
 cv::matchTemplate( tempMat1,tempMat2 ,result,match_method);

 double minVal; double maxVal;
 cv::Point minLoc, maxLoc, matchLoc;
 cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat() );
 if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ) matchLoc = minLoc;
 else matchLoc = maxLoc;

//NSLog(@"%d %d",tempMat1.cols,tempMat1.rows);
NSLog(@"%f %f",minVal,maxVal);

 if (minVal < 0.25) {

     NSLog(@"success");

     //cv::rectangle(tempMat1,matchLoc,cv::Point(matchLoc.x + tempMat2.cols , matchLoc.y + tempMat2.rows),CV_RGB(255,0,0),3);

     //UIImage *resImage = [[UIImage alloc] initWithCVMat:tempMat1];
     //UIImageView * imageview = [[UIImageView alloc] initWithImage:resImage];
     //[imageview setFrame:CGRectMake(0, 0, resImage.size.width, resImage.size.height)];
     //[self.view addSubview:imageview];

     return YES;
 }
 else {

    return NO;
 }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top