用影刀RPA做手机自动化,最绕不开的两个操作就是截图和OCR。手机App没有XPath,很多元素拿不到属性,只能靠截图后识别文字来定位。但手机截图和电脑截图完全是两回事——分辨率五花八门、字体小、背景花,直接用影刀内置OCR识别,准确率经常惨不忍睹。我之前做拼多多移动端采集的时候,截下来的商品价格用默认OCR识别,经常把“29.9”认成“29 9”或“29g”,清洗得怀疑人生。
后来我把手机截图的整个链路优化了一遍——从ADB截图命令的选择、图片的预处理、到OCR参数的调优——识别准确率从六成提到了九成以上。这篇文章就把这些优化技巧完整分享出来,如果你也在用影刀做手机自动化,这些细节能帮你省掉大量识别失败后的反复调试。
手机截图的三种方式,速度和画质差异巨大
影刀手机自动化模块有内置的截图指令,但底层用的是ADB命令。ADB截图有两种方式,速度和质量差别很大。
方式一:screencap 命令(影刀内置默认方式)。 在手机上截取PNG格式的屏幕截图,保存在手机存储里,然后用 pull 命令拉到电脑上。优点是画质无损,缺点是速度慢——截图+传输一张1080p的图要1-2秒。
方式二:直接截取实时画面(影刀手机投屏窗口的截图)。 影刀连接手机后,电脑上会有一个实时投屏画面。用影刀的“截取可视区域”指令直接截这个投屏窗口。优点是速度快(瞬间完成),缺点是画质受投屏码率影响,可能比原图模糊。
方式三:screencap 加压缩。 用 screencap -p 输出PNG,但可以通过参数降低分辨率。如果只需要识别某一块区域,可以先截全屏再裁剪。
选型建议: 如果OCR目标是文字(如价格、标题),且投屏画质清晰(USB连接通常无损),用投屏截图最快。如果目标是小字体或模糊验证码,用无损的 screencap 命令。下面是一个在影刀里用Python执行ADB截图并拉到本地的脚本:

import subprocess
import os
# 输入:device_id(设备ID,如"emulator-5554"),local_path(本地保存路径)

# 输出:截图本地文件路径
def adb_screenshot(device_id, local_path):
# 在手机内截图

remote_path = "/sdcard/shadowbot_screen.png"
subprocess.run(f"adb -s {device_id} shell screencap -p {remote_path}", shell=True)
# 拉到电脑
subprocess.run(f"adb -s {device_id} pull {remote_path} {local_path}", shell=True)

# 删除手机上的临时文件
subprocess.run(f"adb -s {device_id} shell rm {remote_path}", shell=True)
return local_path

