当前位置:   article > 正文

触摸精灵,触动精灵,按键精灵等精灵对接本地AI免费OCR识别返回x,y中间坐标,把处理交给电脑,让手机放松,别再给打包者交钱了_触摸精灵 图像识别 文件

触摸精灵 图像识别 文件

最近有个项目,需要ios自动化,看了很多开发工具选择,最后选择touchelf(触摸精灵),当然其他精灵也可以用,就是post提交,因为我的系统是ios16,能支持最新系统的自动化开发工具少之又少,随后去B站看了很多touchelf教程.当然,又是少之又少,我有python开发经验,这个搞起来不难,发现有一个星点教育的,随后用了他们的ocr识别产品,想的是少造轮子,不是说它不好,而是出现了一个我无法忍受的BUG,就是不能部署在Esxi虚拟机里边,不论我如何搞,就是打不开,随后就有了下面教程,经过一顿搜索,发现星点用的也是开源项目打包来的,至于为什么收费,,,收打包费吗?

这里我推荐: Umi-OCR   下载地址
Umi-OCR暂时没有Linux的,直接Windows下载打开即可,版本根据自己电脑性能选择,电脑提前准备好7z解压,然后打开安装包,解压成一个文件夹,打开此文件夹,打开 Umi-OCR
点击高级,勾选允许http服务  主机: 任何可用地址

然后找到自己电脑的ipv4地址(网卡里边也能看),cmd命令: 

ipconfig

我用了python作为中转服务器,减少手机数据处理,python代码量也更少,错误处理也相对容易,你也可以不用python服务,直接往umi ocr 提交,自己在lua里边配置这些提交参数,发给 http://192.168.0.17:1224/api/ocr
再进行遍历,拆分,计算中间坐标即可

  1. zh = "models/config_chinese.txt"
  2. tw = "models/config_chinese_cht(v2).txt"
  3. kr = "models/config_korean.txt"
  4. ru = "models/config_cyrillic.txt"
  5. ja = "models/config_japan.txt"
  6. local body = {}
  7. body["base64"] = base64_data
  8. local options = {}
  9. options["tbpu.parser"] = 'multi_para'
  10. options["data.format"] = 'json'
  11. options["ocr.angle"] = false
  12. options["ocr.language"] = zh
  13. body["options"] =options
  14. local header = {}
  15. header["Content-Type"] = "application/json"
  16. local body_data, _ = httpPost("http://192.168.0.17:1224/api/ocr",header,jsonEncode(body), 30)
  17. local data = jsonDecode(body_data)
  18. if data['code'] == "100" then
  19. sys.log("umi-ocr识别成功: ")
  20. sys.log(data)
  21. return data
  22. else
  23. sys.log("识别失败")
  24. sys.log(data) -- 失败的返回值
  25. return nil
  26. end

我这里是: 192.168.0.17

