原文作者:aircraft
原文链接:https://www.cnblogs.com/DOMLX/p/18781763
有兴趣可以多看其他的halcon教程
halcon 学习教程目录
OK,本篇讲一些一维码,二维码,OCR识别的相关入门知识,不会讲的太深,因为如果你不是专门做这种设备的公司基本不会深入的去研究分析,但是学会基础以后想做的话至少是清楚这个东西该如何使实现,难度大不大,自己心里也有个底。毕竟是入门教程,还是要写的简单一点让大家有信心,比如学完后:哎,觉得halcon学习起来也不难嘛,越学越想学QAQ。
一. 一维码识别
这边一维码用的示例是halcon程序集里的25interleaved.hdev,是最基础的一维码识别。想要了解更深的话可以看看这里面的其他示例。
入门的一维码识别非常的简单,主要需要了解这四个算子
create_bar_code_model(创建一维码模型),
set_bar_code_param(对模型设置参数),
find_bar_code (识别一维码),
clear_bar_code_model(释放句柄资源)
是不是感觉很简单就四个算子hhh。
1.创建一维码模型算子create_bar_code_model( : : GenParamName, GenParamValue : BarCodeHandle)详解:
- 输入参数:
GenParamName
:通用参数名称(字符串或字符串数组)。GenParamValue
:对应参数的值(数值或字符串数组)。
- 输出参数:
BarCodeHandle
:生成的条码模型句柄(用于后续操作)。
参数详解
1. GenParamName
与 GenParamValue
常见组合
参数名 (GenParamName) | 参数值 (GenParamValue) | 作用 |
---|---|---|
'default_parameters' |
'enhanced' 或 'standard' |
预设模式:enhanced 增强识别率,standard 优化速度 |
'min_identical_scanlines' |
整数(如3) | 最小一致扫描线数(越高抗噪性越强,但可能漏检快速运动条码) |
'orientation' |
角度范围(如[-30,30]) | 允许条码倾斜角度范围(-90°~90°) |
'element_size_min' |
浮点数(如1.5) | 最小模块宽度(单位:像素),用于过滤低分辨率条码 |
'persistence' |
整数(如1) | 模型持久化等级(0=关闭,1=缓存几何特征,提升连续识别速 |
若输入空数组 []
,将启用 默认配置:
create_bar_code_model([], [], BarCodeHandle) * 等效于:
set_bar_code_param(BarCodeHandle, 'orientation', -90, 90)
set_bar_code_param(BarCodeHandle, 'element_size_min', 2.0)
大概流程示例
* 1. 创建定制化模型(支持倾斜±30°,最小模块3px)
create_bar_code_model(['orientation', 'element_size_min'], [-30,30,3.0], BarCodeHandle)* 2. 设置校验位验证(工业级数据校验)
set_bar_code_param(BarCodeHandle, 'check_char', 'present')* 3. 执行条码识别
find_bar_code(Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)* 4. 释放模型资源(关键!避免内存泄漏)
clear_bar_code_model(BarCodeHandle)
2.设置模型参数算子set_bar_code_param( : : BarCodeHandle, GenParamName, GenParamValue : )详解:
- 输入参数:
BarCodeHandle
:已创建的条码模型句柄(由create_bar_code_model
生成)。GenParamName
:要设置的参数名(字符串或数组)。GenParamValue
:对应的参数值(数值/字符串或数组)。
- 功能:动态调整条码识别引擎的行为,优化特定场景的识别率、速度或鲁棒性。
核心工业参数表
参数名 (GenParamName) | 参数值 (GenParamValue) | 应用场景 | 影响维度 |
---|---|---|---|
'orientation' |
[-30, 30] | 处理倾斜安装的条码(如传送带偏移) | 角度容差 |
'check_char' |
'present'/'absent' | 启用/禁用校验位验证(ISO标准验证) | 数据可靠性 |
'stop_after_result_num' |
1 | 高速产线只需识别一个条码时,提前终止扫描 | 处理速度 |
'element_size_min' |
2.0 | 过滤低分辨率条码(如远距离拍摄的模糊条码) | 分辨率容限 |
'num_scanlines' |
50 | 高精度检测时增加扫描线数(牺牲速度提升精度) | 识别率/速度 |
'persistence' |
1 | 连续检测时缓存特征(适合固定位置条码批量扫描) | 内存/速度 |
'meas_thresh' |
0.7 | 调整条/空对比度阈值(应对反光或低对比度表面) | 抗干扰能力 |
'module_gap_min' |
'auto' 或 0.5 | 控制最小模块间隙(防止粘连模块误判) | 结构容差 |
3.一维条码识别算子find_bar_code(Image : SymbolRegions : BarCodeHandle, CodeType : DecodedDataStrings)详解:
- 输入参数:
Image
:输入图像(单通道灰度图,建议8位或16位深度)。BarCodeHandle
:已配置的条码模型句柄(通过create_bar_code_model
和set_bar_code_param
预定义)。CodeType
:目标条码类型(如'2/5 Interleaved'
,或'auto'
自动检测)。
- 输出参数:
SymbolRegions
:检测到的条码几何区域(可用于定位/可视化)。DecodedDataStrings
:解码后的字符串(符合ISO标准,如校验位已处理)。
核心处理流程
- 图像预处理
- 自动执行灰度归一化、局部对比度增强(受
'contrast_min'
参数影响)。
- 自动执行灰度归一化、局部对比度增强(受
- 扫描线生成
- 根据
'num_scanlines'
生成多条扫描路径(旋转/平移覆盖配置的角度范围)。
- 根据
- 特征提取
- 提取条/空宽度比、边缘陡峭度等特征,匹配目标条码类型的编码规则。
- 解码验证
- 应用
'check_char'
校验位验证,计算置信度得分(受'min_identical_scanlines'
影响)。
- 应用
- 结果排序
- 按置信度返回结果,若配置
'stop_after_result_num'
则提前终止。
- 按置信度返回结果,若配置
参数详解
1. CodeType
(条码类型规范)
类型 | 标准 | 工业应用场景 |
---|---|---|
'2/5 Interleaved' |
ISO 16390 | 物流包装、PCB板追溯 |
'Code 128' |
ISO/IEC 15417 | 医疗器械序列号、仓库管理 |
'Data Matrix ECC 200' |
ISO/IEC 16022 | 汽车零件DPM码、电子产品追溯 |
'auto' |
自动检测所有支持类型 | 多类型混合产线(速度较慢) |
注意啦 本篇就是'2/5 Interleaved'
类型的噢!!!
2. 关键性能参数(通过 set_bar_code_param
预配置)
'orientation'
:倾斜容差(默认±90°,推荐产线设为±30°以提速)。'element_size_min'
:最小模块宽度(像素),过滤远距离/低分辨率条码。'meas_thresh'
:对比度阈值(0.0-1.0),应对反光/低对比度表面。
废话不多说直接上图(图片都可以直接复制拿去用):
实例代码(这里代码就不多讲解了,非常简单的一维码识别还是毫无干扰的,没有ROI提取的,下面注释也很详细了):
* 本程序演示如何读取2/5交错码(Interleaved 2 of 5)类型的条形码 * 核心原理:通过形态学分析和模式匹配提取条空序列,解码为数字信息* 创建条形码解码模型(工业级条码解析引擎) * 参数1: 通用参数列表(空列表[]表示使用默认配置,可配置扫描线数、角度容差等) * 参数2: 条码类型特定参数(空列表[]表示无特殊限制) * 参数3: BarCodeHandle - 输出条码模型句柄,用于后续操作 create_bar_code_model ([], [], BarCodeHandle)* 设置条码读取参数:发现一个有效结果后立即停止扫描(提升产线检测效率) * 参数1: BarCodeHandle - 模型句柄 * 参数2: 'stop_after_result_num' - 停止条件,1表示找到第一个有效结果后终止 * 参数3: 1 - 最大结果数(设置为1避免多余计算) set_bar_code_param (BarCodeHandle, 'stop_after_result_num', 1)* 初始化显示窗口(人机交互界面) dev_close_window () * 关闭可能存在的旧窗口,避免资源冲突 * 打开新窗口(用于实时显示检测结果) * 参数1-4: 窗口位置(0,0)和尺寸(120x300),适应条码长宽比 * 参数5: 'black' - 背景色(高对比度便于观察) * 参数6: WindowHandle - 输出窗口句柄 dev_open_window (0, 0, 120, 300, 'black', WindowHandle)* 设置显示字体(工业HMI常用等宽字体,确保字符对齐) * 参数1: WindowHandle - 目标窗口 * 参数2: 14 - 字体大小(根据窗口尺寸优化) * 参数3: 'mono' - 等宽字体(如Consolas) * 参数4-5: 'true'表示启用粗体,'false'禁用斜体 set_display_font (WindowHandle, 14, 'mono', 'true', 'false')* 设置绘图模式为轮廓显示(降低GPU显存占用,适合嵌入式系统) * 参数: 'margin' - 仅绘制区域轮廓(若改为'fill'则填充区域) dev_set_draw ('margin')* 设置轮廓线宽为3像素(高亮关键区域,便于质检员观察) * 参数: 3 - 线宽(单位:像素),根据显示分辨率调整 dev_set_line_width (3)* 读取条形码测试图像read_image (Image, 'E:/学习测试/halcon/一维码,二维码,OCR识别/1.bmp')* 获取图像尺寸(动态适应不同分辨率的摄像头输入)* 参数1: Image - 输入图像* 参数2-3: Width, Height - 输出图像宽高(单位:像素)get_image_size (Image, Width, Height)* 设置窗口显示范围为图像实际尺寸(1:1显示,避免缩放失真)* 参数1-4: 窗口左上角(0,0)到右下角(Width-1, Height-1)dev_set_window_extents (0, 0, Width - 1, Height - 1)* 显示原始图像(用于对比原始数据与处理结果)dev_display (Image)* --- 第一次解码:包含校验字符(演示完整数据流)---dev_set_color ('green') * 设置高亮颜色为绿色(工业标准:通过项)* 配置条码参数:不处理校验字符(结果字符串包含校验位)* 参数2: 'check_char' - 校验字符处理模式* 参数3: 'absent' - 校验位作为数据的一部分返回(不进行验证)set_bar_code_param (BarCodeHandle, 'check_char', 'absent')* 执行条码识别(核心解码算法)* 参数1: Image - 输入图像(灰度图)* 参数2: SymbolRegions - 输出条码几何区域(可用于定位分析)* 参数3: BarCodeHandle - 已配置的条码模型* 参数4: '2/5 Interleaved' - 指定条码类型(提升识别速度)* 参数5: DecodedDataStrings - 解码后的字符串(含校验位)find_bar_code (Image, SymbolRegions, BarCodeHandle, '2/5 Interleaved', DecodedDataStrings)* 在窗口左上角显示完整解码结果(质检员可见原始数据)* 参数4-5: 12,12 - 文本起始坐标(相对窗口左上角偏移量)* 参数6: 'black' - 文字颜色(高对比度)* 参数7: 'false' - 不启用透明背景(覆盖底层图像)disp_message (WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'false')* 提取校验位(最后一个字符)并单独显示为绿色(重点突出)* LastChar := strlen(DecodedDataStrings) - 1 - 计算校验位索引* gen_tuple_const(LastChar,' ')生成N个空格字符串(用于对齐)* DecodedDataStrings{LastChar}提取校验位字符LastChar := strlen(DecodedDataStrings) - 1disp_message (WindowHandle, sum(gen_tuple_const(LastChar,' ')) + DecodedDataStrings{LastChar}, 'window', 12, 12, 'forest green', 'false')stop () * 暂停(模拟产线人工复检环节)* --- 第二次解码:校验字符参与验证(实际产线模式)---*校验位机制*2/5交错码校验规则:最后一位为模10校验和,用于验证数据完整性*生产环境中建议启用校验('check_char'='present'),避免误读dev_set_color ('green') * 重置显示颜色(避免颜色残留)* 配置条码参数:校验字符参与验证(工业级数据校验)* 参数3: 'present' - 校验位参与验证,若错误则解码失败set_bar_code_param (BarCodeHandle, 'check_char', 'present')* 重新执行条码识别(启用校验的严格模式)find_bar_code (Image, SymbolRegions, BarCodeHandle, '2/5 Interleaved', DecodedDataStrings)* 在窗口右侧显示验证后的结果(不含校验位)* 参数4-5: 36,12 - 横向偏移36像素,纵向12像素(避免覆盖第一次结果)disp_message (WindowHandle, DecodedDataStrings, 'window', 36, 12, 'black', 'false')
结果图(第一次识别多个5,第二次校验去除):
一维码的识别基本都是不难的,难就难在你怎么去复杂背景下去定位一维码所在的ROI区域。比如快递盒上一维码你们有思路吗?
有兴趣了解的可以看看这篇博客:快递一维码识别
二. 二维码识别
二维码的识别基本跟一维码的套路是一样的也是四个算子
create_data_code_2d_model(创建二维码识别模型),
set_data_code_2d_param(设置二维码识别参数),
find_data_code_2d(识别二维码),
clear_data_code_2d_model (清除模型句柄资源)。
1.创建二维码模型算子create_data_code_2d_model( : : SymbolType, GenParamName, GenParamValue : DataCodeHandle)详解:
输入参数(Input Parameters)
参数名 | 类型 | 作用描述 | 工业应用示例 |
---|---|---|---|
SymbolType |
字符串 | 指定要识别的二维数据码类型(如 'Aztec Code' , 'QR Code' 等)。 |
- 汽车零件追溯:'Data Matrix ECC 200' - 物流标签: 'PDF417' |
GenParamName |
字符串数组 | 通用参数名称列表,用于微调模型性能(如 'module_size_min' , 'contrast_min' )。 |
- 高精度检测:设置 'module_size_min' - 高速产线:设置 'default_parameters' 为 'speed' |
GenParamValue |
混合类型数组 | 对应 GenParamName 的参数值(数值或字符串)。 |
- 金属表面反光:'contrast_min' = 40 - 小模块识别: 'small_modules_robustness' = 'high' |
输出参数(Output Parameter)
参数名 | 类型 | 作用描述 | 工业应用场景 |
---|---|---|---|
DataCodeHandle |
Handle | 返回数据码模型的句柄,存储所有配置参数和内部状态。 | - 产线多工位复用:保存句柄重复使用,避免重复初始化。 - 参数版本管理:通过句柄保存/加载不同产线的优化 |
1. SymbolType
(符号类型)
类型 | 标准 | 典型应用场景 | 模块尺寸建议 |
---|---|---|---|
'Data Matrix ECC 200' |
ISO/IEC 16022 | 汽车零件DPM码、PCB板追溯 | ≥4×4像素 |
'QR Code' |
ISO/IEC 18004 | 消费品包装、支付系统 | ≥2×2像素 |
'Aztec Code' |
ISO/IEC 24778 | 航空行李标签、医疗标本管 | ≥3×3像素 |
'PDF417' |
ISO/IEC 15438 | 驾照、物流运输单据 | ≥3×3像素 |
'auto' |
自动检测 | 混合码型生产线(速度-20%) | 根据实际调整 |
2. GenParamName
与 GenParamValue
(通用参数)
参数名 | 值类型/范围 | 作用 | 工业配置建议 |
---|---|---|---|
'default_parameters' |
'enhanced' /'speed' |
预设模式:优化识别率或速度 | 高速产线用speed |
'module_size_min' |
浮点数(≥1.0) | 最小模块尺寸(像素) | 根据镜头分辨率计算 |
'contrast_min' |
0-100(%) | 最小对比度阈值 | 金属表面建议≥30% |
'finder_pattern_tolerance' |
'low' /'high' |
定位图案容差(抗缺损能力) | 破损码用high |
'persistence' |
整数(0-10) | 模型持久化等级(提升连续识别速度) | 固定工位建议=2 |
案例1:汽车零件Data Matrix码检测
* 配置:高鲁棒性模式 + 小模块容差
create_data_code_2d_model('Data Matrix ECC 200', ['default_parameters', 'module_size_min','finder_pattern_tolerance'
], ['enhanced', * 增强识别率3.5, * 最小模块3.5像素(对应0.2mm物理尺寸)'high' * 高定位容差(应对激光雕刻缺损)
], DataCodeHandle)
2.设置二维码参数算子set_data_code_2d_param( : : DataCodeHandle, GenParamName, GenParamValue : )详解:
输入参数说明
参数名 | 类型 | 作用 | 工业场景示例 |
---|---|---|---|
DataCodeHandle |
Handle | 已创建的模型句柄(由create_data_code_2d_model 生成) |
- 同一产线多工位复用同一模型句柄 |
GenParamName |
字符串/数组 | 要设置的参数名列表 | 如 ['contrast_min', 'module_size_min'] |
GenParamValue |
混合类型/数组 | 对应参数的值 | 如 [30, 3.5] (contrast_min=30% , module_size_min=3.5px ) |
核心参数详解(以Aztec Code为例)
1. 图像质量相关
参数名 | 值范围/选项 | 作用 | 调优工具 |
---|---|---|---|
'contrast_min' |
0-100(百分比) | 最小对比度阈值 | 灰度直方图分析工具 |
'polarity' |
'light_on_dark' , 'dark_on_light' , 'any' |
码与背景的极性 | 使用check_data_code_2d_polarity 验证 |
2. 几何尺寸相关
参数名 | 值范围 | 作用 | 计算公式 |
---|---|---|---|
'module_size_min' |
≥1.0(像素) | 最小模块尺寸 | 模块尺寸(px) = 物理尺寸(mm) × 分辨率(px/mm) |
'symbol_size_min' |
15-151(模块数) | Aztec Code最小尺寸(15x15) | 根据ISO标准选择等级(如19x19) |
3. 鲁棒性相关
参数名 | 值范围/选项 | 作用 | 性能影响 |
---|---|---|---|
'finder_pattern_tolerance' |
'low' , 'high' |
定位图案缺损容差 | high ↑时速度↓20% |
'small_modules_robustness' |
'low' , 'medium' , 'high' |
小模块抗噪能力 | high ↑时内存↑30% |
还有很多可以点进这个算子的帮助文档里详细查看一下,这里就不多写了。
3.二维条码识别算子find_data_code_2d(Image : SymbolXLDs : DataCodeHandle, GenParamName, GenParamValue : ResultHandles, DecodedDataStrings)详解:
输入参数(Input Parameters)
参数名 | 类型 | 作用描述 | 工业场景配置示例 |
---|---|---|---|
Image |
图像对象 | 输入的单通道灰度图像(建议8位或16位深度)。 | - 金属表面反光:预处理使用emphasize 增强对比度- 运动模糊: motion_blur 校正 |
DataCodeHandle |
Handle | 已配置的二维数据码模型句柄(由create_data_code_2d_model 生成)。 |
- 复用模型句柄提升性能(避免重复初始化) |
GenParamName |
字符串数组 | 识别阶段的动态参数名列表(覆盖模型初始参数)。 | - 'contrast_tolerance' 应对光照不均- 'timeout' 限制最长解码时间 |
GenParamValue |
混合类型数组 | 对应的参数值。 | - ['high', 5000] ('contrast_tolerance' 和'timeout' ) |
输出参数(Output Parameters)
参数名 | 类型 | 作用描述 | 工业应用场景 |
---|---|---|---|
SymbolXLDs |
XLD对象 | 检测到的数据码轮廓(精确几何形状)。 | - 定位精度验证(与CAD图纸比对) - 可视化质检(绿色轮廓叠加显示) |
ResultHandles |
Handle数组 | 中间结果句柄(用于调试和高级分析)。 | - 使用get_data_code_2d_results 提取模块级数据- 分析解码置信度 |
DecodedDataStrings |
字符串数组 | 解码后的数据内容(符合ISO标准)。 | - MES系统对接(如send_to_sap(DecodedDataStrings) )- 数据库追溯查询 |
废话不多说上图:
实例代码(都有详细注释):
* *************************************************************
* 本程序演示如何读取Aztec Code类型的二维数据码
* 流程说明:创建数据码模型 → 图像读取 → 数据码解析 → 结果可视化
* 工业应用场景:票务验证、物流追溯、医疗设备标识
* ************************************************************** ******************* 注意事项 **********************
* 存在以下情况可能导致标准参数无法识别:
* 1. 图像对比度过低(建议阈值:>30%灰度差)
* 2. 浅色码深色背景(需调整极性参数)
* 3. 码尺寸过大(>48x48模块,需分块处理)
* 4. 模块点阵不连续(需形态学预处理)
* ******************************************************** 初始化系统设置
dev_update_off ()
* 关闭设备更新提示(提升执行效率)
dev_close_window ()
* 关闭可能存在的残留窗口
ImageFiles := 'datacode/aztec/aztec_ticket_'
* 图像路径模板
*ImageNum := 5
* 总处理图像数(示例配置)
read_image (Image, 'E:/学习测试/halcon/一维码,二维码,OCR识别/2.bmp')
* 预加载首张图像获取尺寸* 创建自适应图像尺寸的显示窗口
* 参数说明:-1表示自动适配,保留原图宽高比
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)* 设置可视化参数
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 等宽字体确保字符对齐
dev_set_line_width (3)
* 轮廓线宽3像素(高亮显示)
dev_set_color ('green')
* 默认显示颜色(工业标准通过色)* 显示操作指南信息 ---无需理会
Message := 'This simple program demonstrates how to read'
Message[1] := 'Atzec data codes in a sequence of images'
Message[2] := 'with the standard default parameter setting.'
dev_disp_text (Message, 'window', 12, 12, 'black', [], [])
* 黑色背景高对比度
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
* 暂停* 步骤1:创建Aztec Code数据码模型
* ----------------------------------------------------
* 参数说明:
* 'Aztec Code' - 指定码型(支持QR、DataMatrix等50+种)
* [] - 保留参数(兼容后续版本扩展)
* DataCodeHandle - 输出模型句柄(存储参数配置)
create_data_code_2d_model ('Aztec Code', [], [], DataCodeHandle)* 步骤1.5:配置Aztec Code专用参数(关键工业参数调优)
* -------------------------------------------------------------------
* 设置模块尺寸范围(单位:像素)
* 作用:过滤过小/过大的模块噪声,根据实际印刷精度调整
* 推荐值:最小值=镜头分辨率/(模块物理尺寸(mm)*25.4)
* 示例:3px对应0.3mm模块(300dpi镜头)
set_data_code_2d_param (DataCodeHandle, ['module_size_min', 'module_size_max'], [3, 11])* 禁用模块间隙检测(应对紧密排列的模块)
* 适用场景:高密度印刷(如微型电子元件标签)
* 风险:可能增加粘连模块的误识别率
set_data_code_2d_param (DataCodeHandle, 'module_gap', 'no')* 设置极性检测模式(应对反光/深色背景)
* 'light_on_dark' - 浅色码深色背景(如激光雕刻)
* 'dark_on_light' - 深色码浅色背景(标准印刷)
* 'any' - 自动检测(性能消耗+20%)
set_data_code_2d_param (DataCodeHandle, 'polarity', 'any')* 禁用镜像解码(防止反向扫描误识别)
* 若需要识别镜像码(如双面标签),设为'yes'
set_data_code_2d_param (DataCodeHandle, 'mirrored', 'no')* 设置最小对比度阈值(灰度差异百分比)
* 计算公式:(MaxGray - MinGray)/255 * 100 > contrast_min
* 调优工具:measure_thresh工具测量实际对比度
set_data_code_2d_param (DataCodeHandle, 'contrast_min', 20)* 设置符号尺寸范围(模块数)
* Aztec Code标准尺寸:15x15到151x151模块
* 限制范围可过滤干扰区域(如类似图案的logo)
set_data_code_2d_param (DataCodeHandle, 'symbol_size_min', 19)
set_data_code_2d_param (DataCodeHandle, 'symbol_size_max', 143)* 提升小模块鲁棒性(应对低质量印刷)
* 模式:'low'(默认)/ 'medium' / 'high'
* 副作用:'high'模式增加30%解码时间
set_data_code_2d_param (DataCodeHandle, 'small_modules_robustness', 'high')* 提升定位图案容差(应对破损/遮挡)
* 适用场景:物流包装部分磨损的条码
* 风险:可能增加假阳性率
set_data_code_2d_param (DataCodeHandle, 'finder_pattern_tolerance', 'high')
*
* 步骤2:数据码读取与解析
* ----------------------------------------------------* 读取测试图像(替换为实际工业图像路径)read_image (Image, 'E:/学习测试/halcon/一维码,二维码,OCR识别/2.bmp')* 执行数据码识别(核心解码算法)* 参数说明:* SymbolXLDs - 输出码区域轮廓(XLD对象,用于定位)* DataCodeHandle - 已配置的模型句柄* [] - 保留参数位* ResultHandles - 中间结果句柄(调试用)* DecodedDataStrings - 解码字符串结果(UTF-8编码)find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)* 结果字符串显示优化(适应窗口宽度)get_image_size (Image, Width, Height) * 获取图像物理尺寸get_string_extents (WindowHandle, DecodedDataStrings + ' ', Ascent, Descent, MessageWidth, MessageHeight)if (MessageWidth > Width) * 超长截断处理(防止文本溢出)DecodedDataStrings := DecodedDataStrings{0:50} + '...' * 保留前50字符endif* 可视化检测结果dev_display (Image) * 显示原始图像背景dev_display (SymbolXLDs) * 叠加数据码轮廓(绿色边框)* 显示图像序号(生产追溯标识)dev_disp_text ('Image ' + '1' + ' of ' + '1', 'window', 12, 12, 'black', [], [])* 显示解码数据(距顶部40像素,避免覆盖关键区域)dev_disp_text (DecodedDataStrings, 'window', 40, 12, 'black', [], [])* 异常处理:未找到数据码的警告提示if (|DecodedDataStrings| == 0) * 判断结果字符串长度* 红色报警文本(工业标准警告色)dev_disp_text ('No data code found.\nPlease adjust the parameters.', 'window', 40, 12, 'red', [], [])* 触发声光报警(需集成硬件接口)* trigger_alarm('decode_fail') endif
结果图:
三. OCR识别
因为22版本的halcon已经支持深度学习的OCR识别了,非常的好用,传统的我都懒得叫你们学了,有兴趣了解传统的OCR识别可以看看光学字符识别里面的一些实例:
我的建议是直接学习使用深度学习的OCR算子,我们现在工业的设备较新的基本都已经上了深度学习了,识别率高,使用简单,还不用什么高配置的电脑,cpu也可以直接跑。相关教程看我另外一篇:
halcon 深度学习教程(二)halcon基于深度学习的OCR检测
好了,本篇就这样,后面的话应该要写到边缘检测或者图像匹配定位然后去缺陷检测量测之类了。