python实现连连看辅助之图像识别延伸
python实现连连看辅助–图像识别延伸(百度AI),供大家参考,具体内容如下
百度AI平台提供图片相似检索API接口,并有详细的API文档说明,可以更好的实现图片识别。
fromaipimportAipImageSearch
"""你的APPIDAKSK"""
APP_ID='***'
API_KEY='***'
SECRET_KEY='***'
client=AipImageSearch(APP_ID,API_KEY,SECRET_KEY)
withopen("{}-{}.jpg".format(1,1),"rb")asf:
im=f.read()
#im=self.image_list[row][col]
#将图片与百度云自建相似图库中的图片对比相似度
res=client.similarSearch(im)
forrinres["result"]:
ifr["score"]>0.9:
print(r["brief"])
百度AI平台提供非常多的API接口,值得研究。
代码
importwin32gui
importtime
fromPILimportImageGrab,Image
importnumpyasnp
frompymouseimportPyMouse
fromaipimportAipImageSearch
classGameAuxiliaries(object):
def__init__(self):
self.wdname=r'宠物连连看经典版2,宠物连连看经典版2小游戏,4399小游戏www.4399.com-GoogleChrome'
#self.wdname=r'main.swf-PotPlayer'
self.image_list={}
self.m=PyMouse()
self.APP_ID='15633871'
self.API_KEY='LNMuXHmULcZM0PRKX8ZT4OnB'
self.SECRET_KEY='IwvyYxeDLIR5XvEmnX3ENWoVzMITkdBL'
self.client=AipImageSearch(self.APP_ID,self.API_KEY,self.SECRET_KEY)
deffind_game_wd(self,wdname):
#取得窗口句柄
hdwd=win32gui.FindWindow(0,wdname)
#设置为最前显示
win32gui.SetForegroundWindow(hdwd)
time.sleep(1)
defget_img(self):
image=ImageGrab.grab((417,289,884,600))
#image=ImageGrab.grab((417,257,885,569))
image.save('1.jpg','JPEG')
forxinrange(1,9):
self.image_list[x]={}
foryinrange(1,13):
top=(x-1)*38+(x-2)
left=(y-1)*38+(y-2)
right=y*38+(y-1)
bottom=x*38+(x-1)
iftop<0:
top=0
ifleft<0:
left=0
im_temp=image.crop((left,top,right,bottom))
im=im_temp.crop((1,1,37,37))
im.save('{}-{}.jpg'.format(x,y))
self.image_list[x][y]=im
defcompare_img_baiduapi(self,im):
'''将图片与百度云自建相似图库中的图片对比相似度'''
pass
#判断两个图片是否相同。汉明距离,平均哈希
defcompare_img(self,im1,im2):
img1=im1.resize((20,20),Image.ANTIALIAS).convert('L')
img2=im2.resize((20,20),Image.ANTIALIAS).convert('L')
pi1=list(img1.getdata())
pi2=list(img2.getdata())
avg1=sum(pi1)/len(pi1)
avg2=sum(pi2)/len(pi2)
hash1="".join(map(lambdap:"1"ifp>avg1else"0",pi1))
hash2="".join(map(lambdap:"1"ifp>avg2else"0",pi2))
match=0
foriinrange(len(hash1)):
ifhash1[i]!=hash2[i]:
match+=1
#match=sum(map(operator.ne,hash1,hash2))
#match值越小,相似度越高
returnmatch
#将图片矩阵转换成数字矩阵
defcreate_array(self):
array=np.zeros((10,14),dtype=np.int32)
img_type_list=[]
forrowinrange(1,len(self.image_list)+1):
forcolinrange(1,len(self.image_list[1])+1):
#im=Image.open('{}-{}.jpg'.format(row,col))
withopen("{}-{}.jpg".format(row,col),"rb")asf:
im=f.read()
#im=self.image_list[row][col]
#将图片与百度云自建相似图库中的图片对比相似度
res=self.client.similarSearch(im)
whilelen(res)==2:
res=self.client.similarSearch(im)
print(res)
print(row,col)
time.sleep(0.2)
print(row,col)
forrinres["result"]:
ifr["score"]>0.9:
array[row][col]=r["brief"]
returnarray
defrow_zero(self,x1,y1,x2,y2,array):
'''相同的图片中间图标全为空'''
ifx1==x2:
min_y=min(y1,y2)
max_y=max(y1,y2)
ifmax_y-min_y==1:
returnTrue
foryinrange(min_y+1,max_y):
ifarray[x1][y]!=0:
returnFalse
returnTrue
else:
returnFalse
defcol_zero(self,x1,y1,x2,y2,array):
'''相同的图片同列'''
ify1==y2:
min_x=min(x1,x2)
max_x=max(x1,x2)
ifmax_x-min_x==1:
returnTrue
forxinrange(min_x+1,max_x):
ifarray[x][y1]!=0:
returnFalse
returnTrue
else:
returnFalse
deftwo_line(self,x1,y1,x2,y2,array):
'''两条线相连,转弯一次'''
forrowinrange(1,9):
forcolinrange(1,13):
ifrow==x1andcol==y2andarray[row][col]==0andself.row_zero(x1,y1,row,col,array)andself.col_zero(x2,y2,row,col,array):
returnTrue
ifrow==x2andcol==y1andarray[row][col]==0andself.row_zero(x2,y2,row,col,array)andself.col_zero(x1,y1,row,col,array):
returnTrue
returnFalse
defthree_line(self,x1,y1,x2,y2,array):
'''三条线相连,转弯两次'''
forrow1inrange(10):
forcol1inrange(14):
forrow2inrange(10):
forcol2inrange(14):
ifarray[row1][col1]==array[row2][col2]==0andself.row_zero(x1,y1,row1,col1,array)andself.row_zero(x2,y2,row2,col2,array)andself.col_zero(row1,col1,row2,col2,array):
returnTrue
ifarray[row1][col1]==array[row2][col2]==0andself.col_zero(x1,y1,row1,col1,array)andself.col_zero(x2,y2,row2,col2,array)andself.row_zero(row1,col1,row2,col2,array):
returnTrue
ifarray[row1][col1]==array[row2][col2]==0andself.row_zero(x2,y2,row1,col1,array)andself.row_zero(x1,y1,row2,col2,array)andself.col_zero(row1,col1,row2,col2,array):
returnTrue
ifarray[row1][col1]==array[row2][col2]==0andself.col_zero(x2,y2,row1,col1,array)andself.col_zero(x1,y1,row2,col2,array)andself.row_zero(row1,col1,row2,col2,array):
returnTrue
returnFalse
defmouse_click(self,x,y):
top=(x-1)*38+(x-2)
left=(y-1)*38+(y-2)
right=y*38+(y-1)
bottom=x*38+(x-1)
iftop<0:
top=0
ifleft<0:
left=0
self.m.press(int(417+(left+right)/2),int(289+(top+bottom)/2))
deffind_same_img(self,array):
forx1inrange(1,9):
fory1inrange(1,13):
ifarray[x1][y1]==0:
continue
forx2inrange(1,9):
fory2inrange(1,13):
ifx1==x2andy1==y2:
continue
ifarray[x2][y2]==0:
continue
ifarray[x1][y1]!=array[x2][y2]:
continue
ifarray[x1][y1]==array[x2][y2]and(self.row_zero(x1,y1,x2,y2,array)orself.col_zero(x1,y1,x2,y2,array)orself.two_line(x1,y1,x2,y2,array)orself.three_line(x1,y1,x2,y2,array)):
print("可消除!x{}y{}和x{}y{}".format(x1,y1,x2,y2))
self.mouse_click(x1,y1)
time.sleep(0.1)
self.mouse_click(x2,y2)
time.sleep(0.1)
array[x1][y1]=array[x2][y2]=0
defrun(self):
#找到游戏运行窗口
self.find_game_wd(self.wdname)
#截图,切割成小图标
self.get_img()
print("切割完成")
#将图片矩阵转换成数字矩阵
array=self.create_array()
print(array)
#遍历矩阵,找到可消除项,点击消除
foriinrange(10):
self.find_same_img(array)
print(array)
if__name__=='__main__':
ga=GameAuxiliaries()
ga.run()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。