python依赖,需要安装好python,如果不会python或者一点都看不懂,,,这教程不合适你
 

  1. pip install requests
  2. pip install uvicorn
  3. pip install fastapi

  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import uvicorn
  4. from fastapi import FastAPI
  5. from pydantic import BaseModel
  6. app = FastAPI()
  7. def ocr(language, base64_data):
  8.     if language == "en":
  9.         # English
  10.         language_code = "models/config_en.txt"
  11.     elif language == "zh":
  12.         # 简体中文
  13.         language_code = "models/config_chinese.txt"
  14.     elif language == "tw":
  15.         # 繁體中文
  16.         language_code = "models/config_chinese_cht(v2).txt"
  17.     elif language == "kr":
  18.         # 한국어
  19.         language_code = "models/config_korean.txt"
  20.     elif language == "ru":
  21.         # Русский
  22.         language_code = "models/config_cyrillic.txt"
  23.     elif language == "ja":
  24.         # 日本語
  25.         language_code = "models/config_japan.txt"
  26.     else:
  27.         print("没有传入语言代码")
  28.         return None
  29.     payload = {
  30.         "base64": base64_data,
  31.         "options": {
  32.             # 通用参数
  33.             "tbpu.parser": "multi_para",
  34.             "data.format": "json",
  35.             # 引擎参数
  36.             "ocr.angle": False,  # 是否进行图像旋转校正
  37.             "ocr.language": language_code,
  38.         }
  39.     }
  40.     result = requests.post('http://192.168.0.17:1224/api/ocr', json=payload).json()
  41.     if result['code'] == 100:
  42.         return result
  43.     else:
  44.         return None
  45. def ocr_lua_data_dict(data, box):
  46.     return {
  47.         "text": data['text'],
  48.         "x": (box[0][0] + box[1][0]) / 2,
  49.         "y": (box[0][1] + box[2][1]) / 2,
  50.         "box": data['box'],
  51.     }
  52. def umi_ocr(keyword, language, base64_data, contains: bool = True):
  53.     result = ocr(language, base64_data)
  54.     if result is None:
  55.         return None
  56.     # 左上角       右上角       左下角       右下角
  57.     # [111, 826], [330, 826], [330, 854], [111, 854]
  58.     for data in result['data']:
  59.         if contains:
  60.             if keyword in data["text"]:
  61.                 print(data)
  62.                 return ocr_lua_data_dict(data, data['box'])
  63.         else:
  64.             if data["text"] == keyword:
  65.                 print(data)
  66.                 return ocr_lua_data_dict(data, data['box'])
  67.     print("ocr没识别到包含文本")
  68.     return None
  69. class OcrItem(BaseModel):
  70.     keyword: str
  71.     language: str
  72.     Base64: str
  73.     contains: bool
  74. @app.post("/ocr_text", summary="umi ocr识别指定文本-返回坐标")
  75. async def ocr_img(data: OcrItem):
  76.     # "英语":"en",
  77.     # "日语":"ja",
  78.     # "简体中文":"zh",
  79.     # "繁体中文":"tw",
  80.     # "俄语":"ru",
  81.     # "韩语":"kr",
  82.     # keyword: 要匹配的关键词  language:语言模型  contains:包含关键词还是等于,如果为假就是等于,全部匹配
  83.     # payload = {
  84.     #     "keyword": "Search",
  85.     #     "language": "en",
  86.     #     "contains": "true",
  87.     #     "Base64": img_data
  88.     # }
  89.     try:
  90.         body = data.model_dump()
  91.         result = umi_ocr(body['keyword'], body['language'], data.Base64, body['contains'])
  92.         if result is None or result == []:
  93.             return {"status": "error", "result": None}
  94.         else:
  95.             return {"status": "ok", "result": result}
  96.     except Exception as e:
  97.         return {"status": "error", "result": None, "error": e}
  98. if __name__ == "__main__":
  99.     # 这python文件名字一定是  server.py 不然无法启动
  100.     uvicorn.run("server:app", host="0.0.0.0", port=8000, reload=False)


启动python服务器以后,触摸这边就可以提交了,代码如下

  1. -- 这里是IOS目录
  2. local  img_path = "/var/touchelf/"..'截图.png'
  3. screen.snapshot(img_path)
  4. local file_data = file.read(img_path)
  5. local body = {Base64=codec.base64.encode(file_data)}
  6. body['language'] = 'zh' -- 语言模型
  7. body['keyword'] = '搜索' -- 要匹配的关键字
  8. body['contains'] = false -- 传布尔值,包含还是全匹配,这里选包含
  9. local header = {}
  10. header["Content-Type"] = "application/json"
  11. local body_data, _ = httpPost("http://192.168.0.17:8000/ocr_text",header,jsonEncode(body), 30)
  12. local data = jsonDecode(body_data)
  13. if data['status'] == "ok" then
  14.      sys.log("umi-ocr识别成功: "..result["text"])
  15.     return result["x"],result["y"]
  16. else
  17.     sys.log("识别失败")
  18.     sys.log(body_data) -- 失败的返回值
  19.     return -1,-1
  20. end

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/765263
推荐阅读
相关标签
  

闽ICP备14008679号