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

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()

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

(0)

相关推荐

  • python递归法实现简易连连看小游戏

    问题:简单版连连看小游戏 一个分割成w*h个正方格子的矩形板上,每个正方格子可以有游戏卡,也可以没有游戏卡 两个游戏卡之间有一条路径相连需满足以下三个条件: 1.路径只包含水平和垂直的直线段 2.路径不能穿过别的游戏卡片 3.允许路径临时离开矩形板 输入要求: 第一行包括两个整数:w 和 h ; w:矩形板的宽度,h:矩形板的长度 下面h行,每行包括w个字符,表示矩形板上卡片的分布情况:'X'代表这个地方有卡片:'O'代表无卡片 之后一行包括4个整数:X1,Y1,X2,Y2(1<=X1,X2<

  • Python 连连看连接算法

    功能:为连连看游戏提供连接算法 说明:模块中包含一个Point类,该类是游戏的基本单元"点",该类包含属性:x,y,value. 其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案,9代表被填充为墙壁 模块中还包含一个名为points的Point列表,其中保存着整个游戏界面中的每个点 使用模块的时候应首先调用createPoints方法,初始化游戏界面中每个点,然后可通过points访问到每个点,继而初始化界面 模块中核心的方法是link

  • python实现连连看辅助(图像识别)

    个人兴趣,用python实现连连看的辅助程序,总结实现过程及知识点. 总体思路 1.获取连连看程序的窗口并前置 2.游戏界面截图,将每个一小图标切图,并形成由小图标组成的二维列表 3.对图片的二维列表遍历,将二维列表转换成由数字组成的二维数组,图片相同的数值相同. 4.遍历二维数组,找到可消除的对象,实现算法: 两个图标相邻.(一条线连接) 两个图标同行,同列,且中间的图标全部为空(数值为0)(一条线连接) 两条线连接,转弯一次,路径上所有图标为空.(二条线连接) 三条线连接,转弯二次,路径上所

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

    python实现连连看辅助–图像识别延伸(百度AI),供大家参考,具体内容如下 百度AI平台提供图片相似检索API接口,并有详细的API文档说明,可以更好的实现图片识别. from aip import AipImageSearch """ 你的 APPID AK SK """ APP_ID = '***' API_KEY = '***' SECRET_KEY = '***' client = AipImageSearch(APP_ID, API

  • python实现连连看游戏

    编程一直是在课余时间,放假时间自学,到现在为止也有半年了. 这是我自己用python实现的连连看,也是第一个完成的游戏,虽然极其简陋. 思路呢,一开始是想要从一个点出发开始寻路,遇到数字就换一条路,直到找到第二个点,但是这样就得做到不断寻路且不能和重复之前走过的路径,这就有点让我犯难了,想了很久也没想出解决办法,后来去网上参考了大神们的想法: 输入的两个坐标(x1,y1)(x2,y2),分别寻找两个点周围的空白点,空白点的坐标保存在数组a1,a2中,如果a1,a2有重合的点,那么就说明可以用一条

  • python tkinter实现连连看游戏

    需要自己添加图片素材呦 运行效果: 完整代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-10-02 15:19:24 # @Author : Salamander (1906747819@qq.com) # @Link : http://51lucy.com import os, random import tkinter as tk import tkinter.messagebox from PIL import

  • 如何将Python脚本打包成exe应用程序介绍

    目录 前言 安装Pyinstaller 将脚本打包成exe应用程序 进阶:消除命令窗口.自定义图标 总结 前言 我们有时候会编写Python脚本来辅助我们执行一些重复的操作.但是这些脚本在实际使用中会有一些不方便: 我们通常需要进入终端或者IDE中来运行脚本(当然,有办法可以实现双击脚本文件直接运行,但这不在今天的讨论范围内). 如果把脚本迁移至其他电脑上,那么Python环境变化,比如新电脑上没有安装Python,或者缺乏该脚本所调用的包等,脚本有很大概率无法正常运行. 这时候,我们可以将脚本

  • 微信跳一跳python辅助软件思路及图像识别源码解析

    本文将梳理github上最火的wechat_jump_game的实现思路,并解析其图像处理部分源码 首先废话少说先看效果 核心思想 获取棋子到下一个方块的中心点的距离 计算触摸屏幕的时间 点击屏幕 重要方法 计算棋子到下一个方块中心点的距离 使用 adb shell screencap -p 命令获取手机当前屏幕画面 再通过图像上的信息找出棋子的坐标和下一个方块中心点的坐标 然后通过两点间距离公式计算出距离 计算触摸屏幕的时间 T=A * S 其中S为上步算出的像素距离,T为按压时间(ms),A

  • 用Python进行简单图像识别(验证码)

    这是一个最简单的图像识别,将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract.image_to_string(image)识别后将结果存入到本地的txt文件中 #-*-encoding:utf-8-*- import pytesseract from PIL import Image class GetImageDate(object): def m(self): image = Image.open(u"C:\\a.png") text

  • 微信跳一跳python辅助脚本(总结)

    这段时间微信跳一跳这个游戏非常火爆,但是上分又非常的难,对于程序员来说第一个念头就是通过写一个辅助脚本外挂让上分变的容易,python现在比较火,我们一起来以python语言为基础总结以下各路神仙写的关于跳一跳的辅助脚本,大家在学习的时候主要理解他们的写法思路,对你学习python非常的有帮助. 1.微信跳一跳自动运行python脚本 注解:思路 核心:每次落稳之后截图,根据截图算出棋子的坐标和下一个块顶面的中点坐标, 根据两个点的距离乘以一个时间系数获得长按的时间 识别棋子:靠棋子的颜色来识别

  • python版微信跳一跳游戏辅助

    本文实例为大家分享了微信跳一跳游戏辅助python代码,供大家参考,具体内容如下 import os import PIL import numpy import matplotlib matplotlib.use('TKAgg') import matplotlib.pyplot as plt import time from matplotlib.animation import FuncAnimation # 是否需要进行图片更新 need_update = True def get_sc

  • python微信跳一跳游戏辅助代码解析

    这个代码实现的是   手动点击起点 和 终点  ,程序自动判断距离.触屏时间  完成跳跃 原理(摘自项目说明页面): 1. 将手机点击到"跳一跳"小程序界面: 2. 用Adb 工具获取当前手机截图,并用adb将截图pull上来: adb shell screencap -p /sdcard/1.png adb pull /sdcard/1.png . 3. 用matplot显示截图: 4. 用鼠标点击起始点和目标位置,计算像素距离: 5. 根据像素距离,计算按压时间: 6. 用Adb工

随机推荐