2

私はこのようなコードを持っています:

Mat img = Highgui.imread(inFile);
Mat templ = Highgui.imread(templateFile);
int result_cols = img.cols() - templ.cols() + 1;
int result_rows = img.rows() - templ.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
Imgproc.matchTemplate(img, templ, result, Imgproc.TM_CCOEFF);
/////Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());
for (int i = 0; i < result_rows; i++)
for (int j = 0; j < result_cols; j++) 
  if(result.get(i, j)[0]>?)

     //match!

テンプレート画像の複数の発生を見つけるために、入力画像を解析する必要があります。私はこのような結果を得たい:

result[0][0]= 15%
result[0][1]= 17%
result[x][y]= 47%

TM_COEFF を使用すると、すべての結果は [-xxxxxxxx.xxx,+xxxxxxxx.xxx] になります。

TM_SQDIFF を使用すると、すべての結果は xxxxxxxx.xxx になります。

TM_CCORR を使用すると、すべての結果は xxxxxxxx.xxx になります。

一致または不一致を検出するにはどうすればよいですか? if の正しい条件は何ですか? マトリックスを正規化すると、アプリケーションは値を 1 に設定し、テンプレートが画像に保存されていないかどうかを検出できません (すべての不一致)。

前もって感謝します

4

2 に答える 2

3

メソッド名に「_NORMED」を追加して (たとえば、C++ では CV_TM_COEFF_NORMED。Java では若干異なる場合があります)、目的に合った適切な値を取得できます。

「賢明」とは、目的に合わせて 100 を掛けることができる 0 から 1 の範囲の値を取得することを意味します。

注: CV_TM_SQDIFF_NORMED の場合、-1 から 0 の範囲になります。このメソッドで使用される場合は最小値であるため、意味を理解するために 1 から値を減算する必要があります。

ヒント: 最小値と最大値を取得するには、minMaxLoc() に相当する Java を使用できます。matchtemplate と組み合わせて使用​​すると非常に便利です。クラスCore内にある「minMaxLoc」だと思います。

C++ の実装は次のとおりです。

matchTemplate( input_mat, template_mat, result_mat, method_NORMED );

double minVal, maxVal; 

double percentage;

Point minLoc; Point maxLoc;

minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
if( method_NORMED == CV_TM_SQDIFF_NORMED )
{
   percentage=1-minVal;
}
else
{
   percentage=maxVal;
}

便利な C++ ドキュメント: テンプレートの説明と利用可能なメソッドの一致: http://docs.opencv.org/modules/imgproc/doc/object_detection.html MinMaxLoc ドキュメント: http://docs.opencv.org/modules/core/doc/ operations_on_arrays.html?highlight=minmaxloc#minmaxloc

于 2013-08-22T14:07:32.287 に答える
1

別のアプローチは、背景差分です。歪みが観察できます。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;


public class BackgroundDifference {
    public static void main(String[] arg){
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat model = Highgui.imread("e:\\answers\\template.jpg",Highgui.CV_LOAD_IMAGE_GRAYSCALE);
        Mat scene = Highgui.imread("e:\\answers\\front7.jpg",Highgui.CV_LOAD_IMAGE_GRAYSCALE);
        Mat diff = new Mat();
        Core.absdiff(model,scene,diff);
        Imgproc.threshold(diff,diff,15,255,Imgproc.THRESH_BINARY);
        int distortion = Core.countNonZero(diff);
        System.out.println("distortion:"+distortion);
        Highgui.imwrite("e:\\answers\\diff.jpg",diff);
    }
}

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

于 2014-10-05T11:09:04.900 に答える