OpenCV Template Matching-pyimagesearch

https://pyimagesearch.com/2021/03/22/opencv-template-matching-cv2-matchtemplate/
OpenCV Template Matching ( cv2.matchTemplate )

在源图像中找到模板,我们将模板从左到右、从上到下在源中滑动。在每个(x,y)位置,计算一个度量来表示匹配的“好”或“坏”程度。通常,我们使用归一化相关系数来确定两个补丁的像素强度的“相似”程度。
对I上每个位置T,计算的结果度量存储在我们的结果矩阵R中。源图像中的每个(x,y)坐标(对于模板图像也具有有效的宽度和高度)都包含结果矩阵R的一个条目。R的大小与原始模板的大小不同。这是因为要计算相关性,整个模板必须适合源图像内部。在这里,我们可以可视化覆盖在原始图像上的结果矩阵R。

result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
# The input image that contains the object we want to detect
# The template of the object (i.e., what we want to detect in the image)
# The template matching method

The output result from cv2.matchTemplate is a matrix with spatial dimensions:–输出空间维度矩阵

Width: image.shape[1] - template.shape[1] + 1
Height: image.shape[0] - template.shape[0] + 1

在结果中找到具有最大相关系数的位置,该位置对应于可以在其中找到模板的最有可能的区域。

如果你想只检测输入图像特定区域内的对象,你可以提供一个mask

result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED, mask)

mask:必须与模版相同的空间维度和数据类型,对不希望输入的图像区域,mask设置为0;要搜索的图像区域,mask设置为255

图像和模版转换为灰度图–>调用cv2.matchTemplate–>结果矩阵找最佳匹配cv2.minMaxLoc得maxLoc–>由该点画矩形框
一旦应用了cv2.matchTemplate,我们就会收到一个具有以下空间维度的结果矩阵:
Width: image.shape[1] - template.shape[1] + 1
Height: image.shape[0] - template.shape[0] + 1
为了找到有最大值(最佳匹配)maxLoc的位置,调用cv2.minMaxLoc传入结果矩阵。

print("[INFO] performing template matching...")
result = cv2.matchTemplate(imageGray, templateGray,
	cv2.TM_CCOEFF_NORMED)
# input image; template image; matching method
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(result)
#目标:maxLoc

将模板宽度和高度分别添加到startX和endX坐标

# 找矩形
(startX, startY) = maxLoc
endX = startX + template.shape[1]
endY = startY + template.shape[0]


# draw the bounding box on the image
cv2.rectangle(image, (startX, startY), (endX, endY), (255, 0, 0), 3)
# show the output image
cv2.imshow("Output", image)
cv2.waitKey(0)

ps:

  1. 模版匹配对旋转、视角和比例的变化非常敏感
  2. cv2.matchTemplate函数本身无法检测多个对象
  3. cv2.matchTemplate函数真的不知道对象是否被正确找到——它只是在输入图像上滑动模板图像,计算归一化的相关分数,然后返回分数最大的位置。,

你可能感兴趣的:(opencv,opencv,计算机视觉,人工智能)