AI 驱动文档
您想了解什么?
OCR(光学字符识别)
时间:30-45 分钟
OV80i 可以直接从摄像头图像中读取印刷文本、序列号、日期码以及其他字母数字字符,使用预训练的 OCR 模型。与分类器与分割器不同,OCR 需要的训练数据为零。它可开箱即用。
OCR 在以下场景中尤为有用:
- 验证序列号或批次代码是否与预期值匹配
- 确认标签存在且可读
- 读取日期/到期代码以实现可追溯性
- 在装配过程中检查组件上的部件编号
OCR 仅在 OV80i 上可用。OV20i 和 OV10i 不支持 OCR。
OCR 的工作原理
OV80i 使用两阶段 AI 流水线进行文本识别:
- Text Detection:在 ROI 内定位文本所在区域。对检测到的每个单词或文本区域返回边界框。
- Text Recognition:读取每个检测到的边界框内的字符,并返回带有置信分数的文本字符串。
整个过程在摄像头的 NVIDIA Jetson Orin NX GPU 上运行。不需要云端连接。
该模型识别的字符集包括:
- 数字 (0-9)
- 拉丁字母 (A-Z, a-z, 带重音的字符)
- 常见标点符号和符号
- 希腊字母
- 货币符号
- 数学运算符
字符集是固定的,无法自定义。该模型支持大约 480 个字符,覆盖大多数用拉丁字母语言印刷的工业文本。
先决条件
在设置 OCR 之前,您需要一台具备以下条件的相机:
- 已物理安装并稳定
- 已连接到网络并可在浏览器中访问
- 对带有文本的部件进行了聚焦
如果尚未完成,请先按照入门指南操作:
步骤 1:创建新配方
每次检查都从一个配方开始。配方是一个完整的软件包:图像设置、对齐、检查区域、AI 模块和输出规则。
- 在左侧栏导航至 所有配方
- 在右上角点击 + 新建
- 给你的配方起一个描述性名称(如 “Serial Number Check”、“Label Verification”)
- 点击 启用 使其成为活动配方,然后点击 编辑 打开配方编辑器

配方编辑器展示完整的检测流水线。您将从左到右依次进行:
- 成像设置(摄像头设置)
- 图像对齐与检查设置(模板、ROI)
- AI 模块(Classification、Segmentation、OCR、Measurement)
- 设定通过/失败及 IO 逻辑(输出规则)
关于配方创建的详细演练,请参阅 创建第一项检查.
步骤 2:配置成像设置
良好的图像质量是实现准确 OCR 的基础。文本必须清晰可见,且对比度要高。
- 点击 配置成像 或切换到 成像设置 标签
- 在观看实时预览时,调整以下设置:
| 设置项 | OCR 目标 |
|---|---|
| 曝光 | 足以清晰看到所有文本。太暗,字符会融入背景;太亮,白色标签会被过曝。 |
| 增益 | 尽量保持在最低水平。高增益会引入噪声,看起来像文本伪影。 |
| 伽玛 | 调整以改善文本与背景之间的对比度。 |
| 对焦 | 文本必须清晰锐利。如果字符看起来模糊,请调整 C‑mount 镜头对焦环。 |
OCR 的识别准确性在很大程度上依赖于图像质量。相机图像中的文本必须清晰可见,且与背景形成良好对比。深色文本在浅色背景上效果良好,浅色文本在深色背景上也能良好工作。避免:
- 光线不均,导致字符上出现阴影
- 高光标签上的眩光
- 低曝光,使文本与背景难以区分
放大实时预览中的文本区域。你能清晰读出每一个字符吗?如果你不能读出它,AI 也读不出。
如需关于所有成像设置的详细指南,请参阅 图像设置.
第 3 步:设置模板对齐
Template alignment 告诉相机如何跟踪工件的位置和方向。这一步很关键,因为工件在传送带或治具上的落点并不总是完全一致。
- 导航到 Template Image and Alignment 选项卡
- 将工件放入摄像机的视野
- 点击 Capture Template 以获取参考图像
- 在始终存在且易于识别的特征上绘制 2-3 个小模板区域(例如角落、徽标、安装孔)
尽量让模板区域在工件上相距越远越好。这样可以显著降低对齐过程中的角度抖动。两个区域若靠得太近会导致旋转稳定性差;两个区域在对角线的对角角上则提供出色的稳定性。
如果跳过对齐,OCR ROI 将被固定在绝对像素位置。工件的任何移动都会使 ROI 漏读文本。请始终为生产使用设置对齐。
有关模板对齐的详细指南,请参见 Alignment.
第 4 步:创建 OCR 检查区域(ROIs)
现在您将确切定义相机在工件上应查找文本的位置。这是提升 OCR 准确性的最关键步骤。
4a. 转到检查设置
- 在 Recipe Editor 中点击 Inspection Setup 选项卡
- 您将看到带有模板图像的 Inspection Editor
4b. 添加 OCR 模型
- 在右侧面板,查找 Models 区域
- 如果未看到列出 OCR 模型,请点击底部的 Add 按钮并选择 OCR
- OCR 模型将出现在 Models 列表中
你在一个 recipe 中只能有 one OCR block per recipe。不过,你可以在该块中创建多个 ROI,以便从工件的不同区域读取文本。
4c. 创建一个 OCR ROI
- 确保在 Models 列表中所选的 OCR 模型行处于选中状态(高亮显示)
- 在 Region of Interest 区域点击 Add ROI
- 图像上会出现一个新的矩形 ROI
- 将 ROI 拖动定位在你要读取的文本上方
- 通过拖动角手柄调整大小

