pyppeteer(六)--通过opencv查找图片在另一张图片的位置

# -*- 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)

总体运行效果:

image.png

你可能感兴趣的:(pyppeteer(六)--通过opencv查找图片在另一张图片的位置)