halcon二维码识别

1、一维条码
一维条码:由一组规则排列的条、空以及对应的字符组成的标记,“条”指对光线反射率较低的部分,“空”指对光线反射率较高的部分,这些条和空组成的数据表达一定的信息,并能够用特定的设备识读,转换成与计算机兼容的二进制和十进制信息。

一维条码的码制: EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码,及Codabar(库德巴码)等。

EAN 码:是国际通用的符号体系,是一种长度固定、无含意的条码,所表达的信息全部为数字,主要应用于商品标识
39码和128码:为目前国内企业内部自定义码制,可以根据需要确定条码的长度和信息,它编码的信息可以是数字,也可以包含字母,主要应用于工业生产线领域、图书管理等
93码:是一种类似于39码的条码,它的密度较高,能够替代39码
25码:主要应用于包装、运输以及国际航空系统的机票顺序编号等
Codabar码:应用于血库、图书馆、包裹等的跟踪管理
ISBN:用于图书管理

组成:

一个完整的条码的组成次序依次为:静区(前)、起始符、数据符、(中间分割符,主要用于EAN码)、(校验符)、终止符、静区(后),
如图:

静区,指条码左右两端外侧与空的反射率相同的限定区域,它能使阅读器进入准备阅读的状态,当两个条码相距距离较近时,静区则有助于对它们加以区分,静区的宽度通常应不小于6mm(或10倍模块宽度)。
起始/终止符,指位于条码开始和结束的若干条与空,标志条码的开始和结束,同时提供了码制识别信息和阅读方向的信息。
数据符,位于条码中间的条、空结构,它包含条码所表达的特定信息。
构成条码的基本单位是模块,模块是指条码中最窄的条或空,模块的宽度通常以mm或mil(千分之一英寸)为单位。构成条码的一个条或空称为一个单元,一个单元包含的模块数是由编码方式决定的,有些码制中,如EAN码,所有单元由一个或多个模块组成;而另一些码制,如39码中,所有单元只有两种宽度,即宽单元和窄单元,其中的窄单元即为一个模块。

2、二维条码
二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。容错机制在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。

