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实现windows下模拟按键和鼠标点击的方法
Mar 13 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
python用插值法绘制平滑曲线
Feb 19 Python
Python匿名函数及应用示例
Apr 09 Python
用Python批量把文件复制到另一个文件夹的实现方法
Aug 16 Python
pandas 空数据处理方法详解
Nov 02 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 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
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
分析python服务器拒绝服务攻击代码
2014/01/16 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
导游实习生自荐书
2014/01/28 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
公证委托书模板
2014/04/03 职场文书
工商管理专业自荐信
2014/06/03 职场文书
暑期教师培训方案
2014/06/07 职场文书
材料专业大学毕业生自荐书
2014/07/02 职场文书
家长学校教学计划
2015/01/19 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
就业推荐表院系意见
2015/06/05 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
4种非常实用的python内置数据结构
2021/04/28 Python
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
python元组打包和解包过程详解
2021/08/02 Python