python realizes image recognition extension assisted by Lianliankan
- 2021-07-22 10:15:12
- OfStack
python realizes Lianliankan auxiliary image recognition extension (Baidu AI) for your reference, the specific contents are as follows
Baidu AI platform provides API interface for image similarity retrieval, and has detailed API document description, which can better realize image recognition.
from aip import AipImageSearch
""" Yours APPID AK SK """
APP_ID = '***'
API_KEY = '***'
SECRET_KEY = '***'
client = AipImageSearch(APP_ID, API_KEY, SECRET_KEY)
with open("{}-{}.jpg".format(1, 1), "rb") as f:
im = f.read()
# im = self.image_list[row][col]
# Compare the similarity between the picture and the picture in Baidu Cloud's self-built similarity gallery
res = client.similarSearch(im)
for r in res["result"]:
if r["score"] > 0.9:
print(r["brief"])
Baidu AI platform provides many API interfaces, which is worth studying.
Code
import win32gui
import time
from PIL import ImageGrab , Image
import numpy as np
from pymouse import PyMouse
from aip import AipImageSearch
class GameAuxiliaries(object):
def __init__(self):
self.wdname = r' Pet Lianliankan Classic Edition 2, Pet Lianliankan Classic Edition 2 Games ,4399 Games www.4399.com - Google Chrome'
# 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)
def find_game_wd(self,wdname):
# Get the window handle
hdwd = win32gui.FindWindow(0,wdname)
# Set to front display
win32gui.SetForegroundWindow(hdwd)
time.sleep(1)
def get_img(self):
image = ImageGrab.grab((417, 289, 884, 600))
# image = ImageGrab.grab((417, 257, 885, 569))
image.save('1.jpg','JPEG')
for x in range(1,9):
self.image_list[x] = {}
for y in range(1,13):
top = (x - 1) * 38 + (x-2)
left =(y - 1) * 38 +(y-2)
right = y * 38 + (y-1)
bottom = x * 38 +(x -1)
if top < 0:
top = 0
if left < 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
def compare_img_baiduapi(self,im):
''' Compare the similarity between the picture and the picture in Baidu Cloud's self-built similarity gallery '''
pass
# Determine whether the two pictures are the same. Hamming distance, average hash
def compare_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(lambda p: "1" if p > avg1 else "0", pi1))
hash2 = "".join(map(lambda p: "1" if p > avg2 else "0", pi2))
match = 0
for i in range(len(hash1)):
if hash1[i] != hash2[i]:
match += 1
# match = sum(map(operator.ne, hash1, hash2))
# match The smaller the value, the higher the similarity
return match
# Convert a picture matrix into a digital matrix
def create_array(self):
array = np.zeros((10,14),dtype=np.int32)
img_type_list = []
for row in range(1,len(self.image_list)+1):
for col in range(1,len(self.image_list[1])+1):
# im = Image.open('{}-{}.jpg'.format(row,col))
with open("{}-{}.jpg".format(row,col), "rb") as f:
im = f.read()
# im = self.image_list[row][col]
# Compare the similarity between the picture and the picture in Baidu Cloud's self-built similarity gallery
res = self.client.similarSearch(im)
while len(res) == 2:
res = self.client.similarSearch(im)
print(res)
print(row, col)
time.sleep(0.2)
print(row,col)
for r in res["result"]:
if r["score"] > 0.9:
array[row][col]=r["brief"]
return array
def row_zero(self,x1,y1,x2,y2,array):
''' Icons in the middle of the same picture are all empty '''
if x1 == x2:
min_y = min(y1,y2)
max_y = max(y1,y2)
if max_y - min_y == 1:
return True
for y in range(min_y+1,max_y):
if array[x1][y] != 0 :
return False
return True
else:
return False
def col_zero(self,x1,y1,x2,y2,array):
''' Same picture, same column '''
if y1 == y2:
min_x = min(x1,x2)
max_x = max(x1,x2)
if max_x - min_x == 1:
return True
for x in range(min_x+1,max_x):
if array[x][y1] != 0 :
return False
return True
else:
return False
def two_line(self,x1,y1,x2,y2,array):
''' Connect two lines and turn 1 Times '''
for row in range(1,9):
for col in range(1,13):
if row == x1 and col == y2 and array[row][col]==0 and self.row_zero(x1,y1,row,col,array) and self.col_zero(x2,y2,row,col,array):
return True
if row == x2 and col == y1 and array[row][col]==0 and self.row_zero(x2,y2,row,col,array) and self.col_zero(x1,y1,row,col,array):
return True
return False
def three_line(self,x1,y1,x2,y2,array):
'''3 Connect lines and turn twice '''
for row1 in range(10):
for col1 in range(14):
for row2 in range(10):
for col2 in range(14):
if array[row1][col1] == array[row2][col2] == 0 and self.row_zero(x1,y1,row1,col1,array) and self.row_zero(x2,y2,row2,col2,array) and self.col_zero(row1,col1,row2,col2,array):
return True
if array[row1][col1] == array[row2][col2] == 0 and self.col_zero(x1,y1,row1,col1,array) and self.col_zero(x2,y2,row2,col2,array) and self.row_zero(row1,col1,row2,col2,array):
return True
if array[row1][col1] == array[row2][col2] == 0 and self.row_zero(x2,y2,row1,col1,array) and self.row_zero(x1,y1,row2,col2,array) and self.col_zero(row1,col1,row2,col2,array):
return True
if array[row1][col1] == array[row2][col2] == 0 and self.col_zero(x2,y2,row1,col1,array) and self.col_zero(x1,y1,row2,col2,array) and self.row_zero(row1,col1,row2,col2,array):
return True
return False
def mouse_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)
if top < 0:
top = 0
if left < 0:
left = 0
self.m.press(int(417+(left+right)/2) ,int(289+(top+bottom)/2) )
def find_same_img(self,array):
for x1 in range(1,9):
for y1 in range(1,13):
if array[x1][y1] == 0:
continue
for x2 in range(1,9):
for y2 in range(1,13):
if x1==x2 and y1 == y2:
continue
if array[x2][y2] == 0 :
continue
if array[x1][y1] != array[x2][y2] :
continue
if array[x1][y1] ==array[x2][y2] and (self.row_zero(x1,y1,x2,y2,array) or self.col_zero(x1,y1,x2,y2,array) or self.two_line(x1,y1,x2,y2,array) or self.three_line(x1,y1,x2,y2,array)):
print(" It can be eliminated! x{}y{} And 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
def run(self):
# Find the game running window
self.find_game_wd(self.wdname)
# Screenshot, cut into small icons
self.get_img()
print(" Cutting finished ")
# Convert a picture matrix into a digital matrix
array = self.create_array()
print(array)
# Traverse the matrix, find the items that can be eliminated, and click Eliminate
for i in range(10):
self.find_same_img(array)
print(array)
if __name__ == '__main__':
ga = GameAuxiliaries()
ga.run()