機器視覺中提高解碼成功率的思路分析


以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重新設置新的解碼參數的思路來提高解碼成功率。

 


免責聲明!

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



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