以Halcon為例,一般解碼的步驟為:創建解碼模型——設置解碼參數——執行解碼——清除模型回收內存。如下所示:
1 create_bar_code_model ([], [], BarCodeHandle) 2 set_bar_code_param (BarCodeHandle, 'num_scanlines', 30) 3 find_bar_code (Image, SymbolRegions1, BarCodeHandle, ['Code 128','Code 39'], BarCodeStrings) 4 clear_bar_code_model (BarCodeHandle)
我們一般會在“設置解碼參數”這個步驟里面做文章。例如設置多個參數,以達到解碼成功率高且解碼速度快的目的。這個只是常規思路,我今天並不想講這個,而且這種思路有局限:有時候無論你參數設置得多么合理,就是死活解不出來碼。
不知大家有沒有這樣的體驗:生活中我們經常用手機去掃二維碼,有時候我們第一次掃不上,但是變動手機位置或者打開閃光燈重復掃,最終基本都能掃出來(解碼成功)。
我分析的原因如下:
質量高的碼Halcon解碼一般僅需幾毫秒,日常生活中手機解碼如果需要一秒左右,那可以推測其實手機是用了多次解碼的方式,一次不成功再來一次,因為手機可以多次對焦曝光拍照用於解碼,並且可以變換手機的位置來解碼。由於單次解碼時間很短,因此就算是多次解碼,手機掃碼看起來也像是一次性成功的。
用Halcon解碼時,對於難解的碼我們可以用類似思路:一次不成,再換個解碼參數再解一次;或者改變相機曝光重新拍一張,再解一次。(變換工業相機位置拍攝不太現實,不考慮)
按此思路,Halcon編寫的解碼示例代碼如下:(只貼出了關鍵部分)
1 Length := 0 2 DecodedDataStrings := [] 3 for min_gray := 0 to 30 by 3 4 for max_gray := 255 to 180 by -7 5 *色階映射,增強圖像對比度 6 scale_gray_map (Image, Image2, min_gray, max_gray) 7 find_data_code_2d (Image2, SymbolXLDs, hv_DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings) 8 tuple_strlen (DecodedDataStrings, Length) 9 *字符串大於5應該就是解出來了,當然這里只是簡單判斷 10 if (Length > 5) 11 break 12 endif 13 endfor 14 15 if (Length > 5) 16 break 17 endif 18 endfor 19 20 disp_message (3600, '解碼結果:' + DecodedDataStrings , 'image', 100, 12, 'black', 'true')
我設計了兩層for循環,逐漸提高圖片Image的對比度,然后在新圖Image2上解碼。
注意:兩層for循環的步長不宜過小(我設計的步長分別是3和-7),不然循環的次數太多,速度太慢。
至於函數scale_gray_map (Image, Image2, min_gray, max_gray) 是一個根據色階映射增強圖像對比度的函數,實現方式參考:https://www.cnblogs.com/xh6300/p/7512532.html
示例代碼中是通過模擬不同曝光的思路提高解碼成功率,當然也可以選擇在解不出來時通過set_data_code_2d_param重新設置新的解碼參數的思路來提高解碼成功率。