python 找色点击_Python实现按键精灵(二)-找图找色

时间:2025-04-03 15:44:42

一、实现功能

判断在指定坐标范围内,是否存在相似度大于n的图片,并返回坐标。

二、基本思路

A=你需要寻找的图片

B=截取当前页面中指定范围的图片

利用opencv 判断A在B中的位置,

在该位置截取与A图同大小的图片C

对比图片C与图片A的相似度

三、实现的代码段

1、安装所需要的库

pip install opencv-python

pip install pywin32

2、截取指定坐标的图片

参数说明

filename:保存的文件名

hwnd:窗口句柄 请想办法获取

pos:坐标位置 [x1,y1,x2,y2]。x1,y1 是左上角坐标、x2,y2 指右下角坐标。

该功能可以返回不在最顶层程序的截图。

def window_capture(filename,hwnd=0,pos=None):

hwnd= hwnd #窗口的编号,0号表示当前活跃窗口

#根据窗口句柄获取窗口的设备上下文DC(Divice Context)

hwndDC =(hwnd)#根据窗口的DC获取mfcDC

mfcDC =(hwndDC)#mfcDC创建可兼容的DC

saveDC =()#创建bigmap准备保存图片

saveBitMap =()#获取监控器信息

MoniterDev =(None, None)if pos==None:

x1=0

y1=0

w= MoniterDev[0][2][2]

h= MoniterDev[0][2][3]else:

x1=pos[0]

y1=pos[1]

w=pos[2]-pos[0]

h=pos[3]-pos[1]#print w,h #图片大小

#为bitmap开辟空间

(mfcDC, MoniterDev[0][2][2], MoniterDev[0][2][3])#高度saveDC,将截图保存到saveBitmap中

(saveBitMap)#截取从左上角(0,0)长宽为(w,h)的图片

((x1, y1), (w, h), mfcDC, (x1, y1), )

(saveDC, filename)

3、利用opencv 判断A在B中的位置

参数说明

target:(“图片B”)

template:(“图片A”)

deffind_picture(target,template):#获得模板图片的高宽尺寸

theight, twidth = [:2]#执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED

result =(target,template,cv2.TM_SQDIFF_NORMED)#归一化处理

( result, result, 0, 1, cv2.NORM_MINMAX, -1)#寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置

min_val, max_val, min_loc, max_loc =(result)#匹配值转换为字符串

#对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趋近与0匹配度越好,匹配位置取min_loc

#对于其他方法max_val越趋近于1匹配度越好,匹配位置取max_loc

strmin_val =str(min_val)#绘制矩形边框,将匹配区域标注出来

#min_loc:矩形定点

#(min_loc[0]+twidth,min_loc[1]+theight):矩形的宽高

#(0,0,225):矩形的边框颜色;2:矩形边框宽度

cv2.rectangle(target,min_loc,(min_loc[0]+twidth,min_loc[1]+theight),(0,0,225),2)#显示结果,并将匹配值显示在标题栏上

#("MatchResult----MatchingValue="+strmin_val,target)

#()

#()

x=min_loc[0]

y=min_loc[1]return X,Y

4、返回指定图片的指定位置指定坐标

#target原始图片#x,y 起始坐标#w,h 返回的宽长

defget_pic_from_pic(x,y,w,h,target):

region= target[y:y+h,x:x+w]

retrun region

5、比较两个图片的相似度

defcompare_picture( imageA, imageB):#灰度图片比较

grayA =(imageA, cv2.COLOR_BGR2GRAY)

grayB=(imageB, cv2.COLOR_BGR2GRAY)

(score, diff)= compare_ssim(grayA, grayB, full=True)return float(score)