××××××××××××××××××××××××××××××××××××××××××××
二维条码的码制:

  1. 堆叠式/行排式二维条码
    堆叠式/行排式二维条码(又称堆积式或层排式二维码),其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417等。
  2. 矩阵式二维码
    短阵式二维条码(又称棋盘式二维码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、Maxi Code、QR Code、 Data Matrix等。
    整体说下二维码的码制:PDF417二维条码, Datamatrix二维条码, Maxicode二维条码, QR Code, Code 49, Code 16K ,Code one,等,除了这些常见的二维条码之外,还有Vericode条码、CP条码、Codablock F码、田字码、 Ultracode码,Aztec条码。
    ×××××××××××××××××××××××××××××××××××××
    特点:

二维条码/二维码的特点
1.高密度编码,信息容量大:可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。
2.编码范围广:该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表示出来;可以表示多种语言文字;可表示图像数据。
3.容错能力强,具有纠错功能:这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。
4.译码可靠性高:它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。
5.可引入加密措施:保密性、防伪性好。
6.成本低,易制作,持久耐用。
7.条码符号形状、尺寸大小比例可变。
8.二维条码可以使用激光或CCD阅读器识读。

3、halcon中支持的一维条码与二维码
HALCON支持的一维码的码制:
‘2/5 Industrial’, ‘2/5 Interleaved’, ‘Codabar’, ‘Code 128’, ‘Code 39’, ‘Code 93’, ‘EAN-13 Add-On 2’, ‘EAN-13 Add-On 5’, ‘EAN-13’, ‘EAN-8 Add-On 2’, ‘EAN-8 Add-On 5’, ‘EAN-8’, ‘GS1 DataBar Expanded Stacked’, ‘GS1 DataBar Expanded’, ‘GS1 DataBar Limited’, ‘GS1 DataBar Omnidir’, ‘GS1 DataBar Stacked Omnidir’, ‘GS1 DataBar Stacked’, ‘GS1 DataBar Truncated’, ‘GS1-128’, ‘MSI’, ‘PharmaCode’, ‘UPC-A Add-On 2’, ‘UPC-A Add-On 5’, ‘UPC-A’, ‘UPC-E Add-On 2’, ‘UPC-E Add-On 5’, ‘UPC-E’, ‘auto’

用到的函数:
create_bar_code_model
find_bar_code
clear_bar_code_model
×××××××××××××××××××××××××××××××××××××××××××××××××××
HALCON支持的二维码的码制:
‘Aztec Code’, ‘Data Matrix ECC 200’, ‘GS1 Aztec Code’, ‘GS1 DataMatrix’, ‘GS1 QR Code’, ‘Micro QR Code’, ‘PDF417’, ‘QR Code’
用到的函数:
create_data_code_2d_model
find_data_code_2d
clear_data_code_2d_model

4、一维条码halcon中实战
首先测试 一维码。 码制选择为:Code 128
相关资料:http://www.systron.com.cn/128.htm
素材见下图:

read_image(Image,‘128.jpg’)
rgb1_to_gray (Image, GrayImage)
dev_set_draw (‘margin’)
*第一步:读取模板
*创建一个条形码阅读器的模型。
*参数一:输入 通用参数可以调整条形码模型的名称。
*参数二:通用参数可以调整条形码模型值。
*参数三: 返回的条码模板句柄
create_bar_code_model ([], [], BarCodeHandle)
*第二步:使用模板
*检测和读取条形码符号中的图像。
**参数以此是:
*输入的图像,输出的区域。
*输入的模板句柄,输入条码的码制
*返回所有成功解码的条码数据字符串。
find_bar_code (GrayImage, SymbolRegions, \
BarCodeHandle, ‘auto’, \
DecodedDataStrings)
**既然读取来就显示一下吧
disp_message (3600, DecodedDataStrings, \
‘window’, 12, 12, ‘black’, ‘true’)
*第三步:从内存中把模板清理掉,当然了 你想叫销毁也可以
clear_bar_code_model (BarCodeHandle)

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’

最大码粒像素大小
5、二维码识别halcon中实战
素材:

read_image(Image,‘222.jpg’)
rgb1_to_gray (Image, GrayImage)
第一步:创建模板***************************************************************************
*初学者创建模板时建议选择使用默认参数集(参数集,是多个参数构成的集合):‘default_parameters’
*default_parameters有3种识别模式(识别模式越强,适应场合越广,适应能力和识别能力越强,但耗时越多):
*standard_recognition 标准模式
*enhanced_recognition 加强模式
*maximum_recognition 最强模式
*建议初学者选用 ‘maximum_recognition’
*参数一:输入你要读取的二维码的码制
*参数二:通用参数可以调整为二维码数据模型的名称。
*参数三:通用参数可以调整为二维码数据模型的价值。
*参数四:返回二维码模板句柄

create_data_code_2d_model (‘QR Code’,\
‘default_parameters’, \
‘maximum_recognition’,\
DataCodeHandle)
**第二步:使用模板
find_data_code_2d (GrayImage,\
SymbolXLDs,\
DataCodeHandle, ‘train’, ‘all’,\
ResultHandles, DecodedDataStrings)

  • 参数依次是
    *参数一:输入的图像
    *参数二:XLD轮廓包围成功解码后的数据代码符号。 就是如果找到二维码所在的区域 ,
    *就将那个区域的XLD返回,注意可能输组
    *参数三:所使用的模板句柄
    *参数四:查找模式。 默认是空的 就是说直接找,找不到拉倒。 如果是train,就是一面找一面调整模板参数。
    *参数五:可选的泛型参数的值。
    *参数六:所有成功解码二维码数据符号的句柄。为啥是句柄呢? 如果解码的数据可能很多了。
    *参数七:返回图像中的所有检测到的二维码的数据符号的译码数据串。
    **第三步: 释放模板
    clear_data_code_2d_model(DataCodeHandle)
    ————————————————
*提高解码率的设置项:
*1'default_parameters', ''enhanced_recognition''
*2'polarity', 'dark_on_light'
*3['module_size_min','module_size_max']
*4、挖出二维码区域,挖得越精确越好(周围最好不要有其他黑色像素块干扰),这一部分我现在只是粗略挖了一下
*5、增强图像对比度,我设计的函数enhanced_contrast (将图像色阶从0-255重新映射到Min到Max之间)

* create_data_code_2d_model ('QR Code', 'default_parameters', 'enhanced_recognition', DataCodeHandleQR) 
create_data_code_2d_model ('QR Code', [], [], DataCodeHandleQR) 

set_data_code_2d_param (DataCodeHandleQR, 'default_parameters', 'enhanced_recognition')
set_data_code_2d_param (DataCodeHandleQR, 'timeout', 200)
set_data_code_2d_param (DataCodeHandleQR, 'polarity', 'dark_on_light')

* 码粒个数设置(有几种二维码设置这个参数非法)
* set_data_code_2d_param(DataCodeHandleQR,'symbol_size_max', 11)
* set_data_code_2d_param(DataCodeHandleQR,'symbol_size_max', 31)

count := 0
dev_set_line_width (3)
dev_set_draw('margin')

list_files ('OK_NG', ['files','follow_links','recursive'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for i:= 0 to |ImageFiles|-1 by 1       
    read_image(Image,ImageFiles[i])  
    
    *挖出条码区域,提高解码率和解码速度
    gen_rectangle1 (Rectangle, 50, 100, 560, 700)  
    reduce_domain (Image, Rectangle, ImageReduced)
    crop_domain (ImageReduced, ImagePart)
    
    *增强图像对比度(后文有该函数说明)
    enhanced_contrast (ImagePart, Image2, 40, 180)
   
    * 码粒像素设置
    set_data_code_2d_param(DataCodeHandleQR, ['module_size_min','module_size_max'], [12,40])
    
    *如果GenParamNames, GenParamValues不填,那么默认只找一个二维码,将'stop_after_result_num'设置为3指最多找3*     find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)
    find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, 'stop_after_result_num', 3, ResultHandles, DecodedDataStrings)

    tuple_length (DecodedDataStrings, Length)
    
    *找不到的话,改一下参数再找一遍
    if (Length == 0)
        set_data_code_2d_param (DataCodeHandleQR, ['module_size_min','module_size_max'], [20,40])
        find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)
    endif
    
    tuple_length (DecodedDataStrings, Length)
    if (Length > 0 )
        count := count + 1
    endif
    
    *这个算子好像并不能评价质量
    get_data_code_2d_results (DataCodeHandleQR, 'all_candidates', 'quality_isoiec15415_labels', ResultValues)
    get_data_code_2d_param (DataCodeHandleQR, 'polarity', GenParamValues)
    dev_display(SymbolXLDs)
    disp_message (3600, '解码结果:' + DecodedDataStrings, 'image', 20, 50, 'black', 'true')
    disp_message (3600, '解码成功率:' + count + '/' +|ImageFiles| , 'image', 40, 50, 'black', 'true')
*      stop ()
endfor
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值