halcon 入门教程(四) 一维码识别,二维码识别,OCR识别

news/2025/3/19 20:44:09/文章来源:https://www.cnblogs.com/DOMLX/p/18781763

原文作者: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( : : GenParamNameGenParamValue : BarCodeHandle)详解:

  • 输入参数
    • GenParamName:通用参数名称(字符串或字符串数组)。
    • GenParamValue:对应参数的值(数值或字符串数组)。
  • 输出参数
    • BarCodeHandle:生成的条码模型句柄(用于后续操作)。

 

参数详解

1. GenParamNameGenParamValue 常见组合

参数名 (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( : : BarCodeHandleGenParamNameGenParamValue : )详解:

  • 输入参数:​
    • 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 : BarCodeHandleCodeType : DecodedDataStrings)详解:

 

  • 输入参数
    • Image:输入图像(单通道灰度图,建议8位或16位深度)。
    • BarCodeHandle:已配置的条码模型句柄(通过 create_bar_code_modelset_bar_code_param 预定义)。
    • CodeType:目标条码类型(如 '2/5 Interleaved',或 'auto' 自动检测)。
  • 输出参数
    • SymbolRegions:检测到的条码几何区域(可用于定位/可视化)。
    • DecodedDataStrings:解码后的字符串(符合ISO标准,如校验位已处理)。

 

核心处理流程

  1. 图像预处理
    • 自动执行灰度归一化、局部对比度增强(受 'contrast_min' 参数影响)。
  2. 扫描线生成
    • 根据 'num_scanlines' 生成多条扫描路径(旋转/平移覆盖配置的角度范围)。
  3. 特征提取
    • 提取条/空宽度比、边缘陡峭度等特征,匹配目标条码类型的编码规则。
  4. 解码验证
    • 应用 'check_char' 校验位验证,计算置信度得分(受 'min_identical_scanlines' 影响)。
  5. 结果排序
    • 按置信度返回结果,若配置 '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( : : SymbolTypeGenParamNameGenParamValue : 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. GenParamNameGenParamValue(通用参数)

参数名值类型/范围作用工业配置建议
'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( : : DataCodeHandleGenParamNameGenParamValue : )详解:

 

输入参数说明

参数名类型作用工业场景示例
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 : DataCodeHandleGenParamNameGenParamValue : ResultHandlesDecodedDataStrings)详解:

 

输入参数(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检测

 

 

 

 

 

                                       好了,本篇就这样,后面的话应该要写到边缘检测或者图像匹配定位然后去缺陷检测量测之类了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901698.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务跨模块调用接口如何传递当前用户信息

我们要在 api模块下 新增一个配置类 FeignInterceptorConfig 该类的作用是 跨模块调用接口时拦截然后给用户信息添加进去 具体实现方式 注意点是需要手动配置一下 通过Spring Boot的自动配置机制,将com.hmall.api.config.FeignInterceptorConfig类注册为自动配置类。具体作用…

听见未来,Audio+AI | GAS 2025完整议程揭晓!

听见未来,Audio+AI 2025中国国际音频产业大会(GAS) 将于 3月26-27日 在上海张江科学会堂盛大举办!大会主题聚焦聚焦“听见未来,Audio+AI”,两场主旨论坛、八场专题论坛。内容覆盖电子产业热点领域及方向,分别包括音频+AI、智能车载 音频、线上智能交互、智能耳机与可穿戴…

C++容器

容器的分类分为顺序容器(sequence) 关联容器(asscoiative) 无序容器(unordered) 顺序容器Array、vector、deque、list 关联容器有(mul)set和(mul)map,set和map的区别在于,set的key就是value,而map的key和value是分开的,set和map内部都是通过红黑树实现 无序容器主要为…

.NET Core奇技淫巧之WinForm使用Python.NET并打包

前言 之前整了一个GZY.EFCoreCompare 的库,可以用做对比实体与数据库结构.感兴趣可以去看看,地址:GZY.EFCoreCompare 但是只能导出execl表格. 后来大佬用Python写了个类,可以将execl表格直接生成SQL语句. 但是需要通过开发工具 或者python环境去运行. 对现场的非技术人员很不友…

MCP Server 开发实战指南(Python版)

原文链接:https://www.ryanzoe.top/ai/mcp-server-%e5%bc%80%e5%8f%91%e6%95%99%e7%a8%8b/ MCP 官方文档https://modelcontextprotocol.io/introduction各个 clients 对 MCP 的支持情况https://modelcontextprotocol.io/clientsMCP Python SDK:MCP Client 和 Server 官方 SDK…

Amphion 推出合成音频鉴别系统 Auditi;Gemini 引入 NotebookLM 功能,生成文档、网页音频摘要丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

洛谷题单指南-图论之树-P3398 仓鼠找 sugar

原题链接:https://www.luogu.com.cn/problem/P3398 题意解读:一颗n个节点的树,m个判断,判断树上两条路径是否相交,相交输出Y,否则输出N 解题思路:此题需要画一棵多叉树来辅助判断多次观察相交的路径,可以得出一个关键性质: 两条路径相交,必然有一条路径的LCA在另一条…

lg 主页

\(\Large\text{My Blog}\)中学:济南天山高级实验中学 关于我的学校究极久远预告:寒假游记滚滚长江东逝水,浪花淘尽英雄 是非成败转头空 青山依旧在,几度夕阳红 白发渔樵江渚上,观看秋月春风 一壶浊酒喜相逢 古今多少事,都付笑谈中街喧闹,人过往 且记曾相识,莫为少年留 …

day:25 selenium之介绍和环境配置

一、selenium介绍 selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3…

[算法学习记录] [更新中]最短路

顾名思义,最短路算法,就是求一个图中所有的点距某一个点的最短距离,常见的有Dijkstra算法、Bellman-Ford算法、Johnson算法与Floyd算法。 Dijkstra Dijistra算法实际上是一种由贪心与动态规划结合的算法,我们每次都贪心地选择到某个点的最近距离,又动态地更新着距离数组d的…

day6-static静态变量

静态变量/静态方法 被static修饰 工具类静态方法不能调用非静态。 非静态可以访问所有。 继承一个子类只能继承一个父类,可以多层继承,最大的父类为Objectcoding 练习:更好的方法:双指针不浪费空间

SpringBoot引入JWT实现用户校验

一JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这些信息以JSON对象的形式存储在令牌中,并且可以被签名和加密。JWT通常用于身份验证和信息交换主要用途 身份验证:当用户登录成功后,服务器会生成一个JWT并返回给客户端。之后…