4d. 设置 ROI 方向
这是最重要的一点。ROI 的方向必须与要读取文本的方向一致。
OCR 引擎会使用 ROI 的角度裁剪图像,然后将裁剪区域当作水平文本来处理。如果 ROI 角度和文本角度不一致,引擎将尝试读取旋转文本,结果会变成垃圾信息。
示例:
- 文本水平从左到右:ROI 角度应为 0 度
- 文本顺时针旋转 90 度:ROI 角度应为 90 度
- 文本颠倒:ROI 角度应为 180 度
- 文本呈 45 度角:ROI 角度应为 45 度
如何旋转 ROI:
- 通过单击选中 ROI
- 使用 ROI 角落处的旋转手柄,或者
- 在画布底部的定位字段中直接设置角度值
位置栏显示:H(高度)、W(宽度)、X 与 Y(位置),以及以度为单位的 angle。

4e. 正确设定 ROI 大小
- 尽量让 ROI 紧贴文本区域。 额外的背景会引入噪声,可能导致误检。
- 在文本周围包含一个小边距(10-20 像素),以防字符被边缘裁剪。
- 不要包含你不想读取的其他文本。 如果存在多个文本区域,请为每个区域创建独立的 ROI。
如果需要从零件的多个区域读取文本(例如序列号和日期码),请为每个区域创建单独的 ROI。这会为你提供独立的结果,并使通过/失败规则更易配置。
4f. 创建额外的 ROIs(可选)
为每个需要读取的文本区域重复步骤 4c-4e。每个 ROI 在 Region of Interest 列表中获得自己的名称。通过双击名称将它们重命名为更具描述性的名称(例如 "Serial Number"、"Date Code"、"Part Label")。
使用复制粘贴来复制 ROI。名称会自动自增(例如 "ROI"、"ROI (1)"、"ROI (2)")。
步骤 5:配置和测试 OCR 模块
5a. 进入 OCR 模块
在 Recipe Editor 的选项卡栏中点击 OCR Block 选项卡。左侧将看到摄像头画面,右侧为设置面板。

右侧面板显示:
- 光学字符识别(OCR)描述
- 这是一个预训练模型,无需训练数据
- 使用 Live Preview 或 Test 进行验证的说明
5b. 启用实时预览
在右上角勾选 “Live Preview Mode” 复选框。摄像头将实时处理帧。

