单独保存模板匹配 OpenCV Python
Posted
技术标签:
【中文标题】单独保存模板匹配 OpenCV Python【英文标题】:Saving Template Matches Individually OpenCV Python 【发布时间】:2019-09-16 02:47:04 【问题描述】:使用 cv2.matchTemplate 我正在使用参考图像 (stampRef.jpg) 并在更大的图像 (stamps) 中查找多个匹配项。我想将每个找到的匹配项保存为他们自己的图像。旋转对我来说很重要,但不是规模。我担心由于重叠匹配,它可能会多次保存同一张图像。我不想要这个。我只想要每个独特匹配的 1 张图片。我只是不确定如何首先保存它们。任何帮助都会很棒,谢谢。
*更新,我找到了一种方法来通过使用掩码减少找到的重叠匹配的数量,所以现在我需要单独保存这些匹配。我已经更新了代码。
import cv2
import numpy as np
img = cv2.imread("stamps.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread('stampRef.jpg',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
#Counts the number of found matches, which are currently overlapping
number = np.sum(res >= threshold)
print(number)
count = 0
mask = np.zeros(img.shape[:2], np.uint8)
for pt in zip(*loc[::-1]):
if mask[pt[1] + h//2, pt[0] + w//2] != 255:
mask[pt[1]:pt[1]+h, pt[0]:pt[0]+w] = 255
count += 1
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,0), 3)
print ("Number of found matches:", count)
small = cv2.resize(img, (0,0), fx=0.3, fy=0.3)
cv2.imshow('Matches',small)
cv2.waitKey(0) & 0xFF== ord('q')
cv2.destroyAllWindows()
【问题讨论】:
【参考方案1】:此答案解释了如何将每个匹配项保存为单独的图像。您已经通过找到匹配的坐标完成了艰苦的工作。您可以使用这些坐标裁剪匹配并将其保存为 .png:
roi = img[pt[1]:pt[1]+h, pt[0]:pt[0]+w]
cv2.imwrite(+ str(count) + '.png', roi)
这段代码应该进入遍历匹配的循环中:
count = 0
mask = np.zeros(img.shape[:2], np.uint8)
for pt in zip(*loc[::-1]):
if mask[pt[1] + h//2, pt[0] + w//2] != 255:
mask[pt[1]:pt[1]+h, pt[0]:pt[0]+w] = 255
count += 1
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,0), 3)
roi = img[pt[1]:pt[1]+h, pt[0]:pt[0]+w]
cv2.imwrite(+ str(count) + '.png', roi)
cv2.imshow('roi', roi)
cv2.waitKey()
【讨论】:
以上是关于单独保存模板匹配 OpenCV Python的主要内容,如果未能解决你的问题,请参考以下文章