1

smallImage と largeImage という 2 つの画像があります。ここで、smallImage が largeImage の一部 (またはサブイメージ) であるかどうかを確認したいと思います。それを確認する方法がわかりません。iOSでこのすべてをやりたいです。グーグルで調べたところ、openCVライブラリを使用するのがそのようなものに使用するのに最適なライブラリであることがわかりました。しかし、openCV ライブラリを使用してタスクを実行する方法がわかりません。

要するに、私が知りたいのは、

1)大きな画像でサブ画像を検索/チェックするためのさまざまな手法/方法/アルゴリズムは何ですか

2) openCV ライブラリを使用して (1) を実行する方法 (つまり、それを使用して大きな画像のサブイメージをチェックする方法)

4

1 に答える 1

6

OpennCV テンプレート マッチング アルゴリズムを使用できます。

試してみてください..

https://github.com/Fl0p/OpenCV-iOSから opencv2.framework をダウンロードします

https://github.com/aptogo/OpenCVForiPhone/tree/master/OpenCVClientから UIImage+OpenCV をダウンロードします

インポート ファイル opencv2/nonfree/nonfree.hpp、opencv2/highgui/highgui.hpp、opencv2/calib3d/calib3d.hpp、UIImage+OpenCV.h

この関数を使用して画像を照合します。

-(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;
 }
}
于 2013-12-13T09:14:50.750 に答える