• Halcon中二维码解析函数解码率和时长的优化方法


        Halcon中条码解析函数包容多种条码类型且简单强大。现有的‘Data Matrix ECC 200’、‘QR Code’和‘PDF417’等广泛使用的条码均能解析。简单是通过默认参数即可对多种条码进行解析;强大是指通过设定条码的参数能够获得更高的解码率以及大幅度的降低解码时间。

    1. 解码入门——默认参数的使用

           Halcon中的解码共分为3步:一是创建解码模型;二是对图片进行解码;最后是清除模型。

    1. 1创建解码模型

           创建解码模型的函数如下: 
    create_data_code_2d_model (: : SymbolType, GenParamNames, GenParamValues : DataCodeHandle) 
           其中,SymbolType是二维码模型,Halcon10支持‘Data Matrix ECC 200’、‘QR Code’和‘PDF417’共3种类型。 
           GenParamNames是二位码模型的属性。如果是默认属性,其值为‘default_parameters’。除了默认属性之外,还有各种不同的二维码属性,这些属性需要根据二维码的实际情况来设置。 
            GenParamValues是属性的值。如果是默认属性,则有3种级别的值: 
    ‘standard_recognition’、‘enhanced_recognition’、‘maximum_recognition’。 
           其中,standard_recognition的解码能力一般,而maximum_recognition的解码能力最强。但凡事均具有两面性,这三种级别的值在提高了解码率的同时,也提高了解码失败时的解码时长。而且使用高级别的解码函数在解不出来的情况下,解码时长甚至有达到6s的情况,这在工业控制领域内绝对是无法忍受的。不过,我们可以通过设置参数来调整,这正是本文的第二节要讲述的内容。 
           如果不是默认属性,就根据实际属性和实际的二维码图片来设置属性的值。 
           DataCodeHandle是该函数所创建模型的句柄,是输出控制变量。

    1.2 解码

           在建立了模型之后,使用如下解码函数,就可以在输入图像Image中进行解码了。 
    find_data_code_2d(Image : SymbolXLDs : DataCodeHandle, GenParamNames, GenParamValues : ResultHandles, DecodedDataStrings) 
           其中,Image是输入的二维码图像。 
           SymbolXLDs是解码成功后找到并输出的二维码边缘。 
           DataCodeHandle是create_data_code_2d_model创建的二维码模型句柄。 
           GenParamNames是解码函数的属性名,默认值为 []。 
           GenParamValues是解码函数的属性值,默认值为 []。 
           ResultHandles和DecodedDataStrings输出值,分别是解码结果句柄和解出来的二维码字符串。

    1.3清除模型

           良好的编程习惯之一即是及时清理内存。使用clear_data_code_2d_model函数能清理创建的二维码模型。 
    clear_data_code_2d_model (DataCodeHandle) 
           DataCodeHandle是创建的二维码模型句柄。

    1.4 默认模型程序示例

           通过以上3个步骤,建立模型、解码和清除模型内存就能轻松的进行解码了。下面是程序示例

    *创建模型
    create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle) 
    该模型默认属性是‘default_parameters’,默认属性值是 ‘standard_recognition’。实际上,为了获得更好的解码结果,可以将属性值置为‘enhanced_recognition’、‘maximum_recognition’。
    *读取图片
    read_image (Image, 'E:/驱动/py/20160801/001501_4_Mic .bmp')
    *解码
    find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], 
                       ResultHandles, DecodedDataStrings)
    默认为空,也可以使用‘train’, ‘all’配套属性参数,在这种方式下,模型会自主微参数来达到最好的解码效果。
    find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, ‘train’, ‘all’, 
                       ResultHandles, DecodedDataStrings)
    *清除模型
    clear_data_code_2d_model (DataCodeHandle)
    create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle) 

    2 解码升级——解码参数的设置

           在解码入门之后,下面介绍的就是本文的重头戏。在工业级别的解码器上,首先要考虑的需求有两个,一是解码率尽可能高,二是CT时间尽可能短,也就是解码所耗费的时间尽可能短。因此,如果简单使用最大化解码的参数,在无法解码的情况下就会导致解码耗时过长,而不使用最大化解码参数,则解码率会有所下降。那么,“世上安得双全法,不负如来不负卿”。而下文介绍的,便是既能获得高解码率,又能降低解码时长的方式。其重点在与解码模型的建立与其解码参数的设置。

    2.1 解码模型的参数

           首先,为了获得高解码率,必须要使用如下函数建立解码模型 
    create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'maximum_recognition', DataCodeHandle) 
           同时,在建立解码模型之后,调用如下函数对模型进行参数的修正。 
           (1)其中最终要的参数之一是解码时长的设置,如果解码函数在一定时长范围内难以解出条码,直接将条码丢弃也是一种弃车保帅的明智之举。而如下参数设置函数能实现 
    set_data_code_2d_param (DataCodeHandle, 'timeout', 200) 
           如下函数能将解码时长限制在200ms内,这意味着,及时解不出条码,200ms之后制动放弃该条码的解析。 
           (2)就是条码极性的设置,所谓极性是指条码颜色和条码底色。如下函数设置指明,条码较亮,而底色较暗。如果实际图片与设置的极性吻合,就能有较好的检测的结果。注意:如果极性设置与实际相反,则会严重的降低解码率。 
    set_data_code_2d_param (DataCodeHandle, 'polarity', 'light_on_dark') 
           (3)条码的基本特征设置,二维码的基本特征包括码粒数、码粒像素大小。比如二维码码粒数,ECC 200的条码每行大约有18个码粒。而每个码粒所占的像素大小需根据实际的情况来设置。注意:如下代码的参数需为偶数。

    *码粒个数设置
    set_data_code_2d_param (DataCodeHandle, 'symbol_size_min', 16)
    set_data_code_2d_param (DataCodeHandle, 'symbol_size_max', 20)
    *码粒像素设置
    set_data_code_2d_param (DataCodeHandle, 'module_size_min', 10)
    set_data_code_2d_param (DataCodeHandle, 'module_size_max', 14)

       通过这些设置,极大的减小了解码时长,另一方面,也能保障有较高的解码率。

    2.2 示例

    create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'maximum_recognition', DataCodeHandle)
    set_data_code_2d_param (DataCodeHandle, 'timeout', 200)
    set_data_code_2d_param (DataCodeHandle, 'polarity', 'light_on_dark')
    set_data_code_2d_param (DataCodeHandle, 'symbol_size_min', 16)
    set_data_code_2d_param (DataCodeHandle, 'symbol_size_max', 20)
    set_data_code_2d_param (DataCodeHandle, 'module_size_min', 10)
    set_data_code_2d_param (DataCodeHandle, 'module_size_max', 14)
    read_image (Image, 'E:/驱动/py/20160801/001501_4_Mic .bmp')
    find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], 
                       ResultHandles, DecodedDataStrings)
    clear_data_code_2d_model (DataCodeHandle)
  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/touch-skyer/p/8257836.html
Copyright © 2020-2023  润新知