影刀RPA进阶教程:手机自动化中的截图与OCR识别优化

用影刀RPA做手机自动化,最绕不开的两个操作就是截图和OCR。手机App没有XPath,很多元素拿不到属性,只能靠截图后识别文字来定位。但手机截图和电脑截图完全是两回事——分辨率五花八门、字体小、背景花,直接用影刀内置OCR识别,准确率经常惨不忍睹。我之前做拼多多移动端采集的时候,截下来的商品价格用默认OCR识别,经常把“29.9”认成“29 9”或“29g”,清洗得怀疑人生。

picture.image 后来我把手机截图的整个链路优化了一遍——从ADB截图命令的选择、图片的预处理、到OCR参数的调优——识别准确率从六成提到了九成以上。这篇文章就把这些优化技巧完整分享出来,如果你也在用影刀做手机自动化,这些细节能帮你省掉大量识别失败后的反复调试。

手机截图的三种方式,速度和画质差异巨大

picture.image

影刀手机自动化模块有内置的截图指令,但底层用的是ADB命令。ADB截图有两种方式,速度和质量差别很大。

方式一:screencap 命令(影刀内置默认方式)。 在手机上截取PNG格式的屏幕截图,保存在手机存储里,然后用 pull 命令拉到电脑上。优点是画质无损,缺点是速度慢——截图+传输一张1080p的图要1-2秒。

picture.image

方式二:直接截取实时画面(影刀手机投屏窗口的截图)。 影刀连接手机后,电脑上会有一个实时投屏画面。用影刀的“截取可视区域”指令直接截这个投屏窗口。优点是速度快(瞬间完成),缺点是画质受投屏码率影响,可能比原图模糊。

方式三:screencap 加压缩。screencap -p 输出PNG,但可以通过参数降低分辨率。如果只需要识别某一块区域,可以先截全屏再裁剪。

picture.image

选型建议: 如果OCR目标是文字(如价格、标题),且投屏画质清晰(USB连接通常无损),用投屏截图最快。如果目标是小字体或模糊验证码,用无损的 screencap 命令。下面是一个在影刀里用Python执行ADB截图并拉到本地的脚本:


![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/e0f639231d0c4d63891cce757b7f737e~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783636421&x-signature=aID4GhYB7BNWkOk2iMFIQGodNmk%3D)
import subprocess
import os

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

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/70731c741191443f82d37183490925ec~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783636421&x-signature=WKxYqYAgblFkKoJm9q0A%2FYXrdPw%3D)
# 输出:截图本地文件路径

def adb_screenshot(device_id, local_path):
    # 在手机内截图
    
![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/f9c9f2d1a6704b1eb65cc82168c479ff~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783636421&x-signature=XMfLYHbivV1oOvaLwMD8uy2NTyw%3D)
    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)
    
![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/fe6fee2db88d4bfb948656c836f85d68~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783636421&x-signature=WiSO%2BcMlXb%2FKYCIxGtiNM2WR06o%3D)
    # 删除手机上的临时文件
    subprocess.run(f"adb -s {device_id} shell rm {remote_path}", shell=True)
    return local_path


![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/a8abdd0dbfe04df29d181acd42ebeb0f~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1783636421&x-signature=%2FvW14Kq9CIWiLYNAb4ilj71ENbs%3D)
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。

picture.image

用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。出参:识别结果文本。

内部流程:

  1. 截图指定区域。
  2. 判断是否启用Python预处理,是则调用Python脚本处理。
  3. 判断使用哪种OCR引擎,调用对应识别子流程。
  4. 对结果进行校验清洗,返回。

这样,任何手机自动化流程需要识别文字时,只需调用这一个子流程,传入目标区域即可。后续优化预处理或切换OCR引擎,只改这一个子流程。


手机OCR常见问题速查

问题原因解决
识别数字经常漏掉小数点二值化阈值过高,小数点被滤掉降低阈值,或放大图片后再识别
投屏截图比原图模糊USB带宽或投屏质量设置切换为screencap无损截图
中英文混合识别率低语言模型混合,OCR混淆百度OCR可指定语言,或分开识别
深色模式识别一团黑未勾选反色勾选反色或在Python里先反色
不同手机截图颜色差异大OLED vs LCD,色温不同统一转灰度图后再二值化

推荐资源: Pillow库的官方文档里有丰富的图像处理示例。百度OCR控制台提供“在线体验”功能,上传图片可看到原始识别效果,方便对比预处理前后差异。影刀社区有用户分享的“手机截图OCR优化”子流程,集成了预处理和百度OCR切换功能,可以下载后直接使用。


#影刀RPA #RPA自动化 #手机自动化 #OCR #图像识别

作者:林焱

本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。

0
0
0
0
评论
未登录
暂无评论