启用 Live Preview 后,你将看到:
- 处理时间:OCR 模型每帧耗时
- 延迟:包括图像捕获和渲染在内的总往返时间
- 叠加在摄像头画面上的文本区域周围的紫色边框
- 在每个边框上显示的检测文本标签
- 右侧用于调整检测设置的参数面板
5c. 验证 OCR 是否正确读取
开启 Live Preview 时,将部件放在摄像头下并进行以下验证:
- 是否检测到所有文本区域? 你应在 ROI 的每个单词/短语周围看到紫色边框。
- 文本是否被正确读取? 标签应与部件上的实际文本相匹配。
- 是否存在误检? 非文本区域是否被错误识别为文本?
- 将部件稍微移动。 OCR 在不同位置是否仍然工作?(这是对齐测试)
如果文本未被检测到或被误读,请检查:
- ROI 方向是否与文本方向一致(请参见步骤 4d)
- ROI 是否正确定位在文本之上
- 图像质量是否良好(对焦清晰、对比度良好、光线均匀)
- 尝试调整 OCR 参数(见下节)
步骤 6:调整 OCR 参数
开启 Live Preview 时,右侧面板显示四个可调参数。这些参数控制文本检测阶段(定位文本所在位置),而非识别阶段(读取文本内容)。
| 参数 | 默认值 | 作用说明 |
|---|---|---|
| 文本分割阈值 | 0.10 | 检测器对区域包含文本的置信度阈值。数值越高,检测越严格,假阳性越少,但可能漏检微弱文本。数值越低,灵敏度越高,能检测到微弱文本,但可能出现假检出。取值范围:0.0 至 1.0。 |
| Unclip Ratio(展开比) | 4.0 | 将检测到的边界框从文本轮廓向外扩展的程度。数值越高,框越大。若框沿大字符边缘裁剪,请增大。若相邻单词合并成一个框,请减小。 |
| Unclip Ceiling(展开上限像素) | 20 | 从展开中允许的最大像素扩展。这个上限防止在大文本上进行大比例扩展导致框变得过大。如果在提高 Unclip Ratio 后仍然出现大文本被裁剪,请提升。 |
| Min Text Area(最小文本区域面积) | 500 | 检测文本区域的最小面积(以像素为单位)。小于此值的区域将被当作噪声舍弃。若检测到的小伪影被误识别为文本,请增大。若有效的小文本被过滤,请减小。 |
从默认值开始。仅在 Live Preview 中看到特定问题时再进行调整:
| 问题 | 需要调整的参数 | 调整方向 |
|---|---|---|
| 非文本区域被检测为文本 | 文本分割阈值 | 增加 |
| 有效文本被漏检 | 文本分割阈值 | 减少 |
| 边界框裁剪字符边缘 | Unclip Ratio | 增加 |
| 相邻单词合并成一个框 | Unclip Ratio | 减少 |
| 大文本时边框过大 | Unclip Ceiling | 减少 |
| 提高 Unclip Ratio 后大文本仍被裁剪 | Unclip Ceiling | 增加 |
| 噪声/伪影被识别为文本 | Min Text Area | 增加 |
| 小的有效文本被过滤掉 | Min Text Area | 减少 |
参数变更将在 Live Preview 中即时生效,便于迭代调优。这些参数也适用于生产捕获,而不仅仅在预览阶段。
步骤 7:使用捕获图像进行测试
在使用 Live Preview 调优参数后,在一系列生产样品上验证 OCR。
7a. 使用测试面板
- 关闭实时预览模式(取消勾选复选框)
- 点击 Test 按钮

