查找图像包含另一个图像
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 脚本尝试查找具有相同尺寸的图像并将其移动到另一个目录。