region、xld有對應的字符串時,將region、xld按照行或列排序的算法實現


 

 

用Halcon解碼時,如果一張圖里面有多個碼,它通常可以把這些碼都解出來,並且生成對應的解碼結果字符串元組(也就是下面的DecodedDataStrings),如果有多個碼,那么該元組就有多個元素。

① find_bar_code(Image : SymbolRegions : BarCodeHandle, CodeType : DecodedDataStrings)

② find_data_code_2d(Image : SymbolXLDs : DataCodeHandle, GenParamName, GenParamValue : ResultHandles, DecodedDataStrings)

 

一維碼和二維碼解碼的區別是:一維碼解碼后的顯示區域是一個region(SymbolRegions ),而二維碼解碼后的顯示區域是一個xld(SymbolXLDs )

 

碼的顯示區域和解碼字符串是一一對應的。但是有多個碼時,不同碼的顯示區域順序本身是亂排的,並不是按照“行坐標”或者“列坐標”排序的。如何讓它們有序排列,並且字符串和它們的對應關系不變呢?這篇文章即是為了解決這個問題。

 

先了解一個排序算子:tuple_sort_index( : : Tuple : Indices)

基本上,Halcon中絕大多數的排序問題,都需要用到這個算子。關於這個算子的理解,詳見我之前的文章:Halcon選擇一堆region中面積第N大的region的算法實現

 

排序算法設計分析:

① 需排序的數據對假設是(region1, string1)、(region2, string2)、(region3, string3)、(region4, string4)……

② 以一維碼、二維碼以及它們對應的字符串為例,一維碼解碼顯示區域是region,二維碼解碼顯示區域是xld,所以該排序函數要兼容region和xld兩種圖形格式。

③ 為簡單起見,均只設計為從小到大排序。設計了四種排序規則,分別是'row1'(最小外接矩形左上角行坐標)、'row'(中心點行坐標)、'column1'(最小外接矩形左上角列坐標)、'column'(中心點列坐標)

 

封裝的函數簽名為:sort_objects_strings(SourceObjects : SortedObjects : SourceStrings, ObjectType, SortRule : SortedStrings)

sort_objects_strings函數代碼為:

 1 tuple_regexp_replace (ObjectType, ['\\s*','replace_all'], '', ObjectType)  2 tuple_regexp_replace (SortRule, ['\\s*','replace_all'], '', SortRule)  3 
 4 
 5 *是region還是xld  6 if (ObjectType == 'region')  7     ObjectType := 'region'
 8 else 
 9     ObjectType := 'xld'           
10 endif 11 
12 
13 *如果SourceStrings為空,或者SourceObjects和SourceStrings個數不同,這些都屬異常,需return() 14 count_obj (SourceObjects, Num) 15 if (|SourceStrings| ==0 or |SourceStrings| != Num) 16     SortedObjects := SourceObjects 17     SortedStrings := SourceStrings 18     return () 19 endif 20     
21 
22 *邏輯判斷(如果是region) 23 if (ObjectType  == 'region') 24     *row1 row column1 column, 看按哪種規則排序(下同) 25     if (SortRule == 'row1') 26  smallest_rectangle1 (SourceObjects, SortItems, Column1, Row2, Column2) 27     elseif(SortRule == 'column1') 28  smallest_rectangle1 (SourceObjects, Row1, SortItems, Row2, Column2) 29         
30     elseif(SortRule == 'row') 31  area_center (SourceObjects, Area, SortItems, Column) 32     else
33  area_center (SourceObjects, Area, Row, SortItems) 34  endif 35 
36 *邏輯判斷(如果是xld) 37 else
38     if (SortRule == 'row1') 39  smallest_rectangle1_xld (SourceObjects, SortItems, Column1, Row2, Column2) 40     elseif(SortRule == 'column1') 41  smallest_rectangle1_xld (SourceObjects, Row1, SortItems, Row2, Column2) 42         
43     elseif(SortRule == 'row') 44  area_center_xld (SourceObjects, Area, SortItems, Column, PointOrder) 45     else
46  area_center_xld (SourceObjects, Area, Row, SortItems, PointOrder) 47  endif 48     
49 endif 50     
51 
52 * sort_region (SourceObjects, SortedObjects, 'upper_left', 'true', 'row') 53 * sort_contours_xld (SourceObjects, SortedObjects, 'upper_left', 'true', 'row') 54 
55 tuple_sort_index (SortItems, Indices) 56 
57 *SourceStrings和SourceObjects的排序 58 SortedStrings := [] 59 gen_empty_obj (SortedObjects) 60 for i := 0 to Num-1 by 1
61     SortedStrings[i] := SourceStrings[Indices[i]] 62     select_obj (SourceObjects, ObjectSelected, Indices[i] + 1) 63  concat_obj (SortedObjects, ObjectSelected, SortedObjects) 64 endfor 65 
66 return ()

 

 

【示例】

 

程序是用Halcon 17.12寫的,如果是低版本Halcon,那么文本顯示和字體設置的語句略有不同。

 

 1 dev_set_draw ('margin')  2 dev_set_line_width (3)  3 set_display_font (200000, 22, 'Courier', 'true', 'false')  4 
 5 read_image (Image, 'SortCodes')  6 create_data_code_2d_model ('QR Code', 'default_parameters', 'enhanced_recognition', DataCodeHandleQR)  7 
 8 *'stop_after_result_num', 10:意思是最大可找到10個碼,如果不設置該參數,那么只會找到一個碼  9 find_data_code_2d (Image, SymbolXLDs, DataCodeHandleQR, 'stop_after_result_num', 10, ResultHandles, SourceStrings) 10 sort_objects_strings (SymbolXLDs, SymbolXLDsSort, SourceStrings, 'xld', 'row1', SortedStrings) 11 
12 dev_display (Image) 13 for Index := 0 to |SourceStrings|-1 by 1
14     select_obj (SymbolXLDsSort, ObjectSelected, Index + 1) 15  dev_display (ObjectSelected) 16  area_center_xld (ObjectSelected, Area, Row, Column, PointOrder) 17     disp_message (200000, (Index + 1) + '' + SortedStrings[Index], 'image', Row, Column-50, 'black', 'true') 18 endfor 19 
20 clear_data_code_2d_model (DataCodeHandleQR)

 

① 按'row1'規格排序,效果圖為:

 

 

② 按'row'規格排序,效果圖為:

 

 

③ 按'column1'規格排序,效果圖為:

 

 

④ 按'column'規格排序,效果圖為:

 

請讀者朋友們自己觀察一下這四種效果圖,體會一下'row1'、'row'、'column1'、'column'這四種排序規則的區別。

 

值得說明的是:這種排序算法是通用的,它不僅僅局限解碼項目中的數據處理,其他類似的排序需求,也是可以用的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM