OCR 和条码识别在工业视觉中都属于“读”的任务,但两者的技术路线和工程约束截然不同。条码识别是“解码”,OCR 是“认字”。
条码识别:确定性解码
条码的本质是按预定规则编码的几何图案。识别过程是确定性的:找到条码区域 → 分析黑白条纹的宽度模式 → 按编码规则查表 → 输出字符。
一维码(Code 128、Code 39、EAN-13)通过条纹的宽窄组合编码。二维码(Data Matrix、QR Code)通过黑白模块的二维排列编码,信息密度更高,且自带纠错能力。
工业场景中最常用的是Data Matrix,因为它尺寸小、信息密度高、支持 DPM(激光刻码)。QR Code在消费领域常见,工业上也有使用。
C# 实现(ZXing.Net):
usingZXing;varreader=newBarcodeReader();reader.Options.TryHarder=true;// 提高识别率reader.Options.PossibleFormats=newList<BarcodeFormat>{BarcodeFormat.DATA_MATRIX,BarcodeFormat.QR_CODE,BarcodeFormat.CODE_128};varresult=reader.Decode(bitmap);if(result!=null){Console.WriteLine($"内容:{result.Text}");Console.WriteLine($"格式:{result.BarcodeFormat}");Console.WriteLine($"区域:{result.ResultPoints}");}ZXing 的识别能力在印刷清晰、对比度正常的条码上表现优秀。但在工业 DPM 码、低对比度、反光表面等场景下,识别率会明显下降,需要配合打光方案和图像预处理。
OCR:从“找字”到“认字”
OCR 比条码识别难得多。条码是固定规则的几何图案,而字符的字体、大小、间距、倾斜、笔画粗细都可能变化。
工业 OCR 的流程是:字符定位 → 字符分割 → 字符识别 → 后处理。
字符定位:找到图像中字符所在的区域。通常用 Blob 分析或边缘检测确定字符的边界。
字符分割:把一串字符切成单个字符。这是 OCR 最关键的步骤——如果字符粘连或间距不均,分割就会出错。Halcon 的segment_characters和康耐视的 OCRMax 在分割算法上有深厚积累。
字符识别:把单个字符的图像与训练好的字符集比对。传统方法用特征匹配(提取笔画方向、端点、交叉点等特征),深度学习方法用CNN 分类。
后处理:用词典、格式规则(如日期格式、编号规则)纠正识别错误。
Halcon OCR 示例:
* 分割字符 segment_characters (Image, Characters, 'false', 10, 30, 2, 10, 'true', 'true', 'medium', 'false', 'false', Row, Column, Width, Height) * 识别 read_ocr_class_mlp ('Industrial_0-9A-Z.omc', OCRHandle) do_ocr_multi_class_mlp (Characters, Image, OCRHandle, Class, Confidence)工业场景的核心挑战
DPM 码是工业条码识别的最大难题。激光刻在金属表面的码,对比度极低、表面反光、字符不规则。普通 ZXing 很难稳定读取,需要康耐视的 1DMax/2DMax+ 或海康的专用 DPM 算法。
OCR 的字体一致性是另一个关键。如果产线上字体固定、印刷清晰,传统 OCR 就能做到 99% 以上。但如果字体多变、印刷质量不稳定,就需要深度学习 OCR 或 OCRMax 这类高级工具。
打光是共同前提。条码和 OCR 都对对比度极度敏感。同轴光适合反光表面的 DPM 码,低角度光适合凸显刻痕,背光适合透明包装上的条码。
一句话总结
条码识别是确定性解码,找到图案就能解出内容;OCR 是模式识别,需要处理字体、分割、形变等各种变化。工业现场优先用专用读码器处理 DPM 码,用OCRMax 或深度学习 OCR处理复杂字符。打光方案决定了识别的上限,算法只是逼近这个上限。