- 点击 Select From Library 以从先前捕获的检测中选择图像,或点击 Upload Captures 以上传电脑中的图像
- 对每个 ROI,测试结果显示如下:
- Detected Text(以等宽字体/代码格式显示)
- Confidence(颜色编码标签:绿色高于 80%、橙色高于 50%、红色低于 50%)
- Detection Count(检测到的文本区域数量)
7b. 需要关注的要点
- Consistency:同一部件在每次读取时,OCR 是否读取相同文本?
- Accuracy:检测到的字符串与部件上的实际文本是否一致?
- Confidence scores:它们是否始终高于 80%?信心不足通常表明图像质量问题。
- Edge cases:测试带有污渍、褪色或部分遮挡文本的部件。
如果信心分数持续低于 80%,请重新查看您的图像设置(Step 2)。OCR 的准确性直接受图像质量影响。再多的参数调整也无法弥补模糊或光线不足的图像。
步骤 8:设置通过/失败规则(IO Logic)
在 OCR 能正确检测文本后,您需要定义何谓通过(pass)或失败(fail)。导航至 IO Logic 选项卡。
基本模式
基本模式提供一个基于规则的简易 UI,用于 OCR 通过/失败逻辑。不需要 Node-RED 知识。

页面显示:
- 左侧的 Preview / Test 标签页(用于将结果可视化以对照规则)
- 右侧的 OCR Rules 区域
- 激活规则的 Save & Deploy 按钮
- 切换到 Node-RED 的 Advanced Mode 按钮
创建规则
单击 + Add rule 以创建通过/失败规则。每条规则包含三个字段:

| Field | Description |
|---|---|
| ROIs | 要评估的 ROI。单击展开并选择 "All ROIs" 或选择特定区域。 |
| Operator | 要对检测文本执行的比较操作。 |
| Text | 要比较的期望文本字符串。 |
可用运算符
单击 Operator 下拉框以查看四个选项:

| Operator | Behavior | Example use case |
|---|---|---|
| = (equals) | 所有检测文本拼接在一起必须完全匹配预期文本 | 验证序列号应为“SN-2025-0042” |
| != (not equals) | 拼接后的文本不得匹配预期文本 | 拒绝具有已知错误代码的部件 |
| includes | 拼接后的文本必须包含预期文本作为子字符串 | 检查标签中是否包含单词“SAFETY” |
| not includes | 拼接后的文本不得包含预期文本 | 确保不会出现已弃用的产品代码 |
文本如何比较
当一个 ROI 包含多个检测到的文本区域(例如探测器将 "LOT" 和 "2025" 视为独立单词)时,所有单独的文本字符串在比较之前将用空格连接。
因此,如果探测器发现三个文本区域,分别读作 "LOT"、"2025" 和 "A1",则连接后的文本将变为 "LOT 2025 A1"。你的规则将针对这个完整的连接字符串进行比较。
这意味着:
- 针对
"LOT 2025 A1"的 equals 规则将通过 - 针对
"2025"的 includes 规则将通过 - 针对仅
"LOT"的 equals 规则将失败(因为连接后的文本包含的不止 "LOT")
多个规则
你可以通过再次点击 + Add rule 添加多条规则。所有规则均使用 AND 逻辑:只有所有规则通过,OCR 检查才会通过。如果任一规则失败,整个检测将失败。
ROI 选择

单击 ROIs 下拉菜单以选择规则应用的区域:
- All ROIs:规则对来自所有 OCR 区域的文本进行合并评估
- Specific ROI:展开按名称选择单独的 ROI(这就是在步骤 4f 中为 ROI 命名时很重要的原因)
保存并部署
配置完规则后,点击 Save & Deploy 以激活它们。规则将立即对所有未来的检测生效。
高级模式(Node-RED)
对于 Basic Mode 无法处理的更复杂的通过/失败逻辑,请切换到 Advanced Mode。
单击 Advanced Mode 按钮以查看确认对话框:

对话框说明:
- Advanced Mode 使用完整的 Node-RED 可视化编程环境
- 将停用所有 Basic Mode 规则
- 您可以随时切换回 Basic Mode
单击 Switch to Advanced Mode(如果您已处于 Advanced Mode,按钮将显示 Basic Mode)。

