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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。