义乌网站推广,网站建设分前端和后台吗,商品网站怎么做的,南京百度seo理论
模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此#xff0c;OpenCV 带有一个函数 cv.matchTemplate#xff08;#xff09; 。它只是在输入图像上滑动模板图像#xff08;如在 2D 卷积中#xff09;#xff0c;并比较模板图像下的模板和输入图像的补…理论
模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此OpenCV 带有一个函数 cv.matchTemplate 。它只是在输入图像上滑动模板图像如在 2D 卷积中并比较模板图像下的模板和输入图像的补丁。在 OpenCV 中实现了几种比较方法。它返回一个灰度图像其中每个像素表示该像素的邻域与模板匹配的程度。
如果输入图像的大小WxH且模板图像的大小wxh则输出图像的大小为W-w 1H-h 1。得到结果后可以使用 cv.minMaxLoc 函数查找最大/最小值的位置。将其作为矩形的左上角取wh作为矩形的宽度和高度。那个矩形是你的模板区域。
如果你使用cv.TM_SQDIFF函数作为比较的方法, 最小值作为匹配值。
OpenCV 中的模板匹配
在这里作为一个例子我们将在梅西的照片中搜索他的面部因此我创建了一个如下的模板 我们将尝试所有的比较方法看看它们的结果如何
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img cv.imread(messi5.jpg,0)
img2 img.copy()
template cv.imread(template.jpg,0)
w, h template.shape[::-1]
# All the 6 methods for comparison in a list
methods [cv.TM_CCOEFF, cv.TM_CCOEFF_NORMED, cv.TM_CCORR,cv.TM_CCORR_NORMED, cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]
for meth in methods:img img2.copy()method eval(meth)# Apply template Matchingres cv.matchTemplate(img,template,method)min_val, max_val, min_loc, max_loc cv.minMaxLoc(res)# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimumif method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:top_left min_locelse:top_left max_locbottom_right (top_left[0] w, top_left[1] h)cv.rectangle(img,top_left, bottom_right, 255, 2)plt.subplot(121),plt.imshow(res,cmap gray)plt.title(Matching Result), plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(img,cmap gray)plt.title(Detected Point), plt.xticks([]), plt.yticks([])plt.suptitle(meth)plt.show()请参阅以下结果
cv.TM_CCOEFF cv.TM_CCOEFF_NORMED cv.TM_CCORR cv.TM_CCORR_NORMED cv.TM_SQDIFF cv.TM_SQDIFF_NORMED 你可以看到使用 **cv.TM_CCORR**的结果并不像我们预期的那样好。
模板与多个对象匹配
在上一节中我们搜索了梅西的脸部图像该图像仅在图中出现一次。假设您正在搜索的对象在图中出现了多次 cv.minMaxLoc 将不会为你提供所有的匹配点。在这种情况下我们将使用阈值。所以在这个例子中我们将使用着名游戏 Mario 的截图并在其中找到硬币。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb cv.imread(mario.png)
img_gray cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template cv.imread(mario_coin.png,0)
w, h template.shape[::-1]
res cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
threshold 0.8
loc np.where( res threshold)
for pt in zip(*loc[::-1]):cv.rectangle(img_rgb, pt, (pt[0] w, pt[1] h), (0,0,255), 2)
cv.imwrite(res.png,img_rgb)结果 apachecn.github.io/opencv-doc-zh/#/