在 Advanced Mode 中,您将看到带有预构建节点的 Node-RED 流画布,包括:
- All Block Outputs:接收来自所有 AI 模块(classification、segmentation、OCR、measurement)的结果
- Check OCR(或类似):包含用于评估 OCR 结果的 JavaScript 函数节点
- Classification Block Logic / Format Data for PLC / Trigger:用于集成的其他输出节点
- Inspection Pass/Fail:最终通过/不通过的判定
- Save to Library:存储结果
Node-RED 中的 OCR 输出载荷
在 Advanced Mode 中,OCR 结果可在 msg.payload.ocr 对象中获得。这使您能够对每一次检测进行完整的编程访问:
{
"predictions": [
{
"roi_id": 1,
"roi_name": "Serial Number",
"center_x_global": 450,
"center_y_global": 220,
"angle_global": 90,
"search_area_id": 1,
"detections": [
{
"text": "SN-2025-0042",
"confidence": 0.95,
"roi_bbox": {
"x": 10,
"y": 5,
"width": 120,
"height": 30,
"angle": 0
},
"global_bbox": {
"x": 450,
"y": 220,
"width": 120,
"height": 30,
"angle": 90
}
}
]
}
]
}
| 字段 | 描述 |
|---|---|
| roi_id | 产生此结果的 ROI 的数字 ID |
| roi_name | 您为 ROI 指定的名称(e.g., "Serial Number") |
| center_x_global / center_y_global | ROI 在全帧坐标中的中心位置 |
| angle_global | ROI 在全帧中的旋转角度 |
| search_area_id | ROI 所属的检测类型 / 搜索区域 |
| detections | 在该 ROI 内检测到的单个文本检测的数组 |
| detections[].text | 识别的文本字符串 |
| detections[].confidence | 识别置信度,从 0.0 到 1.0(已裁剪) |
| detections[].roi_bbox | 相对于 ROI 裁剪原点的边界框位置 |
| detections[].global_bbox | 全帧中的边界框位置(考虑 ROI 旋转与对齐) |
使用 msg.payload.ocr.predictions[0].detections.map(d => d.text).join(" ") 来获取与 Basic Mode 用于比较的相同连接文本字符串。
使用 Advanced Mode,您可以:
- 使用 JavaScript 对检测到的文本应用正则表达式模式
- 按置信度阈值筛选检测结果
- 将 OCR 结果与 classification/segmentation 结果结合以实现复杂逻辑
- 将 OCR 文本格式化为 PLC 输出(例如,通过 EtherNet/IP 发送检测到的序列号)
- 根据 OCR 内容向 Microsoft Teams 或电子邮件发送自定义消息
有关 Node-RED 的详细指南,请参见 Node-RED Basics.
您可以随时通过 IO Logic 页面顶部的切换按钮在 Basic Mode 与 Advanced Mode 之间切换。切换到 Basic Mode 时,任何已部署的 Node-RED 逻辑将被停用并替换为 Basic Mode 规则。切换回去时,Node-RED 流将被还原。
步骤 9:部署配方
当 OCR 设置完成并测试通过后:
- 返回 配方编辑器(在左侧栏中点击 Recipe Editor)
- 点击右下角的紫色 Deploy Recipe 按钮
- 配方现已激活并正在运行检测
查看结果
HMI
HMI 页面显示实时检测结果。当 OCR 激活时,您将看到:
- 摄像头实时画面,检测到的文本周围有紫色边框
- 显示读取内容的文本标签
- 基于 IO Logic 规则的通过/失败状态
- 运行统计:总检测次数、通过、失败、良率百分比

