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

以Halcon爲例,通常解碼的步驟爲:建立解碼模型——設置解碼參數——執行解碼——清除模型回收內存。以下所示:html

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)

 

咱們通常會在「設置解碼參數」這個步驟裏面作文章。例如設置多個參數,以達到解碼成功率高且解碼速度快的目的。這個只是常規思路,我今天並不想講這個,並且這種思路有侷限:有時候不管你參數設置得多麼合理,就是死活解不出來碼。函數

 

不知你們有沒有這樣的體驗:生活中咱們常常用手機去掃二維碼,有時候咱們第一次掃不上,可是變更手機位置或者打開閃光燈重複掃,最終基本都能掃出來(解碼成功)。spa

 

我分析的緣由以下:設計

質量高的碼Halcon解碼通常僅需幾毫秒,平常生活中手機解碼若是須要一秒左右,那能夠推測其實手機是用了屢次解碼的方式,一次不成功再來一次,由於手機能夠屢次對焦曝光拍照用於解碼,而且能夠變換手機的位置來解碼。因爲單次解碼時間很短,所以就算是屢次解碼,手機掃碼看起來也像是一次性成功的。code


用Halcon解碼時,對於難解的碼咱們能夠用相似思路:一次不成,再換個解碼參數再解一次;或者改變相機曝光從新拍一張,再解一次。(變換工業相機位置拍攝不太現實,不考慮)htm

 

按此思路,Halcon編寫的解碼示例代碼以下:(只貼出了關鍵部分)blog

 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) 是一個根據色階映射加強圖像對比度的函數,實現方式參考:http://www.javashuo.com/article/p-xbggjchv-he.html字符串

 

示例代碼中是經過模擬不一樣曝光的思路提升解碼成功率,固然也能夠選擇在解不出來時經過set_data_code_2d_param從新設置新的解碼參數的思路來提升解碼成功率。

相關文章
相關標籤/搜索