这是我找到的链接 How do I find an image contained within an image
我在上面的链接中获得了代码。
这是我的代码
import re
import os
import time
import cv2
from cv2 import cv
METHOD = cv.CV_TM_SQDIFF_NORMED
ROOTDIR = 'GeneralIMG/'
# Load The Deck Img
LARGE_IMAGE = cv2.imread('deck.bmp')
for subdir, dirs, files in os.walk(ROOTDIR):
for myfile in files:
filepath = os.path.join(subdir, myfile)
# Read the images from the file
# small_image = cv2.imread(myfile)
# small_image = cv2.imread('GeneralIMG/cfrB.bmp')
Ffile = subdir + myfile
small_image = cv2.imread(Ffile)
result = cv2.matchTemplate(small_image, LARGE_IMAGE, METHOD)
# We want the minimum squared difference
mn,_,mnLoc,_ = cv2.minMaxLoc(result)
MPx,MPy = mnLoc
if MPx == 0 and MPy == 0:
print 'Match failure!'
else:
print MPx, MPy
print re.sub(r"B|D", "", os.path.splitext(myfile)[0])
# 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)
# time.sleep(5)
这是我想在大图中找到的小图片,但是大图片不包含小图片。令我惊讶的是,matchTemplate仍然得到了结果。
12~07_00-03-03.bmp http://7xpvdr.com1.z0.glb.clouddn.com/12~07_00-03-03.bmp
但我得到的比赛结果不够精确,如下图所示。 红色矩形是匹配结果。
12~07_00-01-58.bmp http://7xpvdr.com1.z0.glb.clouddn.com/12~07_00-01-58.bmp
在这里,我希望在大型照片中找到完全相同的照片。如果不包含它,只需返回false即可。我不想进行模糊搜索,我该怎么办?
---更新---
这是小img:
这是原始较大的bmp图像
上传图像时,格式将会改变。小img是png文件,较大的是bmp。
我想知道matchtemplate是否在这里使用模糊搜索。所以我在这里得到错误搜索结果的问题似乎是合理的。我想知道如何准确地进行搜索。谢谢〜
更新:
我查看了[matchtemplate]的文档
我发现这意味着它是最佳匹配搜索不完美匹配。
那我怎样才能让它完美匹配?
什么是模板匹配? 模板匹配是一种用于查找与模板图像(补丁)匹配(相似)的图像区域的技术。
答案 0 :(得分:1)
您是否尝试对minMaxLoc
给出的结果应用阈值?
我从未使用过matchTemplate
和minMaxLoc
,所以我不知道它是如何运作的,但据我所知,如果你想要的是一个完美的匹配,那么你的价值就是寻找可能是0(或1,取决于您的METHOD参数)。因此,如果你丢弃其他所有价值,除非你有完美的匹配,否则你不应该得到积极的结果。
答案 1 :(得分:0)
您可以使用 cv.matchTemplate 获得完美匹配: 使用方法 cv.TM_SQDIFF 和阈值 <= 1/16
结果的绝对值从数学上讲,所有具有完美匹配的补丁都应具有 0 的平方差异,而不是 [-0.0625,0.0625]。但是,在实际实现 cv.matchTemplate 中的优化导致了细微的差异(至少 OpenCV 4.5.1 中使用的函数 ippiSqrDistanceNorm 是针对 uint8 输入和 3x3 uint8 掩码所做的)
请注意,匹配是从左/上角开始进行比较,而不是从模板的中心开始,因此如果您想获得与模板完全相同的所有像素,则必须添加模板宽度一半的偏移量和身高。