文字识别
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]
TesserAct 文字识别
TesserAct 是谷歌维护的文字识别库,针对数字,英文较友好,可自行训练字库. (源码版本:4.0)
- 函数
Ocr.tess(data_file= Ocr.Tess_CHI,
rect: list = None,
pattern:str=None,
split_level= RIL_AUTO,
white_list:str=None,
black_list:str=None ):
- 参数
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
data_file | str | 否 | 字库,可传入字库文件路径,或 Ocr.Tess_CHI :已训练的中文字库Ocr.Tess_EN :英文字库 已训练模型库 |
rect | list | 否 | 识别范围 |
pattern | regx | 否 | 正则匹配 |
split_level | int | 否 | 识别结果的,分割等级: RIL_AUTO :自动分割(默认) RIL_BLOCK :块分割 RIL_PARA :页分割RIL_TEXTLINE :行分割 RIL_WORD :单词分割 RIL_SYMBOL :符号分割 |
white_list | str | 否 | 识别白名单 |
black_list | str | 否 | 识别黑名单 |
- 返回值
OcrText 对象,可通过 .
获取内部属性.
TesserAct并不支持 confidence属性,
因为4.0的TesserAct 并不是深度学习模型,而是一种识别算法. 因此并没有可信度属性.
[
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=[]}
]
- 示例
# TesserAct 识别中文,并使用自动分割
from ascript.android.screen import Ocr
res = Ocr.tess()
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]
# TesserAct 识别数字
from ascript.android.screen import Ocr
res = Ocr.tess(data_file=Ocr.Tess_ENG,white_list='1234567890')
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]
# TesserAct 识别特定范围内的数字
from ascript.android.screen import Ocr
res = Ocr.tess(data_file=Ocr.Tess_ENG,rect =[170,482,593,549], white_list='1234567890')
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]
# 指定字库文件,进行识别.(通常指定,自己训练的字库文件地址)
from ascript.android.screen import Ocr
from ascript.android.system import R
font_file = R.sd("airscrpt/Ocr/tessdata/eng.traineddata")
res = Ocr.tess(data_file=font_file)
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/”目录下.会自动创建该文件. 制作多个文字会自动追加至该文件末尾
- 填写文字代号
- 点击保存字体到字库,就完成了一个文字字库的制作
- 具体操作步骤如下图