python实现连连看辅助之图像识别延伸


Posted in Python onJuly 17, 2019

python实现连连看辅助?图像识别延伸(百度AI),供大家参考,具体内容如下

百度AI平台提供图片相似检索API接口,并有详细的API文档说明,可以更好的实现图片识别。

from aip import AipImageSearch

""" 你的 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]
# 将图片与百度云自建相似图库中的图片对比相似度
res = client.similarSearch(im)
for r in res["result"]:
 if r["score"] > 0.9:
  print(r["brief"])

百度AI平台提供非常多的API接口,值得研究。

代码

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'宠物连连看经典版2,宠物连连看经典版2小游戏,4399小游戏 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):
  # 取得窗口句柄
  hdwd = win32gui.FindWindow(0,wdname)
  # 设置为最前显示
  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):
  '''将图片与百度云自建相似图库中的图片对比相似度'''
  pass

 # 判断两个图片是否相同。汉明距离,平均哈希
 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 值越小,相似度越高
  return match


 # 将图片矩阵转换成数字矩阵

 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]
    # 将图片与百度云自建相似图库中的图片对比相似度
    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):
  '''相同的图片中间图标全为空'''
  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):
  '''相同的图片同列'''
  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):
  '''两条线相连,转弯一次'''
  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):
  '''三条线相连,转弯两次'''
  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("可消除!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



 def run(self):
  #找到游戏运行窗口
  self.find_game_wd(self.wdname)
  # 截图,切割成小图标
  self.get_img()
  print("切割完成")
  # 将图片矩阵转换成数字矩阵
  array = self.create_array()
  print(array)
  # 遍历矩阵,找到可消除项,点击消除
  for i in range(10):
   self.find_same_img(array)

  print(array)


if __name__ == '__main__':
 ga = GameAuxiliaries()
 ga.run()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现带错误处理功能的远程文件读取方法
Apr 29 Python
浅谈Python的Django框架中的缓存控制
Jul 24 Python
详解Python中的变量及其命名和打印
Mar 11 Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
python实现杨辉三角思路
Jul 14 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
Nov 22 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
Python基础详解之邮件处理
Apr 28 Python
Django 路由控制的实现
Jul 17 #Python
详解python实现数据归一化处理的方式:(0,1)标准化
Jul 17 #Python
简单了解django索引的相关知识
Jul 17 #Python
python实现连连看辅助(图像识别)
Mar 25 #Python
Django中多种重定向方法使用详解
Jul 17 #Python
200行python代码实现2048游戏
Jul 17 #Python
Django后端接收嵌套Json数据及解析详解
Jul 17 #Python
You might like
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
jquery tools之tooltip
2009/07/25 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
ionic+AngularJs实现获取验证码倒计时按钮
2017/04/22 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
python和c语言的主要区别总结
2019/07/07 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
Python爬取豆瓣数据实现过程解析
2020/10/27 Python
异常和异常类的概念
2014/09/12 面试题
DataReader和DataSet的异同
2014/12/31 面试题
一道Delphi上机题
2012/06/04 面试题
护士演讲稿范文
2014/01/05 职场文书
小学生优秀评语大全
2014/04/22 职场文书
宣传口号大全
2014/06/16 职场文书
禁止酒驾标语
2014/06/25 职场文书
2015高考寄语集锦
2015/02/27 职场文书
小学六一主持词开场白
2015/05/28 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书