这是一个相对好玩的,你可以利用图像识别做很多事情,但是这种模板匹配的方法是相对比较笨的方法,对于我正在学习的神经网络所实现的图像识别来说,模板匹配的健壮性不是很好,不过还是有很多事情可以用模板匹配做到的。
模板匹配的意思是,拿两张图片,或者是一张大图一张小图,在大图中判断有没有类似小图的像素,如果有则匹配的上,反则没有匹配,大致就像,有一张模板图片,然后一张测试图片,拿着模板图片在测试图片中找相同的地方。
Python学习交流群:1004391443
例如,这样一张图作为模板匹配在判断的时候,如果测试人物左转一下,便判断不出来。
opencv作为模板匹配的方法有很多种:
CV_TM_SQDIEF平方差匹配法,最好匹配为0,值越大匹配越差
CV_TM_SQDIEF_NORMED归一化平方差匹配法
CV_TM_CCORR相关匹配法,采用乘法操作,数值越大表明匹配越好
CV_TM_CCORR_NORMED归一化相关匹配法
CV_TM_CCOEFF相关系数匹配法,最好匹配为1,最差为-1
CV_TM_CCOEFF_NORMED归一化相关系数匹配法
寻找最值--minMaxLoc()
minVal:返回最小值的指针,若无需返回,则设置0
maxVal:返回最大值的指针,若无需返回,则设置0
minLoc:返回最小位置的指针,若无需返回,则设置0
maxLoc:返回最大位置的指针,若无需返回,则设置0
img_m = ImageGrab.grab()#桌面截图 img_c = cv2.cvtColor(np.asarray(img_m), cv2.COLOR_RGB2BGR)#转化成cv2的模式 os.chdir('C:/Users/炜哥/PycharmProjects/Dnf/Monsterpic/')#取出模板图片 img_l = ac.imread("monster_1.png")#读取模板图片 mmaxpos = cv2.matchTemplate(img_c, img_l, cv2.TM_CCOEFF_NORMED)#匹配的结果 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(mmaxpos)#在结果中取出坐标 pt = max_loc mminpos = cv2.matchTemplate(img_c, img_l, cv2.TM_SQDIFF_NORMED)#第二种方式匹配 nmin_val, nmax_val, nmin_loc, nmax_loc = cv2.minMaxLoc(mminpos) minpt = nmin_loc if pt == minpt: print(pt) print(minpt) return pt else: return None
上面例子实现的在模板图片与桌面截图的匹配,从而判断截图中的游戏界面里有没有怪物存在,其中利用了两种方法的匹配,然后比较其结果有没有一样,如果一样则输出坐标(这个坐标是左上角的坐标,再具体操作的话需要减去模型的x或y,便可以得到想要的坐标)
不同的方法的坐标放在不一样的值里。
其中opencv模板匹配函数matchTemplate()
drawpos = cv2.matchTemplate(img_d1, imgdraw, cv2.TM_CCOEFF_NORMED)
其中,img_d1是测试图片,就是想要从中判断有没有模板图片的图片,即上面程序的截图位置
imgdraw:是模板图片,假设我们要从A图片中判断有没有B图片,这个B图片就是模板图片
cv2.TM_CCOEFF_NORMED:即是我们的匹配方法。
如果想要取出坐标的x和y
(x, y) = pt#结合上面例子
这样即可