gpt4 book ai didi

python - 如何检测一个图像是否在另一个图像中?

转载 作者:行者123 更新时间:2023-12-05 09:32:41 25 4
gpt4 key购买 nike

我正在尝试检测一幅图像是否与另一幅图像 100% 匹配,然后将变量设置为 True(如果是)。但是除了给出此代码的一个特定线程之外,我阅读的所有内容几乎没有结果。

import cv2

method = cv2.TM_SQDIFF_NORMED

# Read the images from the file
small_image = cv2.imread('ran_away.png')
large_image = cv2.imread('pokemon_card.png')

result = cv2.matchTemplate(small_image, large_image, method)

# We want the minimum squared difference
mn,_,mnLoc,_ = cv2.minMaxLoc(result)

# Draw the rectangle:
# Extract the coordinates of our best match
MPx,MPy = mnLoc

# Step 2: Get the size of the template. This is the same size as the match.
trows,tcols = small_image.shape[:2]

# Step 3: Draw the rectangle on large_image
cv2.rectangle(large_image, (MPx,MPy),(MPx+tcols,MPy+trows),(0,0,255),2)

# Display the original image with the rectangle around the match.
cv2.imshow('output',large_image)

# The image is only displayed if we call this
cv2.waitKey(0)

然而,这会打开一个输出,并且会做一些我不想做的事情。我想要做的就是检测图像是否在图像中,如果是,则将其打印到控制台。在我的特殊情况下,我试图检测这张图片是否

Ran_away.png

在这张图片里

Pokemon_card.png

如果是,打印到控制台,说明小 Sprite 已经跑掉了。

最佳答案

您的代码显示了基本的模板匹配。请通过一些工作 tutorial关于该主题,以及关于 cv2.matchTemplate 的文档,尤其要了解不同的template match modes .

我只能想到以下解决方案来完成您的任务:不要使用 TM_SQDIFF_NORMED,而是使用 TM_SQDIFF,这样您就可以在 结果中获得绝对值 而不是相对值:

  • 对于 TM_SQDIFF_NORMED,最佳匹配始终是接近 0.0 的某个值,即使匹配不正确也是如此。
  • 对于 TM_SQDIFF,一些接近 0.0 的值表示实际正确匹配。

现在,只需编写一个方法,进行模板匹配,并检测 result 的最小值是否低于 0.0 附近的某个阈值,假设10e-6。如果是,打印出你想要的任何东西,如果不是,做其他事情:

import cv2


def is_template_in_image(img, templ):

# Template matching using TM_SQDIFF: Perfect match => minimum value around 0.0
result = cv2.matchTemplate(img, templ, cv2.TM_SQDIFF)

# Get value of best match, i.e. the minimum value
min_val = cv2.minMaxLoc(result)[0]

# Set up threshold for a "sufficient" match
thr = 10e-6

return min_val <= thr


# Read template
template = cv2.imread('ran_away.png')

# Collect image file names
images = ['pokemon_card.png', 'some_other_image.png']

for image in images:
if is_template_in_image(cv2.imread(image), template):
print('{}: {}'.format(image, 'Pokemon has ran away.'))
else:
print('{}: {}'.format(image, 'Nothing to see here.'))

输出:

pokemon_card.png: Pokemon has ran away.
some_other_image.png: Nothing to see here.
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.19041-SP0
Python: 3.9.1
PyCharm: 2021.1.1
OpenCV: 4.5.2
----------------------------------------

关于python - 如何检测一个图像是否在另一个图像中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67826760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com