模板匹配误报

时间:2017-01-05 06:37:17

标签: java opencv template-matching

我在openCV java上使用模板匹配来识别子图像是否存在于较大的图像中。我想只有在更大的图像中有精确的子图像时才能得到匹配的坐标。我正在使用此代码,但得到了很多误报。附件是子图像和更大的图像。 Subimage不在更大的图像中,但我得到的匹配是(873,715)larger image subimage

    public void run(String inFile, String templateFile, String outFile,
    int match_method) {
    System.out.println("Running Template Matching");

    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());
    Imgproc.threshold(result, result, 0.1, 1.0, Imgproc.THRESH_TOZERO);
    // / Localizing the best match with minMaxLoc
    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;
    }
    double threashhold = 1.0;
    if (mmr.maxVal > threashhold) {
        System.out.println(matchLoc.x+" "+matchLoc.y);  
       Imgproc.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(),
                matchLoc.y + templ.rows()), new Scalar(0, 255, 0));
    }
    // Save the visualized detection.
    Imgcodecs.imwrite(outFile, img);
}

2 个答案:

答案 0 :(得分:0)

以下是同一问题的答案:Determine if an image exists within a larger image, and if so, find it, using Python

您必须将python代码转换为Java

答案 1 :(得分:0)

我不熟悉Java中的OpenCV,但不熟悉OpenCV C ++。

我认为不需要以下代码。

Imgproc.threshold(result, result, 0.1, 1.0, Imgproc.THRESH_TOZERO);

如果使用标准化选项,则“Mat结果”的最小值/最大值将介于-1和1之间。因此,如果使用规范化选项,则以下代码将无效,因为阈值为1.0。

if (mmr.maxVal > threshold) 

另外,如果您使用CV_TM_SQDIFF,则上面的代码应为

if (mmr.minVal < threshold)

有适当的门槛。

在将minVal / maxVal与阈值进行比较之前绘制minMaxLoc怎么样?看到它给出了正确的结果?因为(873,715)的比赛是荒谬的。