Halcon的一维码和二维码解码步骤和技巧
Halcon的一維條碼解碼步驟和解碼技巧
一、圖像預(yù)處理和條碼增強(qiáng)
對(duì)比度太低:scale_image(或使用外部程序scale_image_range),增強(qiáng)圖像的對(duì)比度。
圖像模糊:emphasize銳化圖像,使條碼看起來更清晰。
深色背景上讀取淺色條碼:invert_image反轉(zhuǎn)圖像。
二、解碼涉及的主要算子
read_image :讀圖
create_bar_code_model :創(chuàng)建條碼模型
find_bar_code :查找條碼
clear_bar_code_model :清除條碼模型
如果條碼非常簡(jiǎn)單,那么順次執(zhí)行上面4個(gè)算子就可以完成解碼了。另外還有幾個(gè)算子也很重要:
set_bar_code_param :設(shè)置解碼時(shí)的參數(shù)
decode_bar_code_rectangle2 :在指定的矩形區(qū)域內(nèi)解碼
get_bar_code_param :獲取解碼時(shí)的參數(shù)(如果沒有設(shè)置過,則獲得的是默認(rèn)值)
get_bar_code_result :獲得解碼后的結(jié)果,例如可以獲得條碼的類型(Code 128、Code 39等等)
get_bar_code_object :獲得解碼時(shí)的一些對(duì)象,例如可以獲得解碼后的條碼區(qū)域
三、提高解碼能力的其他措施
如果條碼圖像預(yù)處理以后,仍舊解碼困難或者解碼率不高,那么可以通過以下措施進(jìn)一步提高解碼能力:
1、如果整張圖信息太多,則可以先把條碼區(qū)域挖出來,使用reduce_domain和crop_domain算子,這樣不僅可以降低解碼難度,還可以減少解碼時(shí)間。也可使用decode_bar_code_rectangle2在指定的矩形區(qū)域內(nèi)解碼。
2、可以嘗試把條碼圖像轉(zhuǎn)正再解碼。(這種操作未經(jīng)嚴(yán)格驗(yàn)證,不知道是否可以有效提高解碼率)
3、當(dāng)條碼很密或者很小的時(shí)候,可以嘗試用zoom_image_factor放大了條碼圖像。
4、find_bar_code中將“CodeType”設(shè)置為“auto”可以讀取多種類型的條碼,但是會(huì)增加運(yùn)行時(shí)間,且可能會(huì)降低解碼的可靠性。最好只掃描預(yù)知的條形碼類型。
5、如果對(duì)于質(zhì)量很差的條碼,可以模擬日常手機(jī)掃碼時(shí)的操作,即多次改變曝光,多次解碼的方式,參考文章:
https://www.cnblogs.com/xh6300/p/9809692.html
6、通過set_bar_code_param算子設(shè)置解碼時(shí)的參數(shù),可以有效提高解碼能力。(見下文)
四、set_bar_code_param算子的參數(shù)解析
| 'element_size_min' | 條碼的最小尺寸,指條碼寬度和間距,大碼應(yīng)設(shè)大一點(diǎn),減少處理時(shí)間 |
| 'element_size_max' | 條碼的最大尺寸,不能過小也不能過大 |
| 'check_char' | 是否驗(yàn)證校驗(yàn)位,'absent'不檢查校驗(yàn)和,'present'檢查校驗(yàn)和 |
| 'persistence' | 設(shè)置為1,則會(huì)保留中間結(jié)果,評(píng)估條碼印刷質(zhì)量時(shí)會(huì)用到 |
| 'num_scanlines' | 解碼時(shí)所用掃描線的最大數(shù)目,設(shè)置為0表示自動(dòng)確定,一般設(shè)置為2-30 |
| 'start_stop_tolerance' | 容許誤差值,可設(shè)置為'low'或者'high',設(shè)置為'high'可能造成誤判 |
| 'orientation'、'orientation_tol' | 分別指條碼的方向和方向容差,設(shè)置準(zhǔn)確可大大提高解碼效率 |
| 'element_height_min' | 條碼的最小高度,默認(rèn)值-1表示自動(dòng)推測(cè)條碼高度,該參數(shù)對(duì)速度影響大 |
| 'stop_after_result_num' | 設(shè)置要解碼的個(gè)數(shù),0表示全部找出,設(shè)置為2表示找到2個(gè)就不找了 |
?
一維碼掃描示例代碼
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])*優(yōu)化條碼圖像emphasize (Image, Image, 3, 3, 1)scale_image_range (Image, ImageScaled, 30, 220)*創(chuàng)建條碼模型create_bar_code_model ([], [], BarCodeHandle)*設(shè)置解碼參數(shù)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,漏掉了一個(gè)碼 * 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掃描結(jié)果
?
?
Halcon的二維碼解碼步驟和解碼技巧
一、二維碼簡(jiǎn)介
1 . 類型多樣,常見的有QR Code二維碼、 Data Matrix二維碼等。
2.高密度編碼,信息容量大。
3.容錯(cuò)能力強(qiáng),具有糾錯(cuò)功能:二維碼因穿孔、污損等引起局部損壞時(shí),照樣可以正確得到識(shí)讀,損毀面積達(dá)50%仍可恢復(fù)信息。?
4.譯碼可靠性高:它比普通條碼譯碼錯(cuò)誤率百萬分之二要低得多,誤碼率不超過千萬分之一。?
5.可引入加密措施:保密性、防偽性好。?
二、圖像預(yù)處理和二維碼增強(qiáng)
對(duì)比度太低:scale_image(或使用外部程序scale_image_range),增強(qiáng)圖像的對(duì)比度。
圖像模糊:emphasize銳化圖像,使二維碼看起來更清晰。
三、解碼涉及的主要算子
read_image :讀圖
create_data_code_2d_model :創(chuàng)建二維碼模型
find_data_code_2d :查找二維碼
clear_data_code_2d_model :清除二維碼模型
還有幾個(gè)算子也值得注意一下:
set_data_code_2d_param :設(shè)置解碼時(shí)的參數(shù)
get_data_code_2d_param :獲取解碼時(shí)的參數(shù)(如果沒有設(shè)置過,則獲得的是默認(rèn)值)
get_data_code_2d_results :獲得解碼后的一些結(jié)果
四、提高解碼能力的其他措施
如果二維碼圖像預(yù)處理以后,仍舊解碼困難或者解碼率不高,那么可以通過以下措施進(jìn)一步提高解碼能力:
1、如果整張圖信息太多,則可以先把二維碼區(qū)域挖出來,使用reduce_domain和crop_domain算子,這樣不僅可以降低解碼難度,還可以減少解碼時(shí)間。
2、當(dāng)二維碼很小的時(shí)候,可以嘗試用zoom_image_factor放大了二維碼圖像。
3、create_data_code_2d_model ('QR Code', [], [], DataCodeHandleQR)
創(chuàng)建模型時(shí),[ ]中不填內(nèi)容,實(shí)際默認(rèn)屬性名是‘default_parameters’,默認(rèn)屬性值是‘standard_recognition’。
如果想大幅度提高解碼成功率,可以將屬性值置為‘enhanced_recognition’或者‘maximum_recognition’。注意:解碼能力越強(qiáng),解碼時(shí)間越長(zhǎng)。
4、find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, 'train', 'all', ResultHandles, DecodedDataStrings)?
該算子中的GenParamNames、GenParamValues默認(rèn)是空的,就是說直接找,找不到拉倒。如果是'train',就是一面找一面調(diào)整模板參數(shù)。
默認(rèn)情況下,它只會(huì)最多找到1個(gè)二維碼。如果想找出更多的二維碼(例如3個(gè)),可以這樣:
find_data_code_2d (Image2, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 3, ResultHandles, DecodedDataStrings)
5、如果對(duì)于質(zhì)量很差的二維碼,可以模擬日常手機(jī)掃碼時(shí)的操作,即多次改變曝光,多次解碼的方式,參考文章:
https://www.cnblogs.com/xh6300/p/9809692.html
6、通過set_data_code_2d_param算子設(shè)置解碼時(shí)的參數(shù),可以有效提高解碼能力。(見下文)
五、set_data_code_2d_param算子的參數(shù)解析
| 'default_parameters' | ‘standard_recognition’、‘enhanced_recognition’、‘maximum_recognition’ |
| 'timeout' | 延遲時(shí)間,超過這個(gè)時(shí)間還沒找到就不找了 |
| 'polarity' | 極性,可設(shè)置'dark_on_light'(白色背景黑碼)或者'light_on_dark' |
| 'module_size_min' | 最小碼粒像素大小,碼粒大小指的二維碼中矩形顆粒的寬度(存疑) |
| 'module_size_max' | 最大碼粒像素大小 |
?
?
二維碼掃描示例代碼
*輸入?yún)?shù): *coding:='utf8' 編碼 *path:=圖片路徑 *timeOut:=超時(shí)時(shí)間 *count:=檢測(cè)數(shù)量 *輸出參數(shù): *EmptyObject XLD輪廓 *Runtime 耗時(shí) *type_and_data 類型與數(shù)據(jù)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'] *創(chuàng)建二維碼數(shù)據(jù)class模型 count_seconds (T1)create_data_code_2d_model ('QR Code','default_parameters', 'maximum_recognition',DataCodeHandle)*設(shè)置超時(shí)時(shí)間 set_data_code_2d_param (DataCodeHandle, 'timeout', timeOut)*因?yàn)槟承┒S碼模型沒有這個(gè)屬性,會(huì)報(bào)錯(cuò)所以try以下 try*set_data_code_2d_param (DataCodeHandle, 'strict_quiet_zone', 'yes') catch (Exception)endtry *開始識(shí)別 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*存數(shù)據(jù)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*清除識(shí)別緩存 clear_data_code_2d_model(DataCodeHandle) count_seconds (T2) Runtime:=T2-T1 return ()掃碼結(jié)果:
?
總結(jié)
以上是生活随笔為你收集整理的Halcon的一维码和二维码解码步骤和技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单个项目管理过程
- 下一篇: 刘强东案章泽天首发声;科大讯飞回应 AI