用Python写游戏脚本原来这么简单(下)

发表于:2022-1-30 09:08

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:运维派

  停止某个应用
  有时候会需要停止某个应用,需要提供应用的包名。
  adb shell am force-stop tw.sonet.princessconnect

  开启某个应用
  开启某个应用需要提供包名以及Activity。
  adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity

  图像操作
  对于图像的操作第一就是图像查找了,比如说像Airtest提供的这种,无非就是判断某个图像在不在截屏中,在的话在什么位置。
  除此之外还需要一些抠图,比如说我们想获取账号的id,账号的等级,需要截取出一部分图片然后进行OCR操作。
  图像查找
  图像查找其实就是先拿到两张图片,然后调用cv2.matchTemplate方法来查找是否存在以及位置,这里匹配是一个相对模糊的匹配,会有一个相似度的概率,最高是1。我们设定一个阈值来判断模板是否在截屏里即可。
  这里截屏如下,文件名为tmp.png:
  模板如下:
  代码如下:
  import cv2
  def image_to_position(screen, template):
      image_x, image_y = template.shape[:2]
      result = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED)
      min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
      print("prob:", max_val)
      if max_val > 0.98:
          global center
          center = (max_loc[0] + image_y / 2, max_loc[1] + image_x / 2)
          return center
      else:
          return False
  if __name__ == "__main__":
      screen = cv2.imread('tmp.png')
      template =  cv2.imread('Xuandan.png')
      print(image_to_position(screen, template))

  运行上述代码后,可以看到模板匹配出来的概率为0.9977,位置为(1165, 693),对于一张图片,左上角为原点,因为我的分辨率是1280 * 720,那么右下角的坐标就是(1280, 720)。可以看到我们这个选单其实就是刚好在右下角的位置。
  如何快速裁剪模板?(win10)
  游戏脚本其实并不是代码很难写,而是需要截很多的图,这些图要保证分辨率和原始一样。我发现在win10如果用画图打开图片。
  可以保证使用QQ截屏出来的分辨率,和图片本身的分辨率一样。
  这个时候直接用qq截屏出来的模板即可直接用于识别。
  图像裁剪
  接下来就是有时候需要裁剪一些图像了,当然我们的模板图片也可以通过裁剪图片的方式得到,这样的模板图片是最准的。
  裁剪其实就是需要裁剪的位置,以及需要的高度和宽度,说白了就是一篇长方形的区域,下面的代码使用PIL库实现。
  from PIL import Image
  def crop_screenshot(img_file, pos_x, pos_y, width, height, out_file):
      img = Image.open(img_file)
      region = (pos_x, pos_y, pos_x + width, pos_y + height)
      cropImg = img.crop(region)
      cropImg.save(out_file)
      print("exported:", out_file)
  if __name__ == "__main__":
      crop_screenshot("tmp.png", 817,556, 190, 24, "test_id.png")

  上面的代码以截取玩家的id为例。
  运行代码后,得到截图如下:
  简单的OCR
  得到了以上的图片信息后就是进行OCR了,也就是光学字符识别。这里代码非常简单,只要调用API即可。
  from PIL import Image
  import pytesseract
  image = Image.open('test_id.png')
  content = pytesseract.image_to_string(image)   # 识别图片
  print(content)

  不过需要注意的一点就是pytesseract识别出来的结果会有空格符,换行符这样的符号,真正要用的时候进行一些字符的过滤即可。
  The End
  这篇文章到这里就结束了,主要还是介绍一些ADB以及图像相关的基础操作。谢谢大家的观看。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号