문제

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)

도움이 되었습니까?

해결책

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;
 }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top