Search code examples
iosopencvmachine-learningcomputer-visionimage-comparison

Check presence of subimage in image in iOS


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)


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;
     }
    }