跳转至

条码字符对:条码与明文互相校验

条码字符对是一个检测项里同时管三件事:解码、读码下面那行明文、核对两者是否一致。标签上码和字印的不是同一个内容——这是最典型的贴错料、串料事故,靠单独的码检测和字符识别是抓不到的。

只想拿到码的内容、不需要核对明文,用码检测更省事。

前置条件

  • 检测方案里已经有标签外框,并且训练过。
  • 标签上码和明文的相对位置固定(码在上、字在下,间距不变)。

它包含哪些检测框

新建之后会出现三个框,树里也是三条:

检测框 —— 框住旁边内容固定的部分,当整组的参照物。用法和固定区域完全一样:

检测框 干什么 默认
搜索参数 允许参照物漂移多大范围 开
定位参数 在这个范围里按形状精确找到参照物 开
缺陷参数 检查参照物本身印得好不好 开

条码框 —— 框住条码或二维码:

检测框 干什么 默认
条码检测结果 解码,拿到码的内容 开
缺陷参数 查条码本身有没有断条、缺角、白点、脏点 关,而且只对一维码有意义

明文框 —— 框住码下面那行人能看懂的字:

检测框 干什么 默认
检测参数 认字,并和条码解出来的内容比对 开
缺陷参数 逐字符查笔画缺陷(字模 OCV),要先建字体库 关

明文和条码是自动挂钩的

每跑一件,软件会把"条码检测结果"解出来的字串自动填进明文框"检测参数"的"参考字符串"里,再按"比对方式"判定。默认的比对方式是"参考字符串在结果字符串中",也就是"明文里必须包含码的内容"。你不需要手工去填参考字符串。

新建与画框

  1. 点工具栏"新建检测项",类型选"条码字符对",确定。
  2. 模板图左上角出现三个绿框。点一个,右侧树里对应那条会高亮,用这个办法分清哪个是哪个。
  3. 把三个框分别拖到位:
    • 检测框 → 旁边那块内容固定的图案或文字,贴紧。
    • 条码框 → 整个码。宁可画大一点:码被切掉一点点就可能解不出来。二维码要把四周的静区(空白边)也框进去。
    • 明文框 → 码下面那一行字,上下留点余量,只框一行。
  4. Ctrl+T"训练工程",再"单模板运行"。
  5. 如果这个码就是产品的 SN:在树里选中这个检测项右键"设置为SN码",检测结果就会和这个 SN 绑在一起,以后能按 SN 回查缺陷图。

模板图上一组条码字符对的三个框:检测框 / 条码框 / 明文框

参数说明

检测框的三个参数页和固定区域一样,见固定区域。明文框的两个参数页和可变区域的字符框一样,见可变区域。下面只讲条码框特有的,以及明文框上和可变区域不同的地方。

条码框 —— 条码检测结果

参数 含义 调参建议
解码类型 三选一:二维码 / 条码 / DataMatrix 必须选对,选错一张都解不出来。一维码选"条码"
横向拉伸比例 解码前把图横向拉伸几倍 默认 1。码被打印机压扁、条纹挤在一起时调到 1.5~2
纵向拉伸比例 纵向同上 默认 1。一维码本来就矮,通常不用动
过滤冒号 一个快捷按钮,点一下就把"正则表达式"填成过滤冒号的规则 码里带冒号而下游不接受时点它
正则表达式 符合这个规则的字符会从结果里删掉 留空就不过滤。只有下游(MES、PLC)要求去掉某些字符时才填
起始位 / 长度 "裁切结果"里的两个值:从第几位开始、取多少位 码很长而下游只要中间某一段时用。长度填 0 表示不裁
比对字符 "无铭文固定字符比对":解出来的内容必须完全等于这一串,否则 NG 用在"这台机器上流过的码永远是同一个"的场合。内容每件都变就别开
扫到多个不同的码 "多码处理"里的下拉:"判NG(默认)" 或 "按正则筛选" 框里只可能有一个码就保持默认。标签上下叠了两个码、框又不好画小时,选"按正则筛选"
正则 选了"按正则筛选"才能填,只保留匹配这个规则的码 比如两个码里只有一个以 2636 开头,就填 ^2636。填错了框会变红
解码失败自动扩大搜索区重试(×1.5/×2/×3) 第一次没解出来时,自动把搜索区按中心放大再试最多三次 默认开着,建议别关。它专治"框画小了、标签又漂了一点"导致的偶发漏读
解码方式 只读,主解码器 / 备用解码器 多数件应走主解码器

多码策略的副作用

选了"按正则筛选"以后,即使框里只有一个码,这个码也必须匹配正则才算过。这其实相当于多了一道内容校验,好处是能拦住串料,坏处是正则写窄了会误杀。

条码框 —— 缺陷参数

