一、二维码概念:
指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。二维条码的种类很多,不同的机构开发出的二维条码具有不同的结构以及编写、读取方法。堆叠式/行排式二维条码,如,Code 16K、Code 49、PDF417等矩阵式二维码,最流行莫过于QR CODE。
它的优点有:二维码存储的数据量更大;可以包含数字、字符,及中文文本等混合内容;有一定的容错性(在部分损坏以后可以正常读取);空间利用率高等。
二、二维码编码过程:
1、数据分析:确定编码的字符类型:是数字、字母、还是汉字等,然后按相应的字符集转换成符号字符。
2、数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。
例:以对数据01234567编码为例
- 分组:012 345 67
- 转成二进制:
012→0000001100(1* 2³+1* 2²+0* 2^0+0* 2^0)
345→0101011001
67 →1000011 - 转成序列:0000001100 0101011001 1000011
- 字符数 转成二进制:8→0000001000
- 加入模式指示符(上图数字)0001:0001 0000001000 0000001100 0101011001 1000011
对于字母、中文、日文等只是分组的方式、模式等内容有所区别,基本方法是一致的。二维码虽然比起一维条码具有更强大的信息记载能力,但也是有容量限制
三、普通二维码的基本结构:
- 校正图形:规格确定,校正图形的数量和位置也就确定了;
- 格式信息:表示改二维码的纠错级别,分为L(5%)、M(15%)、Q(20%)、H(最高级别);
- 版本信息:即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21×21(版本1),到177×177(版本40),每一版本符号比前一版本 每边增加4个模块。
- 数据和纠错码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误)。
了解了二维码的基本结构后,将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中,并把上面的完整序列填充到相应规格的二维码矩阵的区域中。
四、halcon 二维码调用算子流程:
- 1、创建模型——create_data_code_2d_model (‘QR Code’, [], [], DataCodeHandleQR)
其参数三:适应二维模型数据的一般参数
standard_recognition’:识别快,准确地不高——图像干扰较少、背景不复杂时可选
enhanced_recognition’:识别稍慢,准确度较高
maximum_recognition’:识别稍慢,准确度较高——如果想大幅度提高解码成功率,可以将属性值置‘maximum_recognition’
创建模型时,[ ]中不填内容,参数二默认属性名是‘default_parameters’,参数三默认属性值是‘standard_recognition’。注意:解码能力越强,解码时间越长。 - 2、设置参数 ——set_data_code_2d_param :参数名称+参数值 ,设置解码时的参数,可以有效提高解码能力。
set_data_code_2d_param (DataCodeHandle, [‘module_size_min’,‘module_size_max’], [3,11]) 二维码模块之间最小距离和最大距离
set_data_code_2d_param (DataCodeHandle, ‘module_gap’, ‘no’)
set_data_code_2d_param (DataCodeHandle, ‘polarity’, ‘any’) 极性(背景和二维码谁暗谁亮,any表示都识别)
set_data_code_2d_param (DataCodeHandle, ‘mirrored’, ‘no’) 镜像
set_data_code_2d_param (DataCodeHandle, ‘contrast_min’, 20) 对比度
set_data_code_2d_param (DataCodeHandle, ‘symbol_size_min’, 19) 二维码尺寸最小值
set_data_code_2d_param (DataCodeHandle, ‘symbol_size_max’, 143) 二维码尺寸最大值
set_data_code_2d_param (DataCodeHandle, ‘contrast_tolerance’, ‘high’ ) 对比容忍度:当二维码亮度不均匀时,可以将对比容忍度设置为高
set_data_code_2d_param(DataCodeHandle,‘small_modules_robustness’,‘high’) 最小模块的鲁棒性,'high'
— 识别能力较强
set_data_code_2d_param (DataCodeHandleQR, ‘timeout’, 200) 将解码时长限制在200ms内,这意味着,及时解不出条码,200ms之后制动放弃该条码的解析。 - 3、找到二维码 ——find_data_code_2d
如:find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, ‘train’, ‘all’, ResultHandles, DecodedDataStrings)
①默认值是直接找,找不到拉倒。如果是'train'
,就是一面找一面调整模板参数。②二维码不好辨别,不清晰时,可以试着调整参数五,增加训练的模型参数的个数 - 4、清除模板——clear_data_code_2d_model
注:设置参数的目的就是加上限制条件,以便更准确识别二维码。在前三步哪一步设置都可以。要多个参数生效,加中括号,逗号隔开即可。此外获得中间结果的算子有:get_data_code_2d_results、get_data_code_2d_objects
注意:有时候直接调用算子是识别不出二维码的,这时候我们需要考虑细节(图像参预处理)、参数方面的设置,比如如果找不到二维码,可能需要增强对比度,滤波等;点状二维码,有时需要掩膜(将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布)等。
五、实战:
dev_close_window () dev_open_window (0, 0, 680, 350, 'black', WindowHandle) read_image (Image, 'C:/Users/Administrator/Desktop/图片/1.jpg') create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle) set_data_code_2d_param (DataCodeHandle, 'polarity', 'light_on_dark') find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings) disp_message (WindowHandle, '识别结果:'+DecodedDataStrings, 'window', 12, 12, 'black', 'true') clear_data_code_2d_model (DataCodeHandle)
总结:
识别二维码一般需要根据图像的好坏来决定是否需要对它进行预处理、如何设置它的参数。以及需要了解每种参数针对图像哪种缺陷,这样才能通过设置参数来更好的识别二维码。
注:如果将halcon导入MFC中显示,还需要在显示代码下面加入如下代码去除字符串两边的单引号。
戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。 |