OpenCV-Python Tutorials(4.0.0)
OpenCV-Python Tutorials官方英文教程GitHub:中文翻译 如果对你有帮助, 请在GitHub上Star该项目, 转载请注明出处。
目标:
- 使用模板匹配查找图像中的对象
- 函数:
cv.matchTemplate()
,cv.minMaxLoc()
理论
模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV附带了一个函数cv.matchTemplate()
。它只是在输入图像上滑动模板图像(如在2D卷积中),并比较模板图像下的输入图像的模板和补丁。在OpenCV中实现了几种比较方法。 (你可以查看文档以获取更多详细信息)。它返回一个灰度图像,其中每个像素表示该像素的邻域与模板匹配的程度。
如果输入图像的大小(WxH)且模板图像的大小(wxh),则输出图像的大小为(W-w + 1,H-h + 1)。获得结果后,可以使用cv.minMaxLoc()
函数查找最大/最小值的位置。将其作为矩形的左上角,并将(w,h)作为矩形的宽度和高度。那个矩形是你的模板区域。
注意:如果你使用cv.TM_SQDIFF作为比较方法,则最小值会给出最佳匹配。
OpenCV中的模板匹配
在这里,作为一个例子,我们将在他的照片中搜索梅西的脸。所以我创建了一个模板如下:
我们将尝试所有比较方法,以便我们可以看到它们的结果如何:
请参阅以下结果:
- cv.TM_CCOEFF
- cv.TM_CCOEFF_NORMED
- cv.TM_CCORR
- cv.TM_CCOEFF_NORMED
- cv.TM_SQDIFF
- cv.TM_SQDIFF_NORMED
你可以看到使用cv.TM_CCORR的结果不如我们预期的那样好。
与多个对象匹配的模板
在上一节中,我们搜索了梅西的脸的图像,在图像中只出现了一次。假设您正在搜索一个多次出现的对象,cv.minMaxLoc()不会给出所有的位置。在这种情况下,我们将使用阈值化。在这个例子中,我们将使用著名游戏马里奥的截图,我们将在其中找到硬币。
窗口将如下图显示: