# 使用模板进行对象检测

> 原文： [https://pythonspot.com/object-detection-with-templates/](https://pythonspot.com/object-detection-with-templates/)

**模板匹配**是一种用于查找与补丁（模板）相似的图像区域的技术。
它的应用可以是[机器人](https://pythonspot.com/robotics)或制造业。

## 简介

补丁是具有某些功能的小图像。 模板匹配的目的是在图像中找到补丁/模板。

![template matching opencv](img/3d85797cd44b2c4b3348bfd4fc8a7795.jpg) 

与 OpenCV 和 Python 匹配的模板。 模板（左），结果图像（右）

[下载代码](https://pythonspot.com/download-vision-examples/)

要找到它们，我们都需要：

*   **源图像（S）**：在其中查找匹配项的空间

*   **模板图像（T）**：模板图像

模板图像`T`在源图像`S`上滑动（在源图像上移动），并且程序尝试使用统计信息查找匹配项。

## 模板匹配示例

让我们看一下代码：

```py
import numpy as np
import cv2

image = cv2.imread('photo.jpg')
template = cv2.imread('template.jpg')

# resize images
image = cv2.resize(image, (0,0), fx=0.5, fy=0.5)
template = cv2.resize(template, (0,0), fx=0.5, fy=0.5)

# Convert to grayscale
imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

# Find template
result = cv2.matchTemplate(imageGray,templateGray, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
top_left = max_loc
h,w = templateGray.shape
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(image,top_left, bottom_right,(0,0,255),4)

# Show result
cv2.imshow("Template", template)
cv2.imshow("Result", image)

cv2.moveWindow("Template", 10, 50);
cv2.moveWindow("Result", 150, 50);

cv2.waitKey(0)

```

## 说明

首先，我们使用`imread()`加载源图像和模板图像。我们调整它们的大小并将其转换为灰度以便更快地进行检测：

```py

image = cv2.imread('photo.jpg')
template = cv2.imread('template.jpg')
image = cv2.resize(image, (0,0), fx=0.5, fy=0.5)
template = cv2.resize(template, (0,0), fx=0.5, fy=0.5)
imageGray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
templateGray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)

```

我们使用 **cv2.matchTemplate** （图像，模板，方法）方法查找图像中最相似的区域。 第三个参数是[统计方法](https://docs.opencv.org/modules/imgproc/doc/object_detection.html?highlight=matchtemplate#matchtemplate)。

![Template Matching](img/671697da89293504fef04cfadad29c6b.jpg)

为您的应用选择正确的统计方法。`TM_CCOEFF`（右），`TM_SQDIFF`（左）

此方法具有六个匹配方法：CV_TM_SQDIFF，CV_TM_SQDIFF_NORMED，CV_TM_CCORR，CV_TM_CCORR_NORMED，CV_TM_CCOEFF 和 CV_TM_CCOEFF_NORMED。
这是完全不同的[统计比较方法](https://docs.opencv.org/modules/imgproc/doc/object_detection.html?highlight=matchtemplate#matchtemplate)

最后，我们获得矩形变量并显示图像。

## 局限性

模板匹配不是比例不变的，也不是旋转不变的。 这是一种非常基本和直接的方法，可在其中找到最相关的区域。 因此，这种对象检测方法取决于您要构建的应用程序的类型。 对于非比例和旋转变化的输入，此方法效果很好。

您可能会喜欢：[机器人技术](https://pythonspot.com/robotics)或[具有级联](https://pythonspot.com/car-tracking-with-cascades/)的汽车跟踪。

[下载计算机视觉示例+课程](https://pythonspot.com/download-vision-examples/)