Opencv matchTemplate 和 np.where():仅保留唯一值

2024-05-07

带有马里奥硬币的 opencv 教程 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html我留下了将小图像检测到大图像中的点列表。然而,在同一对象周围的多个区域为正的意义上,存在大量“重复”。

我想通过一个从元组列表中删除冗余元素的函数来删除这些“重复项”:

如果这个新函数的“margin”参数是 10 像素,那么元组(522, 114) and (523, 114)被认为是重复的,因为abs(522-523)<10 and abs(114-114)<10.

这将使我能够根据结果列表的长度来计算唯一检测到的对象。

根据这些数据,预期结果是[(522, 114),(191, 178)]。我怎样才能写出这样的函数呢?

npwhere = [(522, 114),
    (523, 114),
    (524, 114),
    (522, 115),
    (523, 115),
    (524, 115),
    (522, 116),
    (523, 116),
    (524, 116),
    (523, 117),
    (191, 178),
    (192, 178),
    (193, 178)]

关于我正在使用的代码的更多信息(可能与这个问题无关)

   result = cv2.matchTemplate(targetimg, templateimg, cv2.TM_CCOEFF_NORMED)
    loc = np.where( result >= threshold)
    for pt in zip(*loc[::-1]):
        print(pt)
        cv2.rectangle(scr, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

这是 Python/OpenCV 中提供的多模板匹配的替代方法https://www.pyimagesearch.com/2021/03/29/multi-template-matching-with-opencv/ https://www.pyimagesearch.com/2021/03/29/multi-template-matching-with-opencv/。我借用了那个例子中的图像。

我的方法简单地包括迭代峰值抑制(通过屏蔽模板匹配相关图像),直到匹配值达到阈值或实现给定数量的匹配。我将最大匹配数设置为 10,将匹配值的停止阈值设置为 0.95(1 个为完美匹配)。我还将遮罩区域的半径设置为模板最大尺寸的 1/4。

Input:

模板:

import cv2
import numpy as np

# read image
img = cv2.imread('8diamond.png')

# read template
tmplt = cv2.imread('1diamond.png')
hh, ww, cc = tmplt.shape

# set arguments
match_thresh = 0.95               # stopping threshold for match value
num_matches = 10                  # stopping threshold for number of matches
match_radius = max(hh,ww)//4      # approx radius of match peaks

# get correlation surface from template matching
corrimg = cv2.matchTemplate(img,tmplt,cv2.TM_CCORR_NORMED)
hc, wc = corrimg.shape

# get locations of all peaks higher than match_thresh for up to num_matches
imgcopy = img.copy()
corrcopy = corrimg.copy()
for i in range(1, num_matches):
    # get max value and location of max
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(corrcopy)
    x1 = max_loc[0]
    y1 = max_loc[1]
    x2 = x1 + ww
    y2 = y1 + hh
    loc = str(x1) + "," + str(y1)
    if max_val > match_thresh:
        print("match number:", i, "match value:", max_val, "match x,y:", loc)
        # draw draw blue bounding box to define match location
        cv2.rectangle(imgcopy, (x1,y1), (x2,y2), (255,0,0), 2)
        # draw black filled circle over copy of corrimg 
        cv2.circle(corrcopy, (x1,y1), match_radius, 0, -1)
        i = i + 1
    else:
        break
    
# save results
# power of 4 exaggeration of correlation image to emphasize peaks
cv2.imwrite('8diamond_multi_template_corr.png', (255*cv2.pow(corrimg,4)).clip(0,255).astype(np.uint8))
cv2.imwrite('8diamond_multi_template_corr_masked.png', (255*cv2.pow(corrcopy,4)).clip(0,255).astype(np.uint8))
cv2.imwrite('8diamond_multi_template_match.png', imgcopy)


# show results
# power of 4 exaggeration of correlation image to emphasize peaks
cv2.imshow('image', img)
cv2.imshow('template', tmplt)
cv2.imshow('corr', cv2.pow(corrimg,4))
cv2.imshow('corr masked', cv2.pow(corrcopy,4))
cv2.imshow('result', imgcopy)
cv2.waitKey(0)
cv2.destroyAllWindows()

模板匹配的相关图像:

显示屏蔽区域的最终屏蔽相关图像:

输入的结果匹配:

文本输出:

match number: 1 match value: 0.9954221844673157 match x,y: 70,84
match number: 2 match value: 0.9926357865333557 match x,y: 112,132
match number: 3 match value: 0.9903871417045593 match x,y: 157,89
match number: 4 match value: 0.9901180267333984 match x,y: 67,173
match number: 5 match value: 0.9888120889663696 match x,y: 63,261
match number: 6 match value: 0.9862607717514038 match x,y: 108,219
match number: 7 match value: 0.9856082797050476 match x,y: 152,178
match number: 8 match value: 0.9837512969970703 match x,y: 146,261
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv matchTemplate 和 np.where():仅保留唯一值 的相关文章

随机推荐

  • Clang 格式将 if 语句体拆分为多行

    我有以下 cpp 文件 void call long function name bool void sf bool int main bool test true if test call function name test if te
  • 具有多个等待组的管道中通道范围内的死锁

    我正在练习通过同时将计算分为 100 组来计算阶乘的挑战 我解决了 WaitGroups 上的很多问题 但仍然处于calculateFactorial函数我在通道部分的范围上陷入了僵局 希望有人能指出这个问题 谢谢 package main
  • 使用链接进行电子邮件验证是一个坏主意

    在我的注册过程中 用户注册后 他们会收到通过电子邮件发送的验证链接 如果他们单击该链接 那么他们的帐户才会得到验证 但这种验证方法对于机器人来说是不是太容易了 我认为电子邮件可以由机器人创建 但可以肯定的是 如果验证只是单击链接 那么它也可
  • AWS Serverless Lambda + Angular - TypeError:express 不是函数

    该应用程序在 localhost 4200 中运行良好 但是 当我通过无服务器 Lambda 迁移到 AWS 时 我在 cloudwatch 日志中收到此错误 我想正因为如此我得到了500 message Internal server e
  • 如何在 ADO.NET 对象上调用 Dispose?

    实现的数据库访问类IDbConnection IDbCommand and IDataReader全部实施IDisposable 但显然 Command 和 Reader 依赖于 Connection 我的问题是 我是否必须单独对每个对象进
  • NLTK 中的 wordnet lemmatizer 不适用于副词 [重复]

    这个问题在这里已经有答案了 from nltk stem import WordNetLemmatizer x WordNetLemmatizer x lemmatize angrily pos r Out 41 angrily 这是 nl
  • 去掉尾随零和小数点

    使用 Lua 我将数字格式化为可变位数并去掉尾随零 小数点 例如 string format precision f value gsub 0 1 gsub 值的类型为数字 正数 负数 整数 小数 所以任务已经解决了 但出于美学 教育和性能
  • C# 访问冲突异常

    这是我的代码抛出异常 它今天随机开始 这是照片 这是整个页面代码和错误异常 public frmWFDocumentDetail InitializeComponent NavigationInTransition navigateInTr
  • 如何查找依赖于Python中特定模块的模块列表

    为了减少基于 Python 的 Web 应用程序的开发时间 我尝试对我最近修改的模块使用 reload reload 通过一个专用网页 Web 应用程序的开发版本的一部分 进行 该网页列出了最近修改的模块 并且 py 文件的修改时间戳晚于相
  • 如何在 Android Studio 中立即获取 LivaData 的值?

    savedRecordFileName是一个变量LivaData
  • 默认启动器图标大小应该是多少

    我参考了文档http developer android com guide practices ui guidelines icon design html icon sets http developer android com gui
  • 自定义 OpenLayers 控件

    如何轻松自定义 OpenLayers 地图控件 或者至少 如何最小化控件的高度 谢谢 附言 有 CSS 覆盖吗 您可以对任何 openLayers 控件进行子类化 我刚刚通过对 PanZoomBar panZoomBar js 进行子类化
  • 如何为多个 Android 商店支持我的 Android 应用程序?

    我最近开始在 Google Android Market 上销售我的 Android 应用程序 并实施他们的应用程序许可方案以防止未经授权使用我的应用程序 我现在正计划将其发布到 Amazon Android 应用商店 并且想知道维护我的应
  • C# 资源文件中的 Tab 键切换

    如何向字符串资源添加制表符 t text 不起作用 您必须显式添加制表符 最简单的方法可能是在记事本中键入字符串 显式设置制表符而不是使用转义字符 并将文本复制并粘贴到资源编辑器中 对于换行符 您也会遇到类似的问题 添加换行符的最简单方法是
  • 如何在ios中重置触摸、触摸移动的NSTimer

    我正在开发一个应用程序 其中我必须在 3 秒后隐藏控制按钮 所以我使用 NSTimer 编写代码 然后开始触摸 它可以工作 但问题是 当我再次触摸任何其他按钮时 我的计时器不会重置 即使我像拖动一样移动我的触摸示例 如果我拖动或移动触摸 它
  • 更改 RMarkdown 中的块背景颜色

    我希望某个代码块以不同的颜色 例如红色 突出显示 以表明这是不好的做法 如果我使用的是 Rnw 我可以添加块选项background red 并得到我想要的 但这似乎不起作用 Rmd 我的猜测是 我需要制作一个自定义 css 样式表 尽管我
  • 使用 javascript/jQuery 更改类的背景颜色属性

    这似乎是一个简单的问题 但没有任何解决办法 我正在尝试使用 javascript jQuery 动态更改某些文本的背景颜色 从白色或粉色到绿色 但由于某种原因它不起作用 文本使用名为 novice 的 CSS 类进行样式设置 这是CSS 这
  • 如何将 ng-repeat 与图像映射区域标签一起使用?

    我正在尝试使用 AngularJS 创建可点击的汽车配置文件 一旦我将区域标签属性移动到 auto parts json 并将它们与 ng repeat 中的适当属性绑定 那么它就无法工作 如何修复它 请在全页预览中测试元素 var app
  • 在设计电子邮件主题中添加动态价值

    好吧 我看过很多关于自定义设计电子邮件主题的讨论 但似乎没有一个能解决我想要的问题 目前我的确认电子邮件主题为 确认您的 Qitch com 帐户 我想自定义此电子邮件主题并在其中添加用户名的动态值 这样如果用户ALEX注册一个帐户 他应该
  • Opencv matchTemplate 和 np.where():仅保留唯一值

    继带有马里奥硬币的 opencv 教程 https opencv python tutroals readthedocs io en latest py tutorials py imgproc py template matching p