影刀RPA OCR文字识别实战图片转文字完整教程作者林焱 | 适用人群需要用影刀进行图片文字识别的 RPA 开发者 | 预计阅读时间9 分钟前言图片中的文字RPA 也能读做 RPA 经常会遇到这种情况验证码图片需要识别才能登录扫描件/PDF中的文字需要提取出来图片里的价格/型号需要采集名片/发票/证件上的信息要录入系统截图中的错误提示信息要读取这些场景都有一个共同点——信息在图片里不是文本。这时候就需要OCR光学字符识别技术了。影刀 RPA 内置了 OCR 能力可以让你在流程中直接调用把图片中的文字提取出来变成可处理的文本。一、OCR 是什么能做什么1.1 OCR 基本原理输入: 一张包含文字的图片 ┌──────────────────────┐ │ Hello World │ │ 你好世界 │ │ ¥199.00 │ └──────────────────────┘ ↓ OCR引擎处理 输出: Hello World\n你好世界\n¥199.00 简单说就是: 让计算机看懂图片里的字1.2 OCR 的典型应用场景场景输入输出价值验证码识别验证码图片文本字符自动登录发票/票据发票扫描件结构化数据财务自动化身份证/名片证件照片姓名/号码等信息录入截图文字提取程序截图错误日志文本自动化测试店群矩阵自动化突破运营极限|PDF扫描件| 图片型PDF | 可搜索文本 | 档案数字化 ||商品标签| 商品实拍图 | 名称/规格参数 | 电商采集 ||车牌识别| 车辆照片 | 车牌号 | 停车管理 ||手写体识别| 手写单据 | 电子文本 | 表单数字化 |二、影刀中调用 OCR2.1 基础用法识别一张图片# 方式1: 从文件路径识别 imagePath D:\\Images\\captcha.png ocrResult OCR_Recognize(imagePath) text ocrResult.Text # 识别出的全部文本 Log(识别结果: text) # 方式2: 从屏幕区域识别截屏后识别 region {x: 100, y: 200, width: 150, height: 50} screenshot ScreenCapture(region) ocrResult OCR_Recognize(screenshot) text ocrResult.Text # 方式3: 从网页元素截图识别 element FindElement(browser, #captcha-img) elementScreenshot ElementScreenshot(element) ocrResult OCR_Recognize(elementScreenshot)2.2 获取结构化结果# OCR返回的不只是纯文本还有丰富的结构化信息 ocrResult OCR_Recognize(invoice.jpg) 完整的识别结果 For Each block In ocrResult.Blocks # 按文本块(段落)遍历 Log(文本块: block.Text) Log(置信度: ToString(block.Confidence)) # 0~1, 越高越准 Log(位置: ( block.X , block.Y )) Log(大小: block.Width x block.Height) Next 按行遍历 For Each line In ocrResult.Lines Log(第 line.Index 行: line.Text) Next 按单词遍历 For Each word In ocrResult.Words Log(单词: word.Text (置信度: Format(word.Confidence*100, 0) %)) Next2.3 指定识别区域ROI当只需要识别图片的某个部分时# 整张图太大只识别其中一部分 roi { x : 50, # 左上角x坐标 y : 100, # 左上角y坐标 width : 300, # 区域宽度 height : 80 # 区域高度 } result OCR_RecognizeWithROI(imagePath, roi) # 典型应用验证码通常在固定位置 captchaROI {x:120, y:45, width:80, height:30} captchaText OCR_RecognizeWithROI(screenImage, captchaROI)三、实战案例1自动识别验证码并登录这是 RPA 中最常见的 OCR 场景之一Function 自动登录带验证码(loginUrl As String, username As String, password As String) browser 创建浏览器() Navigate(browser, loginUrl) 第1步: 填写账号密码 SetInputValue(#username, username) SetInputValue(#password, password) 第2步: 识别并填写验证码 maxRetry 5 # 最多尝试5次 For attempt 1 To maxRetry 刷新验证码图片每次都要刷新获取新的 Click(#captcha_refresh_icon) # 点击刷新按钮 Wait(1500) # 等待新验证码加载 截取验证码图片 captchaElement FindElement(browser, #captcha_image) captchaImg ElementScreenshot(captchaElement) OCR识别 ocrResult OCR_Recognize(captchaImg) captchaText ocrResult.Text.Trim() Log([CAPTCHA] 第 ToString(attempt) 次识别: captchaText (置信度: Format(ocrResult.AvgConfidence*100, 0) %)) 填入识别结果 SetInputValue(#captcha_input, captchaText) 点击登录 Click(#login_button) Wait(2000) 检查是否登录成功 If 当前URL ! loginUrl Or Not Contains验证码错误 Then Log([SUCCESS] 登录成功! (尝试 ToString(attempt) 次)) Return browser # 返回已登录的浏览器对象 Else If attempt maxRetry Then Log([RETRY] 验证码可能错了重试...) ClearInput(#captcha_input) End If End If Next 所有尝试都失败了 Log([FAIL] 验证码识别 maxRetry 次均未通过需要人工介入) ScreenshotSave(browser, login_failed.png) SendAlert(验证码识别失败请手动登录, admincompany.com) Return null End Function提升验证码识别率的技巧方法说明效果图像预处理二值化/去噪/增强对比度提升20-40%多次识别取众数识别3-5次取出现最多的结果提升30%结合验证规则已知是4位纯数字/字母过滤非法结果使用专业OCR引擎如百度OCR/Tesseract比内置引擎更准# 多次识别取众数的实现 results New List() For i 1 To 3 ClickRefreshCaptcha() Wait(1200) img CaptureCaptcha() text OCR_Recognize(img).Text.Trim() results.Add(text) Next 取出现次数最多的那个 finalText Mode(results) # 取众数 Log(最终使用: finalText)四、实战案例2发票信息自动提取Function 提取发票信息(invoiceImagePath As String) As Object result New Object() # 全图OCR ocrResult OCR_Recognize(invoiceImagePath) allText ocrResult.Text Log([OCR] 全文:\n allText) 关键字段提取 发票代码通常是10位数字 invoiceCode 正则匹配(allText, 发票代码[:]\s*(\d{10,12})) result.invoiceCode IfEmpty(invoiceCode, 正则匹配(allText, \d{10,12})[0]) 发票号码 result.invoiceNo 正则匹配(allText, 发票号码[:]\s*(\d{8})) 开票日期 result.date 正则匹配(allText, 开票日期[:]\s*(\d{4}年?\d{1,2}月?\d{1,2}日?)) 销方名称 result.sellerName 正则匹配(allText, 销售方[名称:]*[:]?\s*(.?)(?:\n|$)) 购方名称 result.buyerName 正则匹配(allText, 购买方[名称:]*[:]?\s*(.?)(?:\n|$)) 金额价税合计 totalMatch 正则匹配(allText, (?:价税合计|合计)[(]?[大写]*?[)]?[:]*\s*[¥]?\s*([\d,]\.?\d*)) result.totalAmount 清理数字(totalMatch) 不含税金额 amountMatch 正则匹配(allText, [金额合计][:]?\s*[¥]?\s*([\d,]\.?\d*)) result.amount 清理数字(amountMatch) 税额 taxMatch 正则匹配(allText, 税额[:]?\s*[¥]?\s*([\d,]\.?\d*)) result.taxAmount 清理数字(taxMatch) 输出提取结果 Log( 发票信息提取结果 ) Log(发票代码: result.invoiceCode) Log(发票号码: result.invoiceNo) Log(开票日期: result.date) Log(销售方: result.sellerName) Log(购买方: result.buyerName) Log(金额: ¥ result.amount) Log(税额: ¥ result.taxAmount) Log(价税合计: ¥ result.totalAmount) Return result End Function处理批量发票# 对文件夹中的所有发票图片批量提取 invoiceDir D:\\Invoices\\2024年6月\\ images GetFileList(invoiceDir, *.jpg;*.png;*.jpeg) excel CreateExcel() WriteHeaderRow(excel, [文件名,发票代码,发票号码,开票日期,销售方,购买方,金额,税额,价税合计]) For Each image In images Try info 提取发票信息(image.FullName) excelRow [ image.Name, info.invoiceCode, info.invoiceNo, info.date, info.sellerName, info.buyerName, info.amount, info.taxAmount, info.totalAmount ] AppendRowToExcel(excel, excelRow) Log([OK] image.Name → 提取成功) Catch ex AppendRowToExcel(excel, [image.Name, 提取失败: ex.Message]) Log([FAIL] image.Name : ex.Message) End Try Next SaveAndClose(excel, D:\\Output\\发票信息_ 今天日期 .xlsx)五、实战案例3身份证信息自动录入Function 身份证OCR录入(idCardImagePath As String) 影刀可能有专门的身份证识别接口 如果有就用专用接口准确率更高 idInfo OCR_IDCard(idCardImagePath) # 专用身份证识别 If idInfo ! null Then 直接拿到结构化字段 name idInfo.Name # 姓名 gender idInfo.Gender # 性别 ethnicity idInfo.Ethnicity # 民族 birthDate idInfo.BirthDate # 出生日期 address idInfo.Address # 地址 idNumber idInfo.IDNumber # 身份证号 authority idInfo.IssuingAuthority # 签发机关 validDate idInfo.ValidPeriod # 有效期 Else 回退到通用OCR ocrResult OCR_Recognize(idCardImagePath) rawText ocrResult.Text 用正则从通用OCR结果中解析 name 正则提取(rawText, 名\s*(.)\n性) gender 正则提取(rawText, 别\s*(男|女)) idNumber 正则提取(rawText, \d{17}[\dXx]) address 正则提取(rawText, 住址\s*(.?)\n公民身份) End If 自动填表 SetInputValue(#real_name, name) SelectByText(#gender, gender) SetInputValue(#id_card_number, idNumber) SetInputValue(#birth_date, birthDate) SetInputValue(#address, address) 如果身份证有效期需要单独填 If validDate ! Then parts Split(validDate, -) SetInputValue(#valid_from, parts[0]) If parts.Length 1 Then SetInputValue(#valid_to, parts[1]) End If End If Log([IDCARD] 已完成身份证信息录入: name ( idNumber )) End Function六、提高 OCR 准确率的技巧temu店群自动化报活动案例6.1 图像预处理原始图片往往不理想预处理能大幅提升识别率: 1. 灰度化 — 彩色转灰度减少干扰信息 2. 二值化 — 黑白分明去除背景噪点 3. 去噪 — 消除椒盐噪声/斑点 4. 倾斜校正 — 校正拍摄角度偏差 5. 对比度增强 — 让文字和背景差异更大 6. 缩放放大 — 小字放大会更好识别 # 在影刀中的预处理操作 img LoadImage(photo.jpg) img GrayScale(img) # 灰度化 img BinaryThreshold(img, 128) # 二值化 img Denoise(img) # 去噪 img Deskew(img) # 倾斜校正 img Resize(img, width * 2) # 放大2倍 result OCR_Recognize(img) # 用预处理后的图识别6.2 不同类型文字的策略文字类型推荐策略预期准确率打印体清晰直接识别95-99%打印体模糊/倾斜预处理后识别85-95%手写体工整手写体专用模型80-90%手写体潦草很难保证准确率60-75%特殊字体艺术字/印章需要训练自定义模型视情况而定验证码干扰线/噪点预处理多次尝试70-90%6.3 当内置 OCR 不够用时方案1: 调用云端OCR API百度/腾讯/阿里云 优点: 准确率高支持多语言 缺点: 需要网络有调用费用 # 百度OCR示例 baiduResult BaiduOCR(imagePath, [general]) text baiduResult.words_result[0].words 方案2: 本地部署Tesseract 优点: 免费本地运行无需网络 缺点: 中文准确率一般需配置语言包 # Tesseract示例 tesseractResult TesseractOCR(imagePath, language : chi_simeng) 方案3: 使用影刀官方提供的AI OCR能力 优点: 和影刀深度集成最方便 缺点: 可能是付费功能 # 影刀AI-OCR示例 aiResult AI_OCR_Recognize(imagePath, mode : accurate)七、OCR 常见问题排查问题原因解决方法识别出乱码图片分辨率太低放大图片或重新截取高清版中英文混杂时中文丢失引擎语言包不全安装中文英文语言包数字识别错0/O, 1/I/l字体相似导致混淆后加校验逻辑如身份证号最后一位校验表格识别错位表格线干扰文字检测先检测表格结构再逐格识别速度很慢图片太大压缩或裁剪到需要的区域特定字体无法识别训练库中没有该字体添加自定义训练样本总结OCR 是让 RPA 从只能处理文字进化到能理解图片内容的关键能力。掌握之后你的适用场景会大幅扩展有 OCR vs 无 OCR能做的场景❌ 没有 OCR只能操作标准化的网页/桌面元素✅ 有 OCR验证码登录、发票处理、证件录入、截图分析……学习建议先从影刀内置 OCR 开始熟练基础操作重点练习「验证码识别」「发票提取」这两个高频场景遇到复杂场景再考虑接入第三方 OCR API始终记住图像预处理是提升准确率最有效的手段本文作者林焱专注影刀RPA教程与实战分享。OCR让RPA拥有了眼睛能读懂图片里的每一个字有问题欢迎评论区留言看到必回