Halcon的一维码和二维码解码步骤和技巧
Halcon的一維條碼解碼步驟和解碼技巧
一、圖像預處理和條碼增強
對比度太低:scale_image(或使用外部程序scale_image_range),增強圖像的對比度。
圖像模糊:emphasize銳化圖像,使條碼看起來更清晰。
深色背景上讀取淺色條碼:invert_image反轉圖像。
二、解碼涉及的主要算子
read_image :讀圖
create_bar_code_model :創建條碼模型
find_bar_code :查找條碼
clear_bar_code_model :清除條碼模型
如果條碼非常簡單,那么順次執行上面4個算子就可以完成解碼了。另外還有幾個算子也很重要:
set_bar_code_param :設置解碼時的參數
decode_bar_code_rectangle2 :在指定的矩形區域內解碼
get_bar_code_param :獲取解碼時的參數(如果沒有設置過,則獲得的是默認值)
get_bar_code_result :獲得解碼后的結果,例如可以獲得條碼的類型(Code 128、Code 39等等)
get_bar_code_object :獲得解碼時的一些對象,例如可以獲得解碼后的條碼區域
三、提高解碼能力的其他措施
如果條碼圖像預處理以后,仍舊解碼困難或者解碼率不高,那么可以通過以下措施進一步提高解碼能力:
1、如果整張圖信息太多,則可以先把條碼區域挖出來,使用reduce_domain和crop_domain算子,這樣不僅可以降低解碼難度,還可以減少解碼時間。也可使用decode_bar_code_rectangle2在指定的矩形區域內解碼。
2、可以嘗試把條碼圖像轉正再解碼。(這種操作未經嚴格驗證,不知道是否可以有效提高解碼率)
3、當條碼很密或者很小的時候,可以嘗試用zoom_image_factor放大了條碼圖像。
4、find_bar_code中將“CodeType”設置為“auto”可以讀取多種類型的條碼,但是會增加運行時間,且可能會降低解碼的可靠性。最好只掃描預知的條形碼類型。
5、如果對于質量很差的條碼,可以模擬日常手機掃碼時的操作,即多次改變曝光,多次解碼的方式,參考文章:
https://www.cnblogs.com/xh6300/p/9809692.html
6、通過set_bar_code_param算子設置解碼時的參數,可以有效提高解碼能力。(見下文)
四、set_bar_code_param算子的參數解析
| 'element_size_min' | 條碼的最小尺寸,指條碼寬度和間距,大碼應設大一點,減少處理時間 |
| 'element_size_max' | 條碼的最大尺寸,不能過小也不能過大 |
| 'check_char' | 是否驗證校驗位,'absent'不檢查校驗和,'present'檢查校驗和 |
| 'persistence' | 設置為1,則會保留中間結果,評估條碼印刷質量時會用到 |
| 'num_scanlines' | 解碼時所用掃描線的最大數目,設置為0表示自動確定,一般設置為2-30 |
| 'start_stop_tolerance' | 容許誤差值,可設置為'low'或者'high',設置為'high'可能造成誤判 |
| 'orientation'、'orientation_tol' | 分別指條碼的方向和方向容差,設置準確可大大提高解碼效率 |
| 'element_height_min' | 條碼的最小高度,默認值-1表示自動推測條碼高度,該參數對速度影響大 |
| 'stop_after_result_num' | 設置要解碼的個數,0表示全部找出,設置為2表示找到2個就不找了 |
?
一維碼掃描示例代碼
dev_set_draw ('margin') dev_set_line_width (2)path := 'BarCode'dev_open_window (0, 0, 500, 500, 'black', WindowHandle)list_files (path, ['files','follow_links'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])*優化條碼圖像emphasize (Image, Image, 3, 3, 1)scale_image_range (Image, ImageScaled, 30, 220)*創建條碼模型create_bar_code_model ([], [], BarCodeHandle)*設置解碼參數set_bar_code_param (BarCodeHandle, 'element_size_min', 4)set_bar_code_param (BarCodeHandle, 'element_size_max',32)set_bar_code_param (BarCodeHandle,'check_char','present')set_bar_code_param (BarCodeHandle, 'persistence', 1)set_bar_code_param (BarCodeHandle, 'num_scanlines', 10)set_bar_code_param (BarCodeHandle, 'start_stop_tolerance', 'high')set_bar_code_param (BarCodeHandle, 'orientation', 0)set_bar_code_param (BarCodeHandle, 'orientation_tol', 20)set_bar_code_param (BarCodeHandle, 'element_height_min', 100)set_bar_code_param (BarCodeHandle, 'stop_after_result_num', 0)*解碼**decode_bar_code_rectangle2的解碼能力似乎不如find_bar_code,漏掉了一個碼 * smallest_rectangle2 (Rectangle, Row1, Column1, Phi, Length1, Length2) * decode_bar_code_rectangle2 (Image, BarCodeHandle, ['Code 128','Code 39'], Row1, Column1, Phi, Length1, Length2, DecodedDataStrings)* ['Code 128','Code 39']這么寫表示既可以解128碼,也可以解39碼find_bar_code (Image, SymbolRegions1, BarCodeHandle, ['Code 128','Code 39'], BarCodeStrings)get_bar_code_param (BarCodeHandle, 'element_size_min', GenParamValues)get_bar_code_object (BarCodeObjects, BarCodeHandle, 'all', 'symbol_regions')get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)get_bar_code_result (BarCodeHandle, 0, 'quality_isoiec15416', Quality)disp_message (WindowHandle, BarCodeResults + '碼:' + BarCodeStrings, 'image', 20, 20, 'black', 'true')*清除條碼模型clear_bar_code_model (BarCodeHandle)stop () endfor掃描結果
?
?
Halcon的二維碼解碼步驟和解碼技巧
一、二維碼簡介
1 . 類型多樣,常見的有QR Code二維碼、 Data Matrix二維碼等。
2.高密度編碼,信息容量大。
3.容錯能力強,具有糾錯功能:二維碼因穿孔、污損等引起局部損壞時,照樣可以正確得到識讀,損毀面積達50%仍可恢復信息。?
4.譯碼可靠性高:它比普通條碼譯碼錯誤率百萬分之二要低得多,誤碼率不超過千萬分之一。?
5.可引入加密措施:保密性、防偽性好。?
二、圖像預處理和二維碼增強
對比度太低:scale_image(或使用外部程序scale_image_range),增強圖像的對比度。
圖像模糊:emphasize銳化圖像,使二維碼看起來更清晰。
三、解碼涉及的主要算子
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' | 最大碼粒像素大小 |
?
?
二維碼掃描示例代碼
*輸入參數: *coding:='utf8' 編碼 *path:=圖片路徑 *timeOut:=超時時間 *count:=檢測數量 *輸出參數: *EmptyObject XLD輪廓 *Runtime 耗時 *type_and_data 類型與數據coding:='utf8' path := 'H:/kevin/halcon_workspace/CodeData/image/QRCode/image7' timeOut := 0 count :=100 scal := 1 type_and_data:=[] num:=0 gen_empty_obj (EmptyObject) set_system ('filename_encoding', coding) read_image (Image, path)get_image_size(Image, Width, Height)dev_open_window (0, 0, Width, Height, 'black', WindowHandle)zoom_image_factor(Image,ZoomImage,0.125,0.125,'bilinear') rgb1_to_gray (ZoomImage, GrayImage)dev_display (GrayImage)min_max_gray (GrayImage, GrayImage, 0, Min, Max, Range) Mult := 255.0 / (Max - Min) Add := -Mult * Min scale_image (GrayImage, GrayImage1, Mult, Add) dev_display (GrayImage1) stop()_codeMode:=['Aztec Code', 'Data Matrix ECC 200', 'GS1 Aztec Code', 'GS1 DataMatrix', 'GS1 QR Code', 'Micro QR Code', 'PDF417', 'QR Code'] *創建二維碼數據class模型 count_seconds (T1)create_data_code_2d_model ('QR Code','default_parameters', 'maximum_recognition',DataCodeHandle)*設置超時時間 set_data_code_2d_param (DataCodeHandle, 'timeout', timeOut)*因為某些二維碼模型沒有這個屬性,會報錯所以try以下 try*set_data_code_2d_param (DataCodeHandle, 'strict_quiet_zone', 'yes') catch (Exception)endtry *開始識別 find_data_code_2d (GrayImage,SymbolXLDs,DataCodeHandle, 'stop_after_result_num', count,ResultHandles, DecodedDataStrings) dev_display (Image) dev_display (SymbolXLDs) count_obj (SymbolXLDs, Number) if (Number)*存類型type_and_data[num]:= 'QR Code'num:=num+1for j := 0 to Number-1 by 1*存數據type_and_data[num]:=DecodedDataStrings[j]num:=num+1select_obj (SymbolXLDs, ObjectSelected, j+1)get_contour_xld (ObjectSelected, Row, Col)set_tposition(WindowHandle,(Row[0]-10),Col[0])write_string (WindowHandle, DecodedDataStrings[j])*保存XLD輪廓concat_obj (EmptyObject, ObjectSelected, EmptyObject)endfor endif*清除識別緩存 clear_data_code_2d_model(DataCodeHandle) count_seconds (T2) Runtime:=T2-T1 return ()掃碼結果:
?
總結
以上是生活随笔為你收集整理的Halcon的一维码和二维码解码步骤和技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单个项目管理过程
- 下一篇: Pat乙级1011题:A+B和C