文字识别
from ascript.android.screen import Ocr
从屏幕中 识别文字
方法
谷歌文字识别
谷歌 MLKIT 引擎v2, 速度快,且准确度高. (源码版本:4.0)
- 函数
Ocr.mlkitocr_v2(rect: list = None, pattern: str = None bitmap=None):
- 参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| rect | list | 否 | 识别范围 |
| pattern | regx | 否 | 正则匹配 |
| bitmap | str | 否 | 要识别的图片,默认为当前屏幕,如需传入指定图片,请传入Bitmap格式 |
- 返回值
返回值为 OcrText 数组对象
谷歌OCR并不支持 confidence属性!
谷歌OCR,并没有可信度.只要识别到的都是准确的文本.
[
OcrText{
text='应用或小程序D...', #识别到文字
center_x=345, # 文字中心点 在屏幕中的X坐标
center_y=202, # 文字中心点 在屏幕中的Y坐标
rect=[345,202,644,242], # 文字段落 在屏幕中的范围数组
text_box_position=[] # 每一个字的在屏幕中的范围
},
OcrText{text='应用或小程序D...', center_x=345, center_y=202, rect=[345,202,644,242], text_box_position=[]}
]
- 示例
# 谷歌OCR 识别中文,并使用自动分割
from ascript.android.screen import Ocr
res = Ocr.mlkitocr_v2()
if res:
#循环打印识别到的每一个段落
for r in res:
print("文字:",r.text)
print("文字中心坐标:",r.center_x,r.center_y)
print("文字范围:",r.rect)
百度飞桨v2
百度飞桨v2 文字识别引擎 ,速度快,精度中等
- 函数
Ocr.paddleocr_v2(
rect:list=None,
pattern:str=None,
confidence:int=0.1
max_side_len:int=1200,
precision:int=16,
bitmap=None,
file:str=None):
- 参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| rect | list | 否 | 圈定屏幕中识别的范围 |
| pattern | str | 否 | 匹配的正则表达式 如保留字符串中包含IT的识别结果:.*IT.* |
| confidence | float | 否 | 识别可信度:默认0.1 |
| max_side_len | str | 否 | 如果指定最大边时,如1200,那么所有输入资源都会同比缩放最大边至1200px,再传入引擎识别 |
| bitmap | str | 否 | 从指定的图片中识别 该Bitmap 可以从Screen.capture()获取 |
| file | str | 否 | 从指定的文件中识别 |
- 返回值
OcrText 对象,可通过 . 获取内部属性.
[
OcrText{
text='应用或小程序D...', #识别到文字
confidence = 0.8111246228218079, # 可信度
center_x=345, # 文字中心点 在屏幕中的X坐标
center_y=202, # 文字中心点 在屏幕中的Y坐标
rect=[345,202,644,242], # 文字段落 在屏幕中的范围数组
text_box_position=[] # 每一个字的在屏幕中的范围
},
OcrText{text='应用或小程序D...', center_x=345, center_y=202, rect=[345,202,644,242], text_box_position=[]}
]
- 示例
# 找到屏幕中的所有文字,保留结果中,包含程序的. 在识别的时候,图片最大边缩放至1600(增加识别速度)
# 导包
from ascript.android.screen import Ocr
res = Ocr().paddleocr_v2(rect=[40,122,714,659],pattern=".*程序.*",max_side_len=1600)
print(res)
if res:
#循环打印识别到的每一个段落
for r in res:
print("文字:",r.text)
print("可信度",r.confidence)
print("文字中心坐标:",r.center_x,r.center_y)
print("文字范围:",r.rect) # 这是一个int数组,可以这样取值 r.rect[0],r.rect[1],r.rect[2],r.rect[3]
百度飞桨v3
部分设备不支持
百度飞桨v3 文字识别引擎 ,速度慢,精度高
- 函数
Ocr.paddleocr_v3(
rect:list=None,
pattern:str=None,
confidence:int=0.1
max_side_len:int=1200,
precision:int=16,
bitmap=None,
file:str=None):
- 参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| rect | list | 否 | 圈定屏幕中识别的范围 |
| pattern | str | 否 | 匹配的正则表达式 如保留字符串中包含IT的识别结果:.*IT.* |
| confidence | float | 否 | 识别可信度:默认0.1 |
| max_side_len | str | 否 | 如果指定最大边时,如1200,那么所有输入资源都会同比缩放最大边至1200px,再传入引擎识别 |
| bitmap | str | 否 | 从指定的图片中识别 该Bitmap 可以从Screen.capture()获取 |
| file | str | 否 | 从指定的文件中识别 |
- 返回值
OcrText 对象,可通过 . 获取内部属性.
[
OcrText{
text='应用或小程序D...', #识别到文字
confidence = 0.8111246228218079, # 可信度
center_x=345, # 文字中心点 在屏幕中的X坐标
center_y=202, # 文字中心点 在屏幕中的Y坐标
rect=[345,202,644,242], # 文字段落 在屏幕中的范围数组
text_box_position=[] # 每一个字的在屏幕中的范围
},
OcrText{text='应用或小程序D...', center_x=345, center_y=202, rect=[345,202,644,242], text_box_position=[]}
]
- 示例
# 找到屏幕中的所有文字
# 导包
from ascript.android.screen import Ocr
res = Ocr().paddleocr_v3()
print(ots)
if res:
#循环打印识别到的每一个段落
for r in res:
print("文字:",r.text)
print("可信度",r.confidence)
print("文字中心坐标:",r.center_x,r.center_y)
print("文字范围:",r.rect) # 这是一个int数组,可以这样取值 r.rect[0],r.rect[1],r.rect[2],r.rect[3]
自定义图片字库
自定义图片字库,用小图构建字库 请见 CvFontLib
点阵字库
对特殊图像,做点阵字库. 从而进行识别,该方法不支持全分辨率
点阵字库适合 范围检索,不适合全屏幕检索.
查找文字
给定字库,从字库中识别文字
- 函数
Ocr.matrix(font_lib: str, rect: list = None, region=0.9):
- 参数
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| font_lib | str | 是 | 字库文件 |
| rect | list | 否 | 识别范围 |
| region | float | 否 | 识别精度 0-1之间, 默认0.9=90%精度 |
- 返回值
返回值为 识别到的文字, 类型为str
from ascript.android.system import R
from ascript.android.screen import OcrX
res = OcrX.find_all(R.res("font.t"),rect=[90,529,343,612])
print(res[0])
如何制作字库?
制作字库用到了图色工具中的点阵识字
- 打开图色助手并点击点阵字库
- 扩选要做的字
- 按住键盘1-9取色要做的字,直到右侧出现字的二值图像
- 选择要存放字库的工程和文件名称(文件名称默认font.t,可以更改) 此文件存放在 “工程/res/”目录下.会自动创建该文件. 制作多个文字会自动追加至该文件末尾
- 填写文字代号
- 点击保存字体到字库,就完成了一个文字字库的制作
- 具体操作步骤如下图
