繁体   English   中英

使用openCV在android中匹配图像模板

[英]Image Template matching in android using openCV

我正在尝试制作一个自动化的 android 应用程序,它可以在另一个图像(主图像/更大图像)中找到一个图像(模板/子图像)。

OnePlus 3T 菜单图片

来自 MotG 3 的 Whatsapp 图标图像

菜单图片来自一加3T。 Whatsapp 图标图片来自 motoG 3。

我试图在其菜单图像中找到来自oneplus 3T的whatsapp图像并成功找到。

但是,当我试图从不同屏幕尺寸的不同设备中找到一些子图像时,它不起作用。

有人可以帮忙吗。 下面是我正在使用的代码。

class MatchingDemo {
public Mat run(Mat img, Mat templ, String outFile, int match_method) {
    System.out.println("\nRunning Template Matching");

    // / 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
    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;
    }

    System.out.println("matchloc.x "+ matchLoc.x);
    System.out.println("templ.cols "+ templ.cols());
    System.out.println("matchloc.y "+ matchLoc.y);
    System.out.println("templ.rows "+ templ.rows());

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

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



    return img;
}

}

我从给定的快照中裁剪了模板图像,一切正常:

  • 新模板图片:

在此处输入图片说明

代码:

import cv2
import numpy as np


img_1 = cv2.imread("path/to/snapshot", 0)
img_rgb = cv2.imread("path/to/snapshot")
template_img = cv2.imread("path/to/template", 0)

h, w = template_img.shape

res = cv2.matchTemplate(img_1, template_img, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

cv2.rectangle(img_rgb, max_loc, (max_loc[0]+w, max_loc[1]+h), np.array([0, 0, 255]), 3)

cv2.imwrite("./debug.png", img_rgb)

输出:

在此处输入图片说明

注意: matchTemplate是一个非常基本的实现,为了获得更多尺度不变的结果,您可以尝试使用SIFT 功能

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM