设备控制接口之 Google OCR 在 Total Control 的应用

什么是OCR?

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。

OCR也可简单地称为文字识别,是文字自动输入的一种方法。它通过扫描和摄像等光学输入方式获取纸张上的文字图像信息,利用各种模式识别算法分析文字形态特征,判断出汉字的标准编码,并按通用格式存储在文本文件中,所以,OCR是一种非常快捷、省力的文字输入方式,也是在文字量比较大的今天,很受人们欢迎的一种输入方式。

总结起来就是一句话,将图像的文字转化成为字符。

OCR与Total Control 脚本的联系

在 Total Control的设备控制接口中,我们提供了一些文字识别的接口,用户可以通过Total Control 提供的接口获取整个手机屏幕的文字,也可以获取手机屏幕上指定范围的文字。这样快捷的文字输入方式,会给用户带来很多方便。

在 Total Control的接口中,我们针对百度和Google 的OCR分别提供了文字识别接口。

  • 百度ORC的四个接口:
    loginBaiduCloud('API KEY', 'Secret Key') ,
    getTextByBaiduCloudOnAndroid(),
    BDOcr.login(AppID, APIKey, SecretKey) ,
    BDOcr.getText(filename, lang)
  • Google OCR 的两个接口:
    uploadTessData(fileName)
    analyzeText(x1, y1, x2, y2, lang, mode)

Google OCR

Tesseract,一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Document Imaging(MODI)相比,我们可以不断的训练的库,使图像转换文本的能力不断增强;如果团队深度需要,还可以以它为模板,开发出符合自身需求的OCR引擎。Tesseract不能识别手写,而且只能识别一共大约64中字体的文本。

Tesseract 是目前公认最优秀、最精确的开源 OCR 系统。 除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何 Unicode 字符。

如何使用Google OCR接口

1.下载语言库

下载地址:https://github.com/tesseract-ocr/tessdata ,默认自带的是英语 ,根据自己的需求选择所要的语言库,在这里我们选择的是简体中文所以选择的库是:chi_sim.traineddata。

2.上传traineddata文件

用设备接口uploadTessData(fileName)上传traineddata文件,注意,上传文件时手机是和Total Control连接的。例如:

var ret = device.uploadTessData("E:\\data\\eng.traineddata");
//上传eng.traineddata文件

3.解析手机屏幕上指定范围的文字

利用设备接口analyzeText(x1, y1, x2, y2, lang, mode) 解析手机屏幕上指定范围的文字,其返回值就是解析到的文字,例如:

var text = device.analyzeText(60,500,476,621,"eng","singleline");					
print("text: " + text);

analyzeText接口的参数:

  • x1: 整型,屏幕搜索区域左上角 X 坐标
  • y1: 整型,屏幕搜索区域左上角 Y 坐标
  • x2: 整型,屏幕搜索区域右下角 X 坐标
  • y2: 整型,屏幕搜索区域右下角 Y 坐标
  • lang: 字符串,要搜索指定区域文字对应的语言,注意:
    TrainedData的文件名一定为{lang}.traineddata。如中文简体是chi_sim.traineddata;英语是eng.traineddata
  • mode: 字符串,搜索模式,有以下几种模式:
    singleline: 要找的字大小相同,并且在同一行以内。
    multiline: 要找的字大小相同,并且整齐排列在多行中。这个参数相当耗时,建议少用。
    singlechar:单个字母,不知道支持中文否......
    singleword: 单个单词
    singlecolumn: 要找的字大小相同,并且在同一列中
    multicolumn: 要找的字大小相同,并且分布在多列中
    number: 要找的是阿拉伯数字
    noorder: 一堆杂乱的字
    其余:如果mode值并非上面任何一个取值,那么analyzeText函数会根据图片的实际情况进行分析

Google OCR接口示例

获取屏幕上指定区域坐标(261,608,433,656)的文字,屏幕显示为下图:

//获取当前设备对象
var device = Device.getMain();
// 上传traineddata文件
var ret = device.uploadTessData("E:\\sigmaTC\\产品20180611\\orc\\chi_sim.traineddata"); 
//这里的路径为traineddata文件在当前PC上的存储位置。
if(ret == true) {
	var text = device.analyzeText(261,608,433,656,"chi_sim","singleline");//用"singleline"模式搜索文字
	print("获取到的文字是 : " + text);
}
					

运行结果:

获取到的文字是 : 没有会话信息