查找图像包含另一个图像

Posted

技术标签:

【中文标题】查找图像包含另一个图像【英文标题】:Find image contain another image 【发布时间】:2020-04-27 07:35:00 【问题描述】:

我尝试使用 matchTemplate() 函数和 minMaxLoc() 函数在另一个图像中查找位置图像,但它不起作用,因为容器图像与我找到的图像角度不同。

这是我对原始图像所做的,它与 matchTemplate() 函数和 minMaxLoc() 一起工作正常。但是如果我旋转图像。什么都认不出来。

这是我用来识别硬币的代码:

img_rgb = cv.imread('mario.png')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray,template,cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv.imwrite('res.png',img_rgb)

我的图片旋转了 30 度:

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

您似乎正在尝试this example。 matchTemplate() 有一些缺点。其中之一是旋转问题。这些动态功能可以使用其他技术,如SIFT 或SURF。

但如果你真的想继续模板匹配,你应该努力。您可以生成源图像的所有可能旋转,并且可以尝试对所有图像进行模板匹配。这是一种粗暴的方式,但可以工作。

您也可以查看this one和this one

祝你好运!!!

【讨论】:

仍然从示例中得到错误,但看起来很有希望。我复制了示例,但运行时出现此错误:(-5:Bad argument)输入数组应该是函数“findHomography”中的 2D 或 3D 点集【参考方案2】:

由于旋转,匹配值会大大降低。 为 cv.matchTemplate 使用较低的阈值。

或者如果你之前知道旋转度数,旋转模板(mario_coin.png)并进行模板匹配。

【讨论】:

【参考方案3】:

尝试不同的方式。

例如,您可以计算 360 个模板,每个模板将硬币旋转 1 度。在遍历 360 模板的同时进行匹配并找到最佳匹配。

整个过程,硬币模板的旋转和匹配,当然要多花 360 倍的时间,但我认为你应该找到位置。

【讨论】:

我认为匹配 1 个硬币需要很长时间。但是谢谢你的想法

以上是关于查找图像包含另一个图像的主要内容,如果未能解决你的问题,请参考以下文章

在图像上查找透明像素并使相同像素在另一个图像上透明

python 脚本尝试查找具有相同尺寸的图像并将其移动到另一个目录。

查找子图像宽度并将其应用于包含父 div jquery

如何使用 OpenCV 和 SIFT 查找我的训练图像的多个实例

在给定图像边界的情况下查找填充区域

在图像上查找主色