首页 > 解决方案 > 如何调整openCV(java)中模板匹配的阈值?

问题描述

我正在使用 openCV 3.4.7 Android SDK (java) 运行模板匹配。代码几乎可以完美运行;当模板匹配时,它会在匹配区域上绘制一个矩形。问题是即使没有匹配,它也会绘制一个随机矩形。我认为这是因为阈值设置不正确。如果是这样,有人可以帮我吗?

这是代码:

public static void run(String inFile, String templateFile, String outFile,
                    int match_method) {
        Mat img = Imgcodecs.imread(inFile);
        Mat templ = Imgcodecs.imread(templateFile);

        // / Create the result matrix
        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);

        // / Do the Matching and Normalize
        Imgproc.matchTemplate(img, templ, result, match_method);
        Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());

        // / Localizing the best match with minMaxLoc
        Core.MinMaxLocResult mmr = Core.minMaxLoc(result);

        Point matchLoc;
        if (match_method == Imgproc.TM_SQDIFF
                || match_method == Imgproc.TM_SQDIFF_NORMED) {
            matchLoc = mmr.minLoc;
        } else {
            matchLoc = mmr.maxLoc;
        }

        // / Show me what you got
        Imgproc.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(),
                matchLoc.y + templ.rows()), new Scalar(0, 0, 128));

        // Save the visualized detection.
        System.out.println("Writing " + outFile);
        Imgcodecs.imwrite(outFile, img);
}

标签: javaandroidopencvimage-processingtemplate-matching

解决方案


使用规范匹配方法确保您的匹配值为 [0..1]。

替换此行

Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());

与阈值操作。否则,0.9 的最佳匹配将通过第二次归一化变为 1,您将丢失实际匹配“质量”信息。

规范化模板匹配的结果将始终导致您的最佳匹配为 1,从而无法丢弃错误匹配。


推荐阅读