Skip to main content

文字识别

from ascript.android.screen import Ocr

从屏幕中 识别文字

方法

谷歌文字识别

谷歌 MLKIT 引擎v2, 速度快,且准确度高. (源码版本:4.0)

  • 函数
Ocr.mlkitocr_v2(rect: list = None, pattern: str = None bitmap=None):
  • 参数
参数类型是否必填说明
rectlist识别范围
patternregx正则匹配
bitmapstr要识别的图片,默认为当前屏幕,如需传入指定图片,请传入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):
  • 参数
参数类型是否必填说明
rectlist圈定屏幕中识别的范围
patternstr匹配的正则表达式 如保留字符串中包含IT的识别结果:.*IT.*
confidencefloat识别可信度:默认0.1
max_side_lenstr如果指定最大边时,如1200,那么所有输入资源都会同比缩放最大边至1200px,再传入引擎识别
bitmapstr从指定的图片中识别 该Bitmap 可以从Screen.capture()获取
filestr从指定的文件中识别
  • 返回值

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):
  • 参数
参数类型是否必填说明
rectlist圈定屏幕中识别的范围
patternstr匹配的正则表达式 如保留字符串中包含IT的识别结果:.*IT.*
confidencefloat识别可信度:默认0.1
max_side_lenstr如果指定最大边时,如1200,那么所有输入资源都会同比缩放最大边至1200px,再传入引擎识别
bitmapstr从指定的图片中识别 该Bitmap 可以从Screen.capture()获取
filestr从指定的文件中识别
  • 返回值

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_filestr字库,可传入字库文件路径,或
Ocr.Tess_CHI:已训练的中文字库
Ocr.Tess_EN:英文字库
已训练模型库
rectlist识别范围
patternregx正则匹配
split_levelint识别结果的,分割等级:
RIL_AUTO:自动分割(默认)
RIL_BLOCK:块分割
RIL_PARA:页分割
RIL_TEXTLINE:行分割
RIL_WORD:单词分割
RIL_SYMBOL:符号分割
white_liststr识别白名单
black_liststr识别黑名单
  • 返回值

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