java通过模板匹配html,OpenCV模板匹配

本文档详细介绍了如何使用OpenCV库在Java中执行模板匹配。通过匹配模板图像与源图像,寻找最佳匹配区域。内容涵盖了理论知识,如模板匹配的原理和工作方式,以及OpenCV提供的多种匹配方法。此外,还提供了C++、Java和Python的代码示例,展示如何应用这些方法并定位最佳匹配。
摘要由CSDN通过智能技术生成

目标

在本教程中,您将学习如何:使用OpenCV功能matchTemplate()来搜索图像补丁和输入图像之间的匹配

使用OpenCV函数minMaxLoc()来查找给定数组中的最大值和最小值(以及它们的位置)。

理论

什么是模板匹配?

模板匹配是一种用于查找与模板图像(补丁)匹配(类似)的图像区域的技术。

虽然补丁必须是一个矩形,可能并不是所有的矩形都是相关的。在这种情况下,可以使用掩模来隔离应该用于找到匹配的补丁部分。

它是如何工作的?我们需要两个主要组件:源图像(I):我们期望找到与模板图像匹配的图像

模板图像(T):将与模板图像进行比较的补丁图像

我们的目标是检测最匹配的区域:

37bef3e61bfbdadfa7d6530d78a63ddd.png要识别匹配区域,我们必须通过滑动来比较模板图像与源图像:

5f514c88be26dd9f0198b7d1d66a8ada.png通过滑动,我们的意思是一次移动补丁一个像素(从左到右,从上到下)。在每个位置,计算度量,以便它表示在该位置处的匹配的“好”还是“坏”(或者与图像的特定区域相似)。

对于T的每个位置超过I,则存储在该度量结果矩阵 R。R中的每个位置(x,y)都包含匹配度量

b072e7dbfff9ff2bc873b0a9502b98dd.png

上面的图片是一个度量tm_ccorr_normed滑动补丁结果R。最亮的位置表示最高匹配。如您所见,红色圆圈标记的位置可能是具有最高值的位置,因此这个位置(由点形成的矩形,角度和宽度和高度等于补丁图像)被认为是匹配。实际上,我们使用函数minMaxLoc()定位R矩阵中最高的值(或更低的取决于匹配方法的类型)

mask是如何工作的?如果匹配需要屏蔽,则需要三个组件:源图像(I):我们期望找到与模板图像匹配的图像

模板图像(T):将与模板图像进行比较的补丁图像

掩模图像(M):The mask,屏蔽模板的灰度图像目前只有两种匹配方法接受掩码:CV_TM_SQDIFF和CV_TM_CCORR_NORMED(有关opencv中可用的所有匹配方法的说明,请参见下文)。

The mask必须与模板尺寸相同

The mask应具有CV_8U或CV_32F深度和与模板图像相同数量的通道。在CV_8U情况下,The mask值被视为二进制,即零和非零。在CV_32F情况下,值应该落在[0..1]范围内,并且模板像素将乘以相应的The mask像素值。由于样本中的输入图像具有CV_8UC3类型,因此屏蔽也被读取为彩色图像。

cf71c8ba5e634957fbf097236b8d2b0e.png

OpenCV中可以使用哪些匹配方法?

OpenCV在函数matchTemplate()中实现模板匹配。可用的方法有以上6种:method=CV_TM_SQDIFF

68d36f987cbd41aca2d6f95f639a9428.pngmethod=CV_TM_SQDIFF_NORMED

ad0ee200af55c283f17baeb3edb72ed6.pngmethod=CV_TM_CCORR

b7de9705e04dfdf2c4407f360cdb73c9.pngmethod=CV_TM_CCORR_NORMED

fccd384d44c2435d51207837b97e5c8c.pngmethod=CV_TM_CCOEFF

2ab7c784281aaf70c3bcdcc4472272f1.png

where

f189b9e0af2ba079059f9bc9d2f32a29.png

method=CV_TM_CCOEFF_NORMED

4ae01c294c3747d90963037b44db0f9b.png

Code

C ++

这个程序是做什么的?加载输入图像,图像补丁(模板)和可选的mask

使用OpenCV函数matchTemplate()与之前描述的6种匹配方法中的任何一种执行模板匹配过程。用户可以通过在轨迹栏中输入其选择来选择该方法。如果提供了一个mask,它只会用于支持mask的方法

规范匹配过程的输出

以较高的匹配概率来定位位置

在与最高匹配相对应的区域周围绘制一个矩形可下载的代码:点击这里

代码一览:#include "opencv2/imgcodecs.hpp"

#include "opencv2/highgui.hpp"

#include "opencv2/imgproc.hpp"

#include

using namespace std;

using namespace cv;

bool use_mask;

Mat img; Mat templ; Mat mask; Mat result;

const char* image_window = "Source Image";

const char* result_window = "Result window";

int match_method;

int max_Trackbar = 5;

void MatchingMethod( int, void* );

int main( int argc, char** argv )

{

if (argc < 3)

{

cout << "Not enough parameters" << endl;

cout << "Usage:\n./MatchTemplate_Demo []" << endl;

return -1;

}

img = imread( argv[1], IMREAD_COLOR );

templ = imread( argv[2], IMREAD_COLOR );

if(argc > 3) {

use_mask = true;

mask = imread( argv[3], IMREAD_COLOR );

}

if(img.empty() || templ.empty() || (use_mask && mask.empty()))

{

cout << "Can't read one of the images" << endl;

return -1;

}

namedWindow( image_window, WINDOW_AUTOSIZE );

na

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java OpenCV中的模板匹配可以使用`TemplateMatching`类来实现。以下是一个简单的示例代码: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import org.opencv.core.Core.MinMaxLocResult; public class TemplateMatchingExample { public static void main(String[] args) { // Load the input image and template Mat img = Imgcodecs.imread("input.jpg"); Mat templ = Imgcodecs.imread("template.jpg"); // Create the result matrix Mat result = new Mat(); int result_cols = img.cols() - templ.cols() + 1; int result_rows = img.rows() - templ.rows() + 1; result.create(result_rows, result_cols, CvType.CV_32FC1); // Perform template matching Imgproc.matchTemplate(img, templ, result, Imgproc.TM_CCOEFF_NORMED); // Find the minimum and maximum values and their locations MinMaxLocResult mmr = Core.minMaxLoc(result); Point maxLoc = mmr.maxLoc; // Draw a rectangle around the matched area Imgproc.rectangle(img, maxLoc, new Point(maxLoc.x + templ.cols(), maxLoc.y + templ.rows()), new Scalar(0, 0, 255), 2); // Save the output image Imgcodecs.imwrite("output.jpg", img); } } ``` 在这个示例中,我们首先加载输入图像和模板,然后创建一个用于存储匹配结果的矩阵。我们使用`Imgproc.matchTemplate`函数对输入图像和模板进行匹配,并将结果存储在结果矩阵中。然后,我们使用`Core.minMaxLoc`函数查找结果矩阵中的最小值和最大值及其位置。最后,我们在输入图像中绘制一个矩形框来标记匹配的区域,并将输出图像保存到磁盘上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值