# -*- coding:utf-8 -*-
"""
利用opencv找到图片在另外张图片中的位置
"""
import cv2
import numpy as np
"""
cv2.imread()
参数1:文件路径
参数2:>0(整数,一般为1)==cv2.IMREAD_COLOR 读取彩色图片
0==cv2.IMREAD_GRAYSCALE 以灰读模式读取图片,图片就算是彩色也是黑白
<0(整数,一般为-1)==cv2.IMREAD_UNCHANGED 读取原图,包括alpha通道,alpha通道表示一副图片的透明度。
"""
img = cv2.imread("bg.png",1)
gray = cv2.imread("bg.png",0)
img2 = cv2.imread("flag.png",0)
w,h = img2.shape[::-1]
"""
TM_SQDIFF 平方差匹配法 该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大
TM_CCORR 相关匹配法 该方法采用乘法操作;数值越大表明匹配程度越好。
TM_CCOEFF 相关系数匹配法 1表示完美的匹配;-1表示最差的匹配。
TM_SQDIFF_NORMED 归一化平方差匹配法
TM_CCORR_NORMED 归一化相关匹配法
TM_CCOEFF_NORMED 归一化相关系数匹配法
"""
res = cv2.matchTemplate(gray,img2,cv2.TM_CCOEFF_NORMED)
print(res)
res返回的是一个阈值矩阵。
threshold = 0.9
loc = np.where(res >= threshold)
print(loc)
通过分别设置阈值为0.1、0.2、0.5、0.6、0.8、0.9,打印loc的个数可以知道,当阈值较小时,候选坐标会很多,当阈值较大时,候选坐标会为空,我们只要设置合理的算法找出阈值时候选坐标唯一,这个唯一的坐标就是我们要求的坐标
L = 0
R = 1
count = 0
while 1:
threshold = (L+R)/2
count += 1
print(count)
loc = np.where(res >= threshold)
if len(loc[0]) > 1:
L += (R-L) /2
elif len(loc[0]) == 1:
print(loc)
pt = loc[::-1]
print('目标区域的左上角坐标:',pt[0],pt[1])
print('次数:',count)
print('阀值',threshold)
break
elif len(loc[0]) < 1:
R -= (R-L) / 2
余下的代码
"""
cv2.rectangle()给图片添加方框
参数1:图片
参数2:左上角坐标
参数3:右下角坐标
参数4:颜色
参数5:线粗
"""
cv2.rectangle(img,pt,(pt[0]+w,pt[1]+h),(34,139,139),2)
"""
cv2.imshow():创建一个窗口显示图片
参数1:窗口名字,可以创建多个窗口中,但是每个窗口不能重名;
参数2:读入的图片。
"""
cv2.imshow('pic',img)
cv2.imshow('pic1',gray)
cv2.imshow('xxx',img2)
"""
cv2.waitKey():键盘绑定函数,
参数1:等待毫秒数,将等待特定的几毫秒,看键盘是否有输入。
如果其参数为0,则表示无限期的等待键盘输入。
如果show命令不设置wait函数创建后马上消失。
"""
cv2.waitKey(0)
总体运行效果: