使用Python和OpenCV为多个匹配设置匹配容差
我试图在一个较大的图像中找到所有出现的较小图像。有没有一种方法可以设置比赛的容忍度,这样我就可以匹配所有至少90%匹配或类似的东西 这是我现在的代码:使用Python和OpenCV为多个匹配设置匹配容差,python,image,opencv,Python,Image,Opencv,我试图在一个较大的图像中找到所有出现的较小图像。有没有一种方法可以设置比赛的容忍度,这样我就可以匹配所有至少90%匹配或类似的东西 这是我现在的代码: import cv2 from cv2 import cv import numpy as np method = cv.CV_TM_SQDIFF_NORMED small_image = cv2.imread('small_image.jpg') large_image = cv2.imread('large_image.jpg') he
import cv2
from cv2 import cv
import numpy as np
method = cv.CV_TM_SQDIFF_NORMED
small_image = cv2.imread('small_image.jpg')
large_image = cv2.imread('large_image.jpg')
height,width = small_image.shape[:2]
result = cv2.matchTemplate(large_image, small_image, method)
result2 = np.reshape(result, result.shape[0]*result.shape[1])
sort = np.argsort(result2)
for i in range(50):
(y1, x1) = np.unravel_index(sort[i], result.shape)
x2 = x1 + width
y2 = y1 + height
print '%s: (%s, %s) to (%s, %s)' % (i, x1, y1, x2, y2)
cv2.rectangle(large_image, (x1-3,y1-3), (x2+3,y2+3), (0,255,255), 2)
cv2.imshow('output',large_image)
cv2.waitKey(0)
函数完成比较后,可以使用minMaxLoc()函数将最佳匹配作为全局最小值(使用CV_TM_SQDIFF时)或最大值(使用CV_TM_CCORR或CV_TM_cceeff时)
您可以使用minMaxLoc()
为您执行此阈值设置
-关键点如下:
minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
/// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )
{ matchLoc = minLoc; }
else
{ matchLoc = maxLoc; }
编辑:来自评论:
您给出的解决方案似乎只提供单个匹配项。问题是我需要能够为多个匹配设置容差。我错过什么了吗 就像我说的,你需要用这个值作为阈值。本教程向您展示了如何使用该阈值来匹配多次出现的
它使用minMaxLoc,然后填充图像,然后重复。这会返回多个匹配项吗?您给出的解决方案似乎只提供单个匹配项。问题是我需要能够为多个匹配设置容差。我错过什么了吗?对不起。我相信,对于真正熟悉Python和/或OpenCV的人来说,这很有意义。这两个对我来说都是新鲜事。从这个和教程中,我仍然看不到我设置了阈值或拉多个结果。这对于Python来说不起作用,那些是C++参数。