当前位置: 首页 > news >正文

Halcon一维码与二维码识别技术解析

Halcon一维码与二维码处理概述

Halcon作为机器视觉领域的强大工具,提供了高效的一维码(条形码)和二维码(如QR码、Data Matrix等)识别功能。其算法基于深度学习与传统图像处理技术,适用于工业检测、物流追踪等场景。

一维码与二维码的区别

一维码

  • 线性排列的黑白条纹,仅存储水平方向的信息(如EAN-13、Code 128)。
  • 数据容量较小,依赖外部数据库关联信息。

二维码

  • 二维矩阵式结构(如QR码、Data Matrix),可存储水平与垂直方向的数据。
  • 支持纠错功能,数据容量更大,可直接编码文本、链接等。

Halcon的关键功能模块

  • 图像预处理:通过滤波、二值化等操作提升条码区域对比度。
  • 定位与解码:自动检测条码位置并解析数据,支持旋转、畸变校正。
  • 参数调优:可调整符号类型('auto'或指定格式)、扫描线数量等。

典型应用场景

  • 生产线上的产品追溯(二维码标识)。
  • 仓库管理中包裹分拣(一维码扫描)。
  • 医疗设备中的试剂标签核对(Data Matrix)。

1核心算子 创建一个条形码的模板

参数1 预留元组 写条形码的参数名字

参数2 预留数组 写条形码的数值

参数3 BarCode_model([],[],BarCodeHandle)

一维码

参数详解

1核心算子 创建一个条形码的模板参数1 预留元组 写条形码的参数名字参数2 预留数组 写条形码的数值参数3 BarCode_model([],[],BarCodeHandle)2核心算子 设置模板参数```
set_bar_code_param(BarCodeHandle,'barcode_width_min',300) 设置条形码宽度set_bar_code_param(BarCodeHandle,'barcode_height_min',80) 设置条形码高度
```3根据条形码模板找合适区域第四个参数 auto 指定要搜索条形码类型 自动识别DecodedDataStrings 解码之后的结果find_bar_code(Image,SymbolRegions,BarCdeHandle,'auto',DecodedDataStrings)4获取条形码的具体信息all 获取所有已经解码的结果decoded_types 指定要检查结果的类型的可选项 获取条形码的类型 code39类型get_bar_code_result(BarCodeHandle,'all','decoded_types',BarCodeResults)获取条形码中心坐标
area_center(SymbolRegions,Area,Row,Column)


* dev_close_window ()*dev_update_off ()
* dev_get_window (WindowHandle)*query 查询*font 字体*查询当前窗口的字体类型*query_font (WindowHandle, Font)*查找元组里面是否有哪个字体 返回值查到索引值*tuple_find (Font, '新宋体', Indices)*if (Indices!=-1)*   set_display_font (WindowHandle, 16, '新宋体', 'true', 'false')*else*    set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* endifdev_set_draw ('margin')dev_set_line_width (3)dev_set_color ('green')*1 创建条形码模型create_bar_code_model ([], [], BarCodeHandle)*2 设置参数set_bar_code_param (BarCodeHandle, 'barcode_width_min', 280)set_bar_code_param (BarCodeHandle, 'barcode_height_min', 60)*3 加载多张图片list_files ('./条形码图片', 'files', Files)tuple_regexp_select (Files, '.(jpg|bmp|png)', Selection)*定义空对象gen_empty_obj (EmptyObject) *4遍历图片进行查找条形码for Index := 0 to |Selection|-1 by 1*获取一张图像read_image (Image, Selection[Index])*搜索条形码find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)*判断对象是否相等test_equal_obj (EmptyObject, SymbolRegions, IsEqual)if (IsEqual!=0)dev_disp_text ('没有找到', 'window', 'top', 'left', 'black', [], [])*disp_message (WindowHandle,'没有找到条形码','image', 12, 12, 'black', 'true') else*获取条形码信息get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)dev_display (Image)dev_display (SymbolRegions)area_center (SymbolRegions, Area, Row, Column)dev_disp_text (BarCodeResults+':'+DecodedDataStrings, 'window',Row, Column, 'black', [], [])* disp_message (WindowHandle, BarCodeResults+':'+DecodedDataStrings,'image', Row, Column, 'black', 'true')endif   stop ()endfor
```

二维码

二维码代表QR码 数据阵码

  • 二维码的读取操作步骤:

  • 1、读取二维码图像 read_image

  • 2、对图像进行想要预处理 【灰度化 二值化 区域特殊筛选 形态学 几何变换 区域锁定】

  • 3、创建二维码解析对象 create_data_code_2d_model

  • 4、设置解析对象相关的参数 set_data_code_2d_param

  • 5、搜索目标区域的二维码并解析获取解析结果 find_data_code_2d

  • 6、释放二维码解析对象 clear_data_code_2d_model

 read_image (Image, 'D:/机器视觉/图片素材/二维码/QR码/6.bmp')
* 创建二维码识别模型
* 参数1:二维码的类型
* create_data_code_2d_model ('QR Code', [], [], DataCodeHandle)
* find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)* 点状二维码识别
* read_image (Image1, '点状二维码')
* 图中的点为黑色,将图像腐蚀操作,放大二维码的黑点就可以识别了
* gray_erosion_rect (Image1, ImageMin, 12, 12)
* create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle1)
* find_data_code_2d (ImageMin, SymbolXLDs, DataCodeHandle1, [], [], ResultHandles1, DecodedDataStrings1)* 有大量噪声的图像,可以先将噪点处理之后进行识别
* read_image (Image, '噪点二维码')
* gray_opening_rect (Image, ImageOpening, 3, 3)
* create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle1)
* find_data_code_2d (ImageOpening, SymbolXLDs, DataCodeHandle1, [], [], ResultHandles1, DecodedDataStrings1)* 微小二维码识别
* read_image (Image, 'datacode/ecc200/ecc200_cpu_001')* create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle1)
* find_data_code_2d (Image, SymbolXLDs, DataCodeHandle1, [], [], ResultHandles1, DecodedDataStrings1)* hom_mat2d_identity (HomMat2DIdentity)
* hom_mat2d_scale (HomMat2DIdentity, 0.3, 0.3, 0, 0, HomMat2DScale)
* affine_trans_image (Image, ImageAffineTrans, HomMat2DScale, 'constant', 'false')
* 设置small_modules_robustness参数为high增强对微小二维码的识别能力
* create_data_code_2d_model ('Data Matrix ECC 200', ['small_modules_robustness'], ['high'], DataCodeHandle)
* find_data_code_2d (ImageAffineTrans, SymbolXLDs1, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)* 因为有的图案较亮,内容不明显,因此打开‘增强识别’
read_image (Image1, 'datacode/ecc200/ecc200_contrast_variations_05.png')
create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'enhanced_recognition', DataCodeHandle)
find_data_code_2d (Image1, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)

dev_get_window (WindowHandle)*1创建Data Matrix ECC 200 或者称为D码模版
*default_parameters 默认参数
*maximum_recognition 最大识别度
create_data_code_2d_model ('Data Matrix ECC 200', ['default_parameters'], ['maximum_recognition'], DataCodeHandle)*创建QRCode的模版
create_data_code_2d_model ('QR Code', ['default_parameters'], ['maximum_recognition'], DataCodeHandle1)*创建PDF417的模版
create_data_code_2d_model ('PDF417', ['default_parameters'], ['maximum_recognition'], DataCodeHandle2)*2设置模版参数
*set_data_code_2d_param (DataCodeHandle1, 'polarity', 'light_on_dark')*3  加载多张图片
list_files ('D:/Halcon/Halcon/2025.6.19 兼容多种二维码、 二维码中文码、 环型的条形码检测/2025.6.19 兼容多种二维码、 二维码中文码、 环型的条形码检测/二维码扩展例子/兼容多种二维码读取案例/二维码', 'files', Files)
*ignore_case 无论大小写
tuple_regexp_select (Files, ['.(png|jpg)','ignore_case'], Selection)*4 循环遍历进行查找2微码
for Index := 0 to |Selection|-1 by 1read_image (Image, Selection[Index])*匹配D码*ResultHandles 结果句柄  DecodedDataStrings 结果字符串find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)*二维码的轮廓的数量count_obj (SymbolXLDs, Number)if (Number>0)*证明是D码disp_message (WindowHandle,'发现的是D码:'+ DecodedDataStrings, 'window', 12, 12, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true') //按f5继续提示stop ()else*查找pdf码find_data_code_2d (Image, SymbolXLDs1, DataCodeHandle2, [], [], ResultHandles1, DecodedDataStrings1)count_obj (SymbolXLDs1, Number1)if (Number1>0)*证明是PDF码disp_message (WindowHandle,'发现的是PDF码:'+ DecodedDataStrings1, 'window', 12, 12, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true') //按f5继续提示stop ()else*查找QRCodefind_data_code_2d (Image, SymbolXLDs2, DataCodeHandle1, [], [], ResultHandles2, DecodedDataStrings2)count_obj (SymbolXLDs2, Number2)if (Number2>0)disp_message (WindowHandle,'发现的是QR码:'+ DecodedDataStrings2, 'window', 12, 12, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true') //按f5继续提示 stop ()elsedisp_message (WindowHandle,'未发现任何码', 'window', 12, 12, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true') //按f5继续提示 stop ()endifendifendif
endfor*释放模版实例
clear_data_code_2d_model (DataCodeHandle2)
clear_data_code_2d_model (DataCodeHandle1)
clear_data_code_2d_model (DataCodeHandle)

​显示箭头

显示箭头案列```c
**** 主要内容:如何获取图像与平行线的夹角
**** 基于夹角 生成带有方向的箭头
dev_update_off ()
read_image (Image, 'D:/Halcon/Halcon/2025.6.19 兼容多种二维码、 二维码中文码、 环型的条形码检测/2025.6.19 兼容多种二维码、 二维码中文码、 环型的条形码检测/一维码扩展例子/Ean13一维码读取并获取条码的坐标和角度/ean13/ean1305.png')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (3)create_bar_code_model (['element_size_min'], [1.5], BarCodeHandle)
for rot :=0 to 360 by 30find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)get_bar_code_result (BarCodeHandle, 'all', 'orientation', angle)area_center (SymbolRegions, Area, cehnterRow, centerCol)gen_arrow_contour_xld (Arrow1, cehnterRow, centerCol, cehnterRow, centerCol, 10, 1)* 难题:怎么基于 区域的中线点,与 图像与水平面的弧度,求xld的起点和终点* 以区域中心坐标为基准点,该点是,箭头上的点* 以为该点位置,将箭头分为2个部分:假设第一部分,长度为100 第二部长度为80* 已:匹配模板与水平面的夹角  rad(angle)* 求:起点 行列坐标 与 终点行列坐标 、 下面就是计算公式。startRow:= cehnterRow +sin(rad(angle)) * 100 startCol := centerCol - cos(rad(angle)) * 100 endRow := cehnterRow - sin(rad(angle)) * 80endCol := centerCol + cos(rad(angle)) * 80gen_arrow_contour_xld (Arrow, startRow, startCol, endRow, endCol, 20, 20)* 显示结果dev_display (Image)dev_display (SymbolRegions)dev_display (Arrow)rotate_image (Image, Image, rot, 'constant')stop()endfor

注意事项

  • 光照不均或污损可能影响识别率,需结合图像增强技术。
  • 高密度二维码需确保图像分辨率足够(建议≥5像素/模块)。
http://www.dtcms.com/a/390317.html

相关文章:

  • 【数据库系统Trip 第1站】总概
  • 关于 Python 编程语言常见问题及技术要点的说明
  • Mysql常用函数积累
  • AntV可视化(MCP 1.8)避坑指南
  • 学习日报|线程池 OOM
  • C# Progress
  • 【LeetCode 每日一题】3495. 使数组元素都变为零的最少操作次数
  • Part01、02 基础知识与编程环境、C++ 程序设计
  • C++聊天系统从零到一:brpc RPC框架篇
  • Java编程思想 Thinking in Java 学习笔记——第2章 一切都是对象
  • AssemblyScript 入门教程(2)AssemblyScript的技术解析与实践指南
  • 深入理解Java数据结构
  • 【试题】网络安全管理员考试题库
  • 第一章 信息化发展
  • 第六章:实用调试技巧
  • 人工智能通识与实践 - 智能语音技术
  • CSP-S 提高组初赛复习大纲
  • 卷积神经网络CNN-part7-批量规范化BatchNorm
  • [xboard]02 uboot下载、移植、编译概述
  • Python入门教程之字符串运算
  • 堡垒机部署
  • 刷题记录(10)stack和queue的简单应用
  • 如何进行时间管理?
  • Spring面试题及详细答案 125道(46-65) -- 事务管理
  • OA ⇄ CRM 单点登录(SSO)实现说明
  • 人工智能在设备管理软件中的应用
  • __pycache__ 文件夹作用
  • 利欧泵业数据中心液冷系统解决方案亮相2025 ODCC开放数据中心峰会
  • 【论文阅读】Masked Conditional Variational Autoencoders for Chromosome Straightening
  • 天气预测:AI 如何为我们 “算” 出未来的天空?