screenshot_path = adb_screenshot(device_id, local_path)
如果投屏清晰度足够,直接用影刀的手机指令“获取屏幕截图”更省事,不需要手动写ADB。
图片预处理的五个调参,把识别率从六成拉到九成
拿到手机截图后,直接扔给OCR,识别率通常不理想。手机屏幕上的文字往往背景复杂(渐变、图片、网格线),字体小,对比度不如电脑屏幕。OCR的核心原理是识别“清晰的高对比度文字”,预处理的目的就是把图片变成黑底白字或白底黑字,尽可能去除背景干扰。
影刀内置OCR指令的“图像预处理”区域,提供了几个关键参数:
二值化(阈值): 这是最关键的参数。把图片中亮度高于阈值的像素变成白色,低于阈值的变成黑色。阈值设得太高,文字会被当成背景滤掉;设得太低,背景噪点会保留。手机截图一般默认阈值偏中性(127左右),需要根据实际情况调整。
- 白底黑字的商品列表,阈值设120-140,保证文字清晰。
- 深色模式下的黑底白字,阈值设80-100,否则白字可能被当背景。
操作细节: 在影刀的OCR识别指令里,先拿一张典型截图做测试。拖入指令后,勾选“二值化”,拖动阈值滑块,观察右侧的预览效果。目标是文字边缘锐利、背景噪点最少。找到最佳阈值后,固定下来用在所有同类截图里。
反色: 勾选后黑白互换。如果原始截图是黑底白字,OCR默认按白底黑字识别,反色后效果更好。
去噪点: 去掉图片中的孤立噪点。对于手机截图,如果背景有网格线或颗粒感,勾选去噪点能提升识别率。但去噪也可能把小字体文字的一笔一画当成噪点去掉,所以小字体慎用。
缩放: 如果图片中的文字太小(比如高分辨率屏幕上的小字),OCR难以识别。可以在预处理时把图片放大到1.5倍或2倍。影刀的OCR指令支持设置“图片缩放比例”。但放大也会增加处理时间,按需使用。
区域截取: 不要对整张手机屏幕做OCR,只截取包含目标文字的那一小块区域。这不仅减少干扰,还能避免页面上其他文字被误识别。在影刀里,先用“截图指定区域”截出价格区域,再传给OCR。
用Python Pillow库做更精细的预处理
影刀内置的预处理功能有限,如果需要更精细的处理(比如灰度化、对比度增强、自定义滤波器),可以在Python里用Pillow库对图片预处理后,再传给OCR或打码平台。
安装Pillow: 在影刀的Python环境管理里安装 Pillow 包。
预处理流程: 灰度化→对比度增强→二值化→保存。
from PIL import Image, ImageEnhance
# 输入:input_path(原始截图路径),output_path(处理后图片路径)
# 输出:处理后图片路径
img = Image.open(input_path)
# 1. 转灰度图,去除颜色干扰
img = img.convert('L')
# 2. 增强对比度(1.5倍),让文字更黑、背景更白
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(1.5)
# 3. 二值化:阈值128,大于128的变白,否则变黑
img = img.point(lambda p: 255 if p > 128 else 0)
# 保存
img.save(output_path)
处理后的图片是纯粹的黑白图,背景全白,文字全黑,没有任何噪点。这种图扔给OCR,识别率极高。
什么时候用这个: 当影刀内置预处理调了各种参数还是不理想时,用Python预处理。它稍微多消耗一点时间,但效果最好。对于批量采集,可以在流程开始时预处理一批图片,然后统一OCR。
OCR识别引擎的选择:内置 vs 百度OCR vs tesseract
除了预处理,OCR引擎本身也影响识别率。
- 影刀内置OCR:方便,不需要额外配置,对清晰的白底黑字效果尚可。但抗干扰能力弱。
- 百度OCR(通用文字识别):识别率高,抗干扰强,每天有免费额度。需要网络,速度稍慢(约0.5-1秒)。适合关键字段的高精度识别,我在之前的文章里详细写过对接方法。
- Tesseract OCR(开源):需要本地安装,支持训练,但中文识别需要下载中文语言包。非技术背景配置稍麻烦。
对于手机自动化里的文字识别,我的实际搭配是:金额、手机号等关键数字用百度OCR,确保准确;标题、描述等长文本用影刀内置OCR或百度OCR,看免费额度;简单的是/否判断用影刀内置即可。
识别结果的校验与清洗
即使预处理和引擎都优化了,OCR依然可能出错。比如把“0”认成“O”,把“.”认成“,”。需要业务层面的校验。
- 数字识别:正则提取后,检查格式是否符合预期(如价格应有小数点,手机号应是11位)。不符合的,日志记录并重试或标记异常。
- 文本识别:检查是否包含明显乱码(连续多个特殊符号)。有的话,可能是图片截错或预处理过度。
- 二次确认:对于关键操作(如确认支付金额),可以截图→OCR→再截一次→再OCR,两次结果一致才采信。
手机截图OCR的完整影刀子流程封装
把以上步骤封装成一个 手机_OCR识别 子流程,入参:截图区域坐标或元素、识别类型(数字/文本)、是否使用百度OCR。出参:识别结果文本。
内部流程:
- 截图指定区域。
- 判断是否启用Python预处理,是则调用Python脚本处理。
- 判断使用哪种OCR引擎,调用对应识别子流程。
- 对结果进行校验清洗,返回。
这样,任何手机自动化流程需要识别文字时,只需调用这一个子流程,传入目标区域即可。后续优化预处理或切换OCR引擎,只改这一个子流程。
手机OCR常见问题速查
| 问题 | 原因 | 解决 |
|---|---|---|
| 识别数字经常漏掉小数点 | 二值化阈值过高,小数点被滤掉 | 降低阈值,或放大图片后再识别 |
| 投屏截图比原图模糊 | USB带宽或投屏质量设置 | 切换为screencap无损截图 |
| 中英文混合识别率低 | 语言模型混合,OCR混淆 | 百度OCR可指定语言,或分开识别 |
| 深色模式识别一团黑 | 未勾选反色 | 勾选反色或在Python里先反色 |
| 不同手机截图颜色差异大 | OLED vs LCD,色温不同 | 统一转灰度图后再二值化 |
推荐资源: Pillow库的官方文档里有丰富的图像处理示例。百度OCR控制台提供“在线体验”功能,上传图片可看到原始识别效果,方便对比预处理前后差异。影刀社区有用户分享的“手机截图OCR优化”子流程,集成了预处理和百度OCR切换功能,可以下载后直接使用。
#影刀RPA #RPA自动化 #手机自动化 #OCR #图像识别
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
