Halcon的二维码解码步骤和解码技巧

一、二维码简介

1 . 类型多样,常见的有QR Code二维码、 Data Matrix二维码等。

2.高密度编码,信息容量大。

3.容错能力强,具有纠错功能:二维码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。

4.译码可靠性高:它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。

5.可引入加密措施:保密性、防伪性好。

二、图像预处理和二维码增强

对比度太低:scale_image(或使用外部程序scale_image_range),增强图像的对比度。

图像模糊:emphasize锐化图像,使二维码看起来更清晰。

三、解码涉及的主要算子

read_image :读图

create_data_code_2d_model :创建二维码模型

find_data_code_2d :查找二维码

clear_data_code_2d_model :清除二维码模型

还有几个算子也值得注意一下:

set_data_code_2d_param :设置解码时的参数

get_data_code_2d_param :获取解码时的参数(如果没有设置过,则获得的是默认值)

get_data_code_2d_results :获得解码后的一些结果

四、提高解码能力的其他措施

如果二维码图像预处理以后,仍旧解码困难或者解码率不高,那么可以通过以下措施进一步提高解码能力:

1、如果整张图信息太多,则可以先把二维码区域挖出来,使用reduce_domain和crop_domain算子,这样不仅可以降低解码难度,还可以减少解码时间。

2、当二维码很小的时候,可以尝试用zoom_image_factor放大了二维码图像。

3、create_data_code_2d_model (‘QR Code‘, [], [], DataCodeHandleQR)

创建模型时,[ ]中不填内容,实际默认属性名是‘default_parameters’,默认属性值是‘standard_recognition’。

如果想大幅度提高解码成功率,可以将属性值置为‘enhanced_recognition’或者‘maximum_recognition’。注意:解码能力越强,解码时间越长

4、find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, ‘train‘, ‘all‘, ResultHandles, DecodedDataStrings)

该算子中的GenParamNames、GenParamValues默认是空的,就是说直接找,找不到拉倒。如果是‘train‘,就是一面找一面调整模板参数。

默认情况下,只会最多找到1个二维码。如果想找出更多的二维码(例如3个),可以这样:

find_data_code_2d (Image2, SymbolXLDs, DataCodeHandle, ‘stop_after_result_num‘, 3, ResultHandles, DecodedDataStrings)

5、如果对于质量很差的二维码,可以模拟日常手机扫码时的操作,即多次改变曝光,多次解码的方式,参考文章:

https://www.cnblogs.com/xh6300/p/9809692.html

6、通过set_data_code_2d_param算子设置解码时的参数,可以有效提高解码能力。(见下文)

五、set_data_code_2d_param算子的参数解析


‘default_parameters‘


‘standard_recognition’、‘enhanced_recognition’、‘maximum_recognition’


‘timeout‘


延迟时间,超过这个时间还没找到就不找了


‘polarity‘


极性,可设置‘dark_on_light‘(白色背景黑码)或者‘light_on_dark‘


‘module_size_min‘


最小码粒像素大小,码粒大小指的二维码中矩形颗粒的宽度(存疑)


‘module_size_max‘


最大码粒像素大小

下面用一个完整的例子来演示一下:

 1 *提高解码率的设置项:
 2 *1、‘default_parameters‘, ‘‘enhanced_recognition‘‘
 3 *2、‘polarity‘, ‘dark_on_light‘
 4 *3、[‘module_size_min‘,‘module_size_max‘]
 5 *4、挖出二维码区域,挖得越精确越好(周围最好不要有其他黑色像素块干扰),这一部分我现在只是粗略挖了一下
 6 *5、增强图像对比度,我设计的函数enhanced_contrast (将图像色阶从0-255重新映射到Min到Max之间)
 7
 8 * create_data_code_2d_model (‘QR Code‘, ‘default_parameters‘, ‘enhanced_recognition‘, DataCodeHandleQR)
 9 create_data_code_2d_model (‘QR Code‘, [], [], DataCodeHandleQR)
10
11 set_data_code_2d_param (DataCodeHandleQR, ‘default_parameters‘, ‘enhanced_recognition‘)
12 set_data_code_2d_param (DataCodeHandleQR, ‘timeout‘, 200)
13 set_data_code_2d_param (DataCodeHandleQR, ‘polarity‘, ‘dark_on_light‘)
14
15 * 码粒个数设置(有几种二维码设置这个参数非法)
16 * set_data_code_2d_param(DataCodeHandleQR,‘symbol_size_max‘, 11)
17 * set_data_code_2d_param(DataCodeHandleQR,‘symbol_size_max‘, 31)
18
19 count := 0
20 dev_set_line_width (3)
21 dev_set_draw(‘margin‘)
22
23 list_files (‘OK_NG‘, [‘files‘,‘follow_links‘,‘recursive‘], ImageFiles)
24 tuple_regexp_select (ImageFiles, [‘\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$‘,‘ignore_case‘], ImageFiles)
25 for i:= 0 to |ImageFiles|-1 by 1
26     read_image(Image,ImageFiles[i])
27
28     *挖出条码区域,提高解码率和解码速度
29     gen_rectangle1 (Rectangle, 50, 100, 560, 700)
30     reduce_domain (Image, Rectangle, ImageReduced)
31     crop_domain (ImageReduced, ImagePart)
32
33     *增强图像对比度(后文有该函数说明)
34     enhanced_contrast (ImagePart, Image2, 40, 180)
35
36     * 码粒像素设置
37     set_data_code_2d_param(DataCodeHandleQR, [‘module_size_min‘,‘module_size_max‘], [12,40])
38
39     *如果GenParamNames, GenParamValues不填,那么默认只找一个二维码,将‘stop_after_result_num‘设置为3指最多找3个
40 *     find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)
41     find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, ‘stop_after_result_num‘, 3, ResultHandles, DecodedDataStrings)
42
43     tuple_length (DecodedDataStrings, Length)
44
45     *找不到的话,改一下参数再找一遍
46     if (Length == 0)
47         set_data_code_2d_param (DataCodeHandleQR, [‘module_size_min‘,‘module_size_max‘], [20,40])
48         find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)
49     endif
50
51     tuple_length (DecodedDataStrings, Length)
52     if (Length > 0 )
53         count := count + 1
54     endif
55
56     *这个算子好像并不能评价质量
57     get_data_code_2d_results (DataCodeHandleQR, ‘all_candidates‘, ‘quality_isoiec15415_labels‘, ResultValues)
58     get_data_code_2d_param (DataCodeHandleQR, ‘polarity‘, GenParamValues)
59     dev_display(SymbolXLDs)
60     disp_message (3600, ‘解码结果:‘ + DecodedDataStrings, ‘image‘, 20, 50, ‘black‘, ‘true‘)
61     disp_message (3600, ‘解码成功率:‘ + count + ‘/‘ +|ImageFiles| , ‘image‘, 40, 50, ‘black‘, ‘true‘)
62 *      stop ()
63 endfor

函数enhanced_contrast (ImagePart, Image2, 40, 180)的具体实现是:

Mult := 255.0 / (Max - Min)
Add := -Mult * Min
scale_image (Image, Image2, Mult, Add)
return ()

执行结果:

参考资料:

1、halcon例程学习笔记(11) 一维码、二维码识别

2、浅谈Halcon二维码识别技巧

原文地址:https://www.cnblogs.com/xh6300/p/10492110.html

时间: 2024-08-28 10:37:59

Halcon的二维码解码步骤和解码技巧的相关文章

【Java】利用Java对网址进行二维码的编码与解码操作

二维码之所以能够封装图片.文件等主要是把图片.文件等URL编码成二维码,用户一扫手机自动访问. 上一次在<[jQuery]使用jquery-qrcode插件把网址转化成二维码,手机扫一扫即可访问>(点击打开链接)使用jquery-qrcode插件配合jquery能够把网址编码成字符串,在网址上显示编码后的二维码,移动设备能够直接扫一扫. 这次将在Java中实现对二维码的编码与解码输出到磁盘上,无需在网页中进行,而且还可以解码,但是步骤比较复杂而已. Java自身当然没有二维码的编码与解码的功能

使用Zint和Zxing实现二维码的编码与解码(Using open-source tools to generate and decode Q-R code)

1.Zint生成二维码 http://sourceforge.net/projects/zint/ [1]从上述站点下载Zint工具 [2]安装Zint工具 [3]使用Zint工具生成二维码,注意选择类型,并输入要生成的文本,此处我输入的是Hello World,Everyone! [4]保存Q-R二维码图像 这样我们的Q-R二维码图像就保存成功了[保存为hello.png]. 2.使用Zxing进行解码 Zxing是大名鼎鼎的条码处理开源项目,提供了多个平台上各种标准条形码的生成与解码工具.

二维码开发步骤

二维码当下很流行,想要在C/S架构中实现本机二维码,同时能列印标签还是挺不容易的.没有现成的教程和源代码供使用.下面就一步一步实现本机二维码图片做说明. 1.二维码编码公共程序模块 2.调用二维码生成图片和顺序号模块 3.程序逻辑模块,格式字符串转换为二维码图片 4.套表模板调用保存好的二维码图片列印 上面4个步骤,都是在上一步的模块上实现的,也就是说会调用上一步的函数. 1.实现两个dll,我也是网上找的,自己也不是大牛,之前在google里面看到牛人用c++实现的源码.佩服但是自己看不懂.

C#实现二维码生成与解码

前几天公司内部分享了一个关于二维码的例子,觉得挺好玩的,但没有提供完整的源码.有时候看到一个好玩的东西,总想自己Demo一个,于是抽空就自己研究了一下. 一.二维码的原理 工欲善其事,必先利其器.要生成二维码,首先得了解一下,什么是二维码.关于二维码,百度百科是这么说的:二维条码(二维码)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的.二维码是DOI(Digital Object Unique Identifier,数字对象唯一识别符)的一种.二维码的优

二维码知识介绍

一.二维码的分类 二维码,从字面上看就是用两个维度(水平方向和垂直方向)来进行数据的编码,条形码只利用了一个维度(水平方向)表示信息,在另一个维度(垂直方向)没有意义,所以二维码比条形码有着更高的数据存储容量. 从形成方式上,二维码可以分为两类, 1.堆叠式二维码:在一维条形码的基础上,将多个条形码堆积在一起进行编码,常见的编码标准有PDF417等 图1 PDF417码示例 2.矩阵式二维码:在一个矩阵空间中通过黑色和白色的方块进行信息的表示,黑色的方块表示1,白色的方块表示0,相应的组合表示了

java代码解析二维码

java代码解析二维码一般步骤 本文采用的是google的zxing技术进行解析二维码技术,解析二维码的一般步骤如下: 一.下载zxing-core的jar包: 二.创建一个BufferedImageLuminanceSource类继承LuminanceSource,此类在google的源码中有,但是为了使用方便,下面有此类的源码,可以直接复制使用: private final BufferedImage image; private final int left; private final

Android应用--QR的生成(二维码)

二维码的定义: 二维码(2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的. 在许多种类的二维条码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K等.1.堆叠式/行排式二维条码,如,Code 16K.Code 49.PDF417(如下图)等. 2.矩阵式二维码,最流行莫

Android基于Google Zxing实现二维码/条形码扫描、生成二维码/条形码

 二维码/条形码生成器 二维码/条形码扫描器 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有,还有分享名片功能(也是一张二维码图片,识别扫描). 下面小编将通过文章主要介绍QRCode方面技术. QRCode是被广泛应用的一种二维码,解码速度快.二维码相对于条形码来说,二维码的存储数据量更大,空间利用率高,有一定的容错性. 二维码原理介绍: 二维码是用某种特定的几何图形按一定的规律在平面上分布的黑

iOS开发-二维码

二维码 从ios7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器 生成二维码的步骤: 倒入CoreImage框架 通过滤镜CIFilter生成二维码 二维码的内容(传统的条形码职能放数字) 纯文本 名片 URL 二维码的生成 // 1.创建过滤器 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // 2.恢复默认 [filter setDefaults]; //