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 相关文章推荐
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
Python中生成器和yield语句的用法详解
Apr 17 Python
python查看zip包中文件及大小的方法
Jul 09 Python
Django接受前端数据的几种方法总结
Nov 04 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Python yield与实现方法代码分析
Feb 06 Python
python绘制中国大陆人口热力图
Nov 07 Python
Python字节单位转换实例
Dec 05 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
如何使用python切换hosts文件
Apr 29 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
Jun 23 Python
java关于string最常出现的面试题整理
Jan 18 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
2009/08/07 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
两个Javascript小tip资料
2010/11/23 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
Python处理JSON数据并生成条形图
2016/08/05 Python
python3操作mysql数据库的方法
2017/06/23 Python
python用户管理系统的实例讲解
2017/12/23 Python
python从子线程中获得返回值的方法
2019/01/30 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
台湾森森购物网:U-mall
2017/10/16 全球购物
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
我的梦想演讲稿
2014/04/30 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
工程项目合作意向书
2015/05/08 职场文书
预备党员群众意见
2015/06/01 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers