1. 程式人生 > >Halcon中二維碼解析函數解碼率和時長的優化方法

Halcon中二維碼解析函數解碼率和時長的優化方法

實現 creat module erl 包括 isp display 驅動 其中

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)

Halcon中二維碼解析函數解碼率和時長的優化方法