在Squish里做OCR,识别错并不一定说明OCR引擎本身坏了,更常见的情况是语言提示没给对、识别区域放得太大,或者界面文本的渲染方式和默认放大参数不匹配。Qt官方文档写得很清楚,Squish默认依赖Tesseract做OCR,而且Tesseract需要单独安装;同时,OCR相关函数本身就提供了`language`、`scaleFactor`、`searchRegion`、`timeout`这些参数,说明官方本来就把语言、缩放和识别范围当成影响结果的关键因素。
一、Squish OCR识别错怎么办
OCR识别错时,先不要急着重录脚本,更稳的做法是先看“识别到了什么”,再调整参数。Qt官方文档里给了最直接的调试入口,就是`getOcrText()`。这个函数会把当前区域里OCR读到的全部文本直接打印出来,而且同样支持`language`和`searchRegion`参数,所以它特别适合先确认问题到底出在文字没被识别出来,还是被识别成了别的内容。
1、先用`getOcrText()`看原始识别结果
如果你直接用`findOcrText()`或`test.ocrTextPresent()`,看到的往往只是“找到了”或“没找到”。而`getOcrText()`更适合排查,因为它会把当前OCR结果完整吐出来。先把Squish实际识别到的文本看清,后面才知道是错字、漏字,还是根本没识别到。
2、优先缩小`searchRegion`
Qt官方文档明确说明,OCR可以只在指定区域内执行,这个区域可以是AUT对象、`ScreenRectangle`,也可以是多个对象组成的范围。实际排查时,整屏OCR最容易把无关文字、图标和背景噪声一起带进去,所以先把识别范围缩到目标控件附近,通常比反复改关键字更有效。
3、文本大时先调`scaleFactor`
官方文档对`scaleFactor`的说明很直接,默认值是`3.5`,但如果文字本来就渲染得比较大,可以把它调低来改善OCR表现。也就是说,不是放大倍数越高越好,字体已经很大的场景下,过度放大反而可能让边缘和笔画变形。
4、时机不稳时改用`waitForOcrText()`或`ocrTextPresent()`
`findOcrText()`只做一次OCR,官方明确写到,如果文本并不一定马上出现,更推荐用`waitForOcrText()`;而`test.ocrTextPresent()`则会在默认20秒内反复抓屏查找,`timeout`和`interval`也可以继续调。对动态页面来说,很多“识别错”其实是时机太早,不是OCR本身识别差。
二、Squish字体渲染与语言包怎么排查
这部分最好分成两层看。语言包层看的是Tesseract和语言提示是不是对的,字体渲染层看的是当前字体大小、边缘平滑和显示区域是不是适合OCR。Qt官方文档已经把这两层接口分开了,一边要求单独安装包含全部语言文件的Tesseract for Squish,一边又在OCR API里给出了`language`和`scaleFactor`参数。
1、先确认Tesseract已经正确安装
Qt官方明确说明,Squish使用Tesseract作为主要OCR引擎,而且这个包需要独立于Squish单独安装。要是OCR功能本身就没装对,后面再调语言和缩放都没有意义。官方还特别说明,Tesseract for Squish的安装包包含完整的语言文件集,所以这一步先要确保你装的是官方提供的完整包。
2、再确认语言提示是不是和界面语言一致
OCR函数里的`language`参数就是官方给出的语言提示入口;如果不传,默认会走`testSettings.defaultOcrLanguage`。所以界面是德语、法语或混合语言时,不要一直用默认值硬跑,先把`language`参数显式设对,通常会比只改匹配文本更有效。
3、默认语言不稳定时统一改`testSettings.defaultOcrLanguage`
如果一整套脚本都是同一语言界面,逐条函数里都写`language`会比较散。官方文档已经说明,OCR API的默认语言来自`testSettings.defaultOcrLanguage`,所以更稳的做法通常是先把这项全局默认值设好,再在特殊用例里单独覆盖。
4、字体渲染异常时先回看`scaleFactor`和区域裁剪
Qt官方没有把“字体渲染问题”单独做成一个独立设置页,但OCR API文档已经把应对入口给出来了。字体较大时优先把`scaleFactor`调低,区域里干扰元素较多时优先缩小`searchRegion`。从排查角度看,这两步就是官方留给字体渲染差异最直接的调节手段。
三、Squish OCR排查顺序怎么收
很多脚本后面越改越乱,不是因为OCR不能用,而是一开始没有按固定顺序排。更稳的办法是先确认OCR环境,再确认语言,再确认区域和缩放,最后才回头改断言文本。Qt官方文档拼起来看,其实已经把这条线给出来了,Tesseract负责引擎和语言文件,`getOcrText()`负责看原始结果,`findOcrText()`和`ocrTextPresent()`负责查找和验证,而`language`、`searchRegion`、`scaleFactor`则是主要调节旋钮。
1、先查环境是不是完整
先确认Tesseract for Squish已安装,而且语言文件确实在。环境不完整时,后面所有OCR参数都没有落点。
2、再查语言是不是设对
先看`language`参数或`testSettings.defaultOcrLanguage`,不要让德语界面、中文界面一直按默认英语口径硬识别。
3、然后查区域和缩放
先缩小`searchRegion`,再根据字体大小调`scaleFactor`。这一步通常对识别准确率影响最大。
4、最后再改脚本断言
先用`getOcrText()`把实际识别文本看出来,再决定`findOcrText()`、`waitForOcrText()`或`test.ocrTextPresent()`里要匹配什么。这样改出来的脚本会比一开始凭感觉改关键字稳很多。
总结
Squish OCR识别错怎么办,关键不是直接改断言,而是先用`getOcrText()`看清实际识别结果,再按区域、缩放和等待方式去调。Squish字体渲染与语言包怎么排查,重点则是先确认Tesseract和语言文件安装完整,再把`language`或`testSettings.defaultOcrLanguage`设对,最后结合`searchRegion`和`scaleFactor`处理字体渲染差异。把环境、语言、区域和缩放这几层按顺序收起来,OCR识别通常会稳定很多。