OpenCV如何用模版匹配多个对象

22人浏览 / 0人评论 / 添加收藏

在上一讲中,我们讲解了用OpenCV匹配单个图像对象,今天小编就来讲讲如何匹配多个图像对象。

核心原理就是把所有的相似图片对象都找出来,然后循环遍历标记出来。

我们直接上代码:

#匹配多个对象
import cv2
import numpy as np
import matplotlib.pyplot as plt
from opencv_jupyter_ui import cv2_imshow
from utils import plt_showimg

mario = cv2.imread('./images/mario.png')
mario_gray = cv2.cvtColor(mario, cv2.COLOR_BGR2GRAY)
template = cv2.imread('./images/mario_coin.png', 0)#0表示灰度图
w,h = template.shape[1], template.shape[0]
print(w,h)

res = cv2.matchTemplate(mario_gray, template, cv2.TM_CCOEFF_NORMED)

#设置阈值,认为相关系数大于0.8,就认为是匹配上了
threshold = 0.8
#分别返回的是y轴和x轴的索引
loc = np.where(res >= threshold) #返回满足条件的索引,x,y元组
# np.argwhere(res >= threshold) #返回满足条件的索引,x,y的数组
#打包
# zip(*loc[::-1]) #-1表示从后往前遍历,反过来
#依次从前一个array拿一个数,和后一个array拿一个数,组成一个元组
for pt in zip(*loc[::-1]):
   bottom_right = (pt[0] + w, pt[1] + h)
   cv2.rectangle(mario, pt, bottom_right, (0, 255, 0), 1)
plt_showimg(mario, 'mario')

展示效果图如下:

从上图中,我们看到绿色矩形框把所有的金币都框选了出来。

 

全部评论