[英]Image Template matching in android using openCV
我正在尝试制作一个自动化的 android 应用程序,它可以在另一个图像(主图像/更大图像)中找到一个图像(模板/子图像)。
菜单图片来自一加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.