Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python和OpenCV为多个匹配设置匹配容差_Python_Image_Opencv - Fatal编程技术网

使用Python和OpenCV为多个匹配设置匹配容差

使用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

我试图在一个较大的图像中找到所有出现的较小图像。有没有一种方法可以设置比赛的容忍度,这样我就可以匹配所有至少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')

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++参数。