3

OpenCV (Java) を使用してテンプレート マッチングを行い、最大最小値を使用してオブジェクトが見つかったかどうかを判断しようとしています。

次の Java/opencv コードを使用していますが、問題は、最適な一致と一致が見つからないシナリオの両方で最小値に 0.0 を返すことです。

したがって、このテンプレート マッチングは、オブジェクトが見つかったかどうかを判断するのに信頼性がないようです。このコードで何か間違ったことをしていますか、それとも他の手法を使用する必要がありますか?

前もって感謝します。

    int templateMatchMethod = Imgproc.TM_SQDIFF_NORMED;
    Mat largeImage = Highgui.imread(largeUrl);
    Mat smallImage = Highgui.imread(smallUrl);

    boolean isMaxTypleMethod = true;

    double TEMPLATE_MATCH_THRESHOLD = 0.8;

    int result_cols = largeImage.cols() - smallImage.cols() + 1;
    int result_rows = largeImage.rows() - smallImage.rows() + 1;
    Mat result = new Mat(result_rows, result_cols, CvType.CV_8U);

    Imgproc.matchTemplate(largeImage, smallImage, result, templateMatchMethod);
    Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());

    MinMaxLocResult mmr = Core.minMaxLoc(result);

    Point matchLoc;
    double minMaxValue = 1;
    if (templateMatchMethod == Imgproc.TM_SQDIFF || templateMatchMethod == Imgproc.TM_SQDIFF_NORMED)
    {
        matchLoc = mmr.minLoc;
        isMaxTypleMethod = false;
        TEMPLATE_MATCH_THRESHOLD = 0.4;
        minMaxValue = mmr.minVal;
    }
    else
    {
        matchLoc = mmr.maxLoc;
        minMaxValue = mmr.maxVal;
    }

    Core.rectangle(largeImage, matchLoc, new Point(matchLoc.x + smallImage.cols(),
            matchLoc.y + smallImage.rows()), new Scalar(0, 255, 0));

    System.out.println("minMaxValue : "+minMaxValue);
    if(isMaxTypleMethod && TEMPLATE_MATCH_THRESHOLD < minMaxValue)
    {
        System.out.println("Match found");
    }
    else if (!isMaxTypleMethod && TEMPLATE_MATCH_THRESHOLD > minMaxValue)
    {
        System.out.println("Match found");
    }
4

2 に答える 2

4

これはかなり疑わしいようです:

Mat result = new Mat(result_rows, result_cols, CvType.CV_8U);  // better use CvType.CV_32F here

Imgproc.matchTemplate(largeImage, smallImage, result, templateMatchMethod);
Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());   // normalizing a uchar mat into [0..1] can only result in garbage.

繰り返しますが、結果に浮動小数点型を使用し、正規化をスキップすると、はるかにうまく機能します

于 2013-07-27T07:21:40.000 に答える
0

結果を正規化しないでください。つまり、コードからこの行を削除してください。

    Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());   // normalizing a uchar mat into 

これは正常に機能し、minmax の適切な値が得られます。

于 2013-12-17T07:25:19.750 に答える