这一页只对一维码有意义。检测二维码或 DataMatrix 时,把它保持禁用状态(右键"禁用此检测项")。

它把一维码的每一根黑条圈出来,从三个角度找毛病。

参数模式:下拉"基础参数 / 高级参数"。日常只用基础参数(下表);高级参数是算法内部的膨胀核、平滑、动态阈值等,一般不要动。选"高级参数"后界面换成高级那一套(按组排在同一页,要往下滚),同名的阈值 / 容忍量以高级那一套为准。

基础参数:

参数 含义 调参建议
子面积缺陷容忍量 黑条如果缺了一块,缺口的面积超过这个值就判缺陷 从大往小调:先给很大让它全过,再逐步调小到刚好能抓住真实缺口
最大高度差缺陷容忍量 各根黑条的高度差超过这个像素数就判缺陷。黑条断成两截时高度会骤变 本来就设计成长短不齐的码(比如带保护条的),给一个很大的值等于不查这一项
孔洞检测阈值 黑条里面的白点,亮到什么程度算孔洞 调大更宽容
孔洞面积缺陷容忍量 孔洞总面积超过这个值才判缺陷 不想查细小孔洞就给一个很大的值
斑点检测阈值 白底里面的黑点,暗到什么程度算斑点 同孔洞
斑点面积缺陷容忍量 斑点总面积超过这个值才判缺陷 同孔洞

高级参数里主要是:把条码从周围内容中抠干净的膨胀参数(横向/纵向膨胀核宽、迭代次数)、把码整体提亮的线性拉伸参数、二值化的动态阈值高低尾和最小区域面积,以及孔洞和斑点各自的获取、膨胀、平滑参数。这些默认值一般不用动;真要动就一边改一边看右边的中间结果图。

明文框 —— 检测参数(和可变区域的差别)

参数表和可变区域完全一样,只有三点不同:

  • 与参考字符串比对默认是开着的,而且参考字符串是自动填的,填的就是这一件条码解出来的内容,不要手工去改。
  • 比对方式默认是"参考字符串在结果字符串中"。明文通常比码多印一些前缀后缀,所以用"包含"而不是"等于"。如果明文和码的内容一字不差,可以改成"结果字符串等于参考字符串",判定更严。
  • 如果明文里有码里没有的分隔符,又老因为它比对不过,可以开"忽略符号(仅比对用)"。

明文框 —— 缺陷参数

逐字符查明文的笔画缺陷,默认关,要用先右键"启用此检测项"。算法是字模 OCV,用法见字模 OCV。

训练与调试

  1. 动过任何一个框就要 Ctrl+T"训练工程"。
  2. 右键"运行此检测项"单跑,然后按下面顺序看:
    • 先看条码框 → 条码检测结果的"结果"。显示"未检测到值"就是没解出来,后面的比对都是空谈。
    • 再看明文框 → 检测参数的"结果字符串"和"结果置信度"。
    • 两个都对了,再看整体是 PASS 还是 NG;如果还是 NG,多半是比对方式不合适。
  3. 条码框在"输入图片"里能看到实际抠出来的那块码。码被切边、静区不够,在这里一眼就能看出来。
  4. 条码框的缺陷参数调好之后,一定要拿几张真实的坏码验证它确实报 NG——这类参数很容易调成"什么都过"。

常见误判与处理

现象 原因 调哪里
结果一直是"未检测到值" 解码类型选错了 "解码类型"改成码的真实类型
偶发解不出,重拍一张又好了 框画小了,标签漂一点码就被切 把条码框画大,盖住整张码加静区,这是最有效的一招;确认"解码失败自动扩大搜索区重试"是开着的
二维码小、印得又密,解不出 分辨率不够 先试把"横向拉伸比例""纵向拉伸比例"调到 1.5~2;根上的办法是把相机拉近或换镜头
一维码解出来但校验位不对 码本身印坏或被压缩 提高打印质量;开条码框的"缺陷参数"把坏码拦下来
结果是"多码NG: ..." 框里同时扫到了两个不同的码 先试着把框画小只盖一个码;画不小就用"多码处理 → 按正则筛选"加正则
结果是"正则不匹配(...): ..." 开了"按正则筛选",而这个码不符合正则 检查正则写得对不对,或改回"判NG(默认)"
码和明文都读对了,还是 NG 比对方式太严,或明文里有多余符号 比对方式改成"参考字符串在结果字符串中";开"忽略符号(仅比对用)"
明文认不准 框切到字、方向不对、模型选错 见可变区域的常见误判
正常的一维码被缺陷参数判 NG 容忍量给太小 把三组容忍量都调大,再从大往小逐个收
检测二维码时报条码缺陷 条码缺陷参数只适用一维码 选中条码框下的"缺陷参数"右键"禁用此检测项"

相关页面