java - 如何调整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);
}
解决方案
使用规范匹配方法确保您的匹配值为 [0..1]。
替换此行
Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());
与阈值操作。否则,0.9 的最佳匹配将通过第二次归一化变为 1,您将丢失实际匹配“质量”信息。
规范化模板匹配的结果将始终导致您的最佳匹配为 1,从而无法丢弃错误匹配。
推荐阅读
- java - jOOQ 内置方法生成具有完全限定的“列”名称的不确定查询
- r - 许多具有相同类别的变量的水平表
- node.js - 从 New Relic APM 事务摘要仪表板隐藏招摇的中间件事务条目
- c++ - 将 alignas(16) 用于 m128 的数组 [8] 是否正确?
- r - 通过映射数据列和模式行来创建列表列
- python - 从 tar.gz 文件安装 PyQt5.15.4
- r - 使用其他两个列条件过滤重复数据
- python - 多处理代码运行速度比单线程代码慢得多
- c# - WebApi:放置列表
变量正确地转换为对象类型的属性 - php - 没有从 HTTP 版本重定向或规范到 HTTPS 主页