库
在左侧栏中导航至 Library 以查看过往捕获的存储结果。每条记录显示:
- 带有 OCR 叠加层的捕获图像
- 每个 ROI 的检测文本
- 置信度分数
- 通过/失败结果
故障排除
未检测到文本
| Possible cause | Fix |
|---|---|
| ROI not positioned over text | Reposition the ROI in Inspection Setup |
| ROI orientation doesn't match text | Rotate the ROI to align with the text direction (Step 4d) |
| Text too small in the image | Move the camera closer or use a longer focal length lens |
| Text too small relative to ROI | Make the ROI tighter around the text area |
| Min Text Area too high | Lower the Min Text Area parameter |
| Poor lighting / low contrast | Improve lighting to maximize contrast between text and background |
| Text is blurry | Adjust focus on the C-mount lens and verify the camera mount is stable |
| Alignment not set up | Text detection requires alignment. Set up template alignment (Step 3) |
检测到错误文本(误读)
| Possible cause | Fix |
|---|---|
| ROI orientation doesn't match text orientation | This is the #1 cause. Rotate the ROI to align with the text direction (Step 4d) |
| Low image quality or noise | Increase exposure, reduce gain, improve lighting |
| Text Segmentation Threshold too low | Increase to filter out false text detections |
| Overlapping text regions merging into one detection | Decrease Unclip Ratio to prevent box merging |
| Multiple lines of text in one ROI | Create separate ROIs for each line if reading order matters |
OCR 置信度持续偏低
| Possible cause | Fix |
|---|---|
| Poor lighting uniformity | Ensure even illumination across the text area |
| Glare or reflections on text (especially glossy labels) | Adjust lighting angle to eliminate specular reflections. Consider diffuse lighting. |
| Very small or highly stylized font | Move camera closer or use a longer focal length lens to increase text size in the image |
| Damaged, faded, or partially printed text | OCR can only read what the camera sees. If text is physically degraded, accuracy will be lower. |
| High gain in image settings | Reduce gain. High gain adds noise that looks like text artifacts. |
通过/失败规则未按预期工作
| Possible cause | Fix |
|---|---|
| Text is joined differently than expected | Enable Live Preview and check exactly what text is being detected. Remember, multiple detections are joined with spaces. |
| Using "equals" when "includes" is more appropriate | If you only care about a substring, use "includes" instead of "equals" |
| Rules not deployed | Click Save & Deploy after changing rules in Basic Mode |
| Wrong ROI selected in the rule | Check the ROIs dropdown in your rule to make sure it targets the correct region |
限制条件
- 每个配方最多只有一个 OCR 区块(该区块内可以包含多个 ROI)
- 仅限英语优化的模型:预训练模型针对基于拉丁字母的印刷文本进行了优化。手写文本、连笔字或非拉丁字母脚本(中文、日本、韩文、阿拉伯语)不受支持。
- Basic Mode 不支持 regex(正则表达式)或模式匹配:通过简单字符串比较来进行通过/不通过规则(等于、等于不、包含、不包含)。对于复杂的校验模式(例如匹配“SN-####-####”),请使用 Advanced Mode(Node-RED)并结合自定义 JavaScript regex。
- 不可自定义字符集:模型的 480 字符字典是固定的。例如,您不能将识别限制为数字-only。请使用 pass/fail 规则来验证期望的格式。
- 无法保证文本排序顺序:当在一个 ROI 内检测到多个文本区域时,它们按检测顺序(按轮廓)连接,并不一定按阅读顺序(从左到右、从上到下)。如读取顺序重要,请为每行文本使用单独的 ROI。
- 仅限预训练模型:与分类和分割不同,OCR 模型不能针对您特定的字体或文本样式进行再训练或微调。它使用内置的预训练 OCR 模型。
相关参考
- 创建首次检查 - 完整配方创建向导
- 图像设置 - 详细成像设置指南
- 对齐 - 模板对齐深度解析
- 检查区域(ROI) - ROI 尺寸与策略
- 检查设置与 ROI 类型 - ROI 类型参考
- Node-RED 基础 - 高级 IO 逻辑编程
- 成像设置基础 - 